嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读

技术阅读

  • VS Code调试C代码

    2024-06-01

      热文  热文

  • C语言史上最愚蠢的BUG

    2024-06-01

    本文来自“The most stupid C bug ever”,很有意思,分享给大家。我相信这样的bug,就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。。首先,作者想用一段程序来创建一个文件,如果有文件名的话,就创建真正的文件,如果没有的话,就调用tmpfile()创建临时文件。他这段程序就是HTTP下载的C程序。code==200就是HTTP的返回码。else if (code == 200) {     // Downloading whole file    /* Write new file (plus allow reading once we finish) */    g = fname ? fopen(fname, "w+") : tmpfile();}但是...

  • 聊聊简单的static关键字

    2024-06-01

    C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的。写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字。01简述static关键字在嵌入式C语言当中很简单,它有三个作用:作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。void test1(void){ unsigned char a; static unsigned char b; … a++; b++;}在这个例子中,变量a是局部变量,变量b为局部静态变量。作用一说明了局部静态变量b的特性:在函数体,一个被声...

  • 深入聊一下const关键字

    2024-06-01

    const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程序上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解别人的程序有所帮助。01const简述下面简单描述一下const,基本都是教科书的知识。const修饰的变量,其值存放在只读数据段中,其值不能被改变。称为只读变量。关于什么是数据段,什么是代码段,请看我之前的文章《》。int const a;const int a;上面两条语句都可以将a声明为一个整数,它的值不能被修改。这两种方式你可以任意选一种即可。常量在定义时可以被初始化。int const a =15;...

  • 推荐3个有趣的注释工具

    2024-06-01

    先看效果1.示意图2.电路板3.原理图4.时序图框图5.链表推荐工具工具1:http://www.jave.de/工具2:原理图这个还有专门的小软件来生成,非常方便:https://josoansi.de/download.php工具3:使用“类似于Visio”的工具在代码中添加和编辑图表:https://josoansi.de/download.php最后,压轴注释参考来源:http://www.armbbs.cn/forum.php?mod=viewthread&tid=97118------------ END ------------

  • 关于结构体中指针的一些探讨

    2024-06-01

    01起因在上篇文章《》中,有读者对下列代码有疑问typedef struct{ char *name; //姓名 int num; //学号 int age; //年龄 float score; //成绩}stuff_s;stuff_s xiaoming;void xiaoming_inf_init(){ xiaoming.name = "xiaoming"; xiaoming.num = 1; xiaoming.age = 18.0; xiaoming.score = 100;}留言到很明显,这位读者意识到了name成员是个指针,在没有对指针分配内存时,就直接复制“xiaoming”字符串,这是错误的。先说下结论,这个是没有问题的,在下文我会详细说明下。02解释首先,实践是检验真理的唯一标准,我们直接在编译器运行...

  • C语言的发展历程

    2024-06-01

    01各个版本详解1、K&RC1978 年,DennisRitchie 和Brian Kernighan 合作推出了《TheC Programming Language》的第一版(按照惯例,经典著作一定有简称,该著作简称为K&R),书末的参考指南(Reference Manual) 一节给出了当时C 语言的完整定义,成为那时C 语言事实上的标准,人们称之为K&R C。从这一年以后,C语言被移植到了各种机型上,并受到了广泛的支持,使C 语言在当时的软件开发中几乎一统天下。2、ANSIC(C89)随着C语言在多个领域的推广、应用,一些新的特性不断被各种编译器实现并添加进来。于是,建立一个新的“无歧义、与具体平台无关的C 语言...

  • C语言在STM32中的内存分配

    2024-06-01

    01前言不说废话,先上示例代码uint8_t num_byte[4];uint32_t num_word;const uint32_t num_word_const = 0x1234;uint32_t *point_heap;int main(void){ uint8_t num_byte_stack; static uint8_t num_byte_static; point_heap = (uint32_t *)malloc(4); *point_heap = 0x3421; free(point_heap); num_byte_stack = 0x11; #pragma section = "CSTACK" char *pbeginstk = __section_begin("CSTACK");#pragma section = "HEAP" char *pbeginheap = __section_begin("HEAP"); printf("CSTACK addr is 0x%x\r\n",pbeginstk); printf(...

  • GD32如何替换STM32?

    2024-06-01

    GD32F103是GD早期的产品,GD32E103和GD32F303是对GD32F103的升级和优化,所以4者是兼容的。虽然内核不同,但是通用外设几乎很少涉及到内核部分,在时间急迫的情况下可以使用ST的库开发。01相同点1)外围引脚PIN TO PIN兼容,每个引脚上的复用功能也完全相同。2)芯片内部寄存器、外部IP寄存器地址和逻辑地址完全相同,但是有些寄存器默认值不同,有些外设模块的设计时序上和STM32有差异,这点差异主要体现在软件上修改,详情见下文。3)编译工具:完全相同,例如KEIL 、IAR。4)型号命名方式完全相同,所以替代只需找尾缀相同的型号即可,例如:STM3...

  • 在大公司天天调参数,感觉快废了

    2024-06-01

    01基础知识    一个嵌入式工程师,很多都是从51单片机或者STM32单片机开始,对于单片机的开发环境,开发流程,基础外设都了解,做过一些实际的案例,比如点流水灯之类的。那么对于基本的中断的概念,寄存器的概念,看门狗,AD等基本原理能大概的讲出来。掌握硬件设计方法,能设计原理图PCB,至少两层板。能画出三极管及MOS管作为开关管的实际应用电路,对电源芯片的设计有基本的了解。能利用网络进行信息检索,能在理解别人图纸的基础上进行copy。    这是一个本科嵌入式毕业生应该具备的水平。项目做的多的同学,可能在某些专业方向有较深的...

  • C语言访问存储器的方法

    2024-06-01

    在单片机中我们经常需要访问某个指定的寄存器或者到指定的RAM地址,在本文为简单描述,下文所说的存储器可指:寄存器,RAM等。01宏定义:定义一个宏,将地址值转化为C指针,然后取这个指针指向的内容,这样就可以访问存储了,代码如下:#define SDA_DIR_REG *(__IO uint32_t *)SDA_MOD_OFFSET分析:(__IOuint32_t *)SDA_MOD_OFFSE    是强制类型转换强制转换为指针*(__IOuint32_t *)SDA_MOD_OFFSET   取这个指针里内容。这是一种很简单实用的方法,对于访问某个寄存器是很长好用的。举例:*(__IOuint16_t *) (((uint32_t)0x60020000) )(((uint32...

  • 小厂面试,恐怖如斯。。。

    2024-06-01

    大家好,今天分享  的一位鱼友面试 Java 开发的面试题记录,虽然是小厂,但题目还是有些难度的,大家可以感受一下,看看自己能答出多少~星球原文链接:https://t.zsxq.com/0cZyVf6J0 本文已获得 hezefeng 同学授权小公司个人面试题记录Java 开发工程师有不同答案,欢迎各位大佬提出!Q1:字符串如何实现反转A1:用StringBuffer或StringBuilder自带的reverse方法。Q2:什么是Java序列化A2:序列化:把Java对象转换为字节序列(二进制流)的过程。为了解决对象流进行读写操作或网络传输时所引发的问题。反序列化:把字节序列(二进制流)恢复为Java对...

  • 从打杂小工,到 Java 开发

    2024-06-01

    不知道有没有小伙伴有这样的情况,刚刚开始工作,什么都不会,很焦虑。这个时候,请不要停止学习提升自己,因为机会是留给有准备的人的。的一位鱼友,他 19 年毕业,刚刚开始也是什么都不会,懵懵懂懂的加入一家创业公司工作,从摆桌子开始做起,后续一边自学提升一边工作,经历过裁员,后面又独自异地出差,最后通过不懈努力,成功进入银行外包且完成转编。星球原文链接:https://t.zsxq.com/0cZUPQvOu本文已获得 yang 同学授权以下是这位鱼友的具体经历:嘿哈嘿哈大家好~,很开心今天加入星球能和大家一起学习、分享。我目前是在银行做开发,主要...

  • 什么是 Git 的 cherry-pick?

    2024-06-01

    大家好呀,今天继续给大家分享一些优质面试题,希望对正在找工作的小伙伴有所帮助。后端题目一什么是 Git 的 cherry-pick?官方解析Git 的 cherry-pick 是一种将指定的提交(commit)应用到当前分支的操作。它可以帮助我们将某个分支上的某次提交复制到另一个分支上,而无需将整个分支合并过来。通常,我们在使用 Git 进行版本控制时,会在不同的分支上进行不同的开发工作。有时候,我们需要将某个分支上的某次提交(commit)应用到当前分支上,这时候就可以使用 cherry-pick 操作。使用 cherry-pick 操作,我们可以复制指定的提交,然后将其应用到...

  • Bean 的生命周期是什么?

    2024-06-01

    大家好呀,今天继续给大家分享一些优质面试题,希望对正在找工作的小伙伴有所帮助。后端题目一讲一讲 Spring 框架中 Bean 的生命周期?官方解析在 Spring 框架中,Bean 的生命周期包括以下几个阶段:实例化(Instantiation):在这个阶段,Spring 将根据配置文件或注解等方式创建 Bean 实例,并将其存储在容器中。属性赋值(Populate Properties):在这个阶段,Spring 将会自动将 Bean 的属性值从配置文件或注解等方式中注入到 Bean 实例中。初始化(Initialization):在这个阶段,Spring 会调用 Bean 实例的 init-method 方法,完成一些初始化的...

  • 什么是 RPC?

    2024-06-01

    大家好呀,今天继续给大家分享一些优质面试题,希望对正在找工作的小伙伴有所帮助。后端题目一什么是 RPC?目前有哪些常见的 RPC 框架?实现 RPC 框架的核心原理是什么?官方解析RPC(Remote Procedure Call)是一种远程调用协议,允许一台计算机通过网络调用另一台计算机上的服务或方法。它可以让开发人员像调用本地方法一样调用远程方法,将网络通信细节封装起来,提高了分布式系统中各个模块之间的耦合性。目前常见的 RPC 框架有:Dubbo:阿里巴巴开源的分布式 RPC 框架,支持多种协议和负载均衡策略。gRPC:Google 开源的高性能 RPC 框架,支持...

  • Redis 的一些内存淘汰策略

    2024-05-31

    大家好呀,今天继续给大家分享一些优质面试题,希望对正在找工作的小伙伴有所帮助。后端题目一MySQL 支持哪些存储引擎?默认使用哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?官方解析MySQL 支持多种存储引擎,包括 InnoDB、MyISAM、MEMORY、CSV 等。默认情况下,MySQL 使用的存储引擎是 InnoDB。MyISAM 和 InnoDB 是 MySQL 中 最常用 的两种存储引擎,它们有以下区别:锁定方式不同:MyISAM 使用表级锁定,而 InnoDB 使用行级锁定。在并发访问时,InnoDB 的锁定方式更加精细,可以避免锁定整个表,提高了并发性能。数据完整性不同:MyISAM 不...

  • 面试被面麻,终于上岸知乎了!

    2024-05-31

    大家好,今天这篇文章是的一路信仰的面试经历分享,希望对正在求职的朋友有所帮助~星球原文链接:https://t.zsxq.com/0b94CJPdY知乎前端日常实习一面(已oc)面试过程面了45分钟左右,面试官评价还可以自我介绍,问之前实习过吗?问两个项目是做什么的?上线后的情况?//直接打开屏幕共享介绍的,上线后的数据统计平台用的 51LA介绍项目是怎么实现的?问网站是自己开发的吗?什么技术栈?会用 react 吗?了解,写过一个小项目介绍第一个项目,聊了项目中的一些功能怎么做的介绍第二个项目,聊了项目中的一些功能怎么做的又问了一遍 react 了解多少?...

  • 你是怎么做 MySQL 数据备份的?

    2024-05-31

    大家好呀,今天继续来给大家分享一些优质面试题,希望对正在求职的小伙伴有所帮助~后端题目一你是怎么做 MySQL 数据备份的?比如怎么恢复半个月前的数据?官方解析MySQL 数据备份是一个非常重要的工作,保证数据的安全性和可靠性。备份数据的方式有很多种,以下是其中一种基本的备份和恢复方式:一、备份 MySQL 数据库我们可以使用 mysqldump 工具来备份 MySQL 数据库,该工具可以生成 SQL 脚本文件,包含数据库中所有表和数据的语句。在终端中运行以下命令:mysqldump -u [username] -p [database_name] > [backup_file].sql其中,[username]...

  • synchronized 是什么,有什么用?

    2024-05-31

    大家好呀,今天是的第十六天,一起来看看今天有哪些优质面试题吧。后端题目一Dubbo 是什么?是否了解过它的架构设计?官方解析Dubbo 是一个高性能、轻量级的开源 Java RPC 框架,它提供了完整的 RPC 协议栈,包括服务发布、服务引用、负载均衡、容错、服务治理和服务监控等功能,同时提供了可扩展的 RPC 协议、数据模型、序列化和网络传输等组件,支持多语言和多协议。Dubbo 的架构设计主要包括服务提供者、服务消费者、注册中心和监控中心四个角色。其中,服务提供者提供服务的实现,并通过注册中心将自己注册到服务治理中心;服务消费者则通过注册...

  • 考研失败,找工作的我上岸了

    2024-05-31

    大家好呀,今天这篇文章是的迷雾同学的求职经验分享:星球原文链接:https://t.zsxq.com/0bLMpL5rW求职经验(软件测试)当前情况:大四学生,考研后找工作,考研失败。目前收到杭州的海康威视的 offer,软件测试。另一家上海做半导体,二次开发 offer。求职分享:1. 树立目标,做计划寒假期间听了鱼皮的关于考研后备战计划安排,并制定学习计划,可能是考研后遗症,就“不敢”让自己闲下来,利用寒假期间,完成,也是凭借着这个项目让我能通过面试,也在面试过程中,有可聊的。2. 培养自信心,让自己的嘴巴不犯懒我有点性格内向,嘴巴还容易犯懒,我...

  • 如何用 Redis 实现一个排行榜?

    2024-05-31

    大家好呀,今天继续给大家分享一些优质面试题,希望对正在找工作的小伙伴有所帮助。后端题目一如何使用 Redis 实现一个排行榜?官方解析使用 Redis 可以很方便地实现一个排行榜,以下是一种实现方法:使用有序集合(Sorted Set)来存储排行榜数据,以用户得分作为分数(score),用户 ID 作为成员(member)。当用户得分改变时,使用 Redis 的 ZADD 命令将用户的分数更新到有序集合中。获取排行榜数据时,使用 Redis 的 ZREVRANGE 命令按分数倒序获取有序集合中的成员。可以使用 Redis 的 ZSCORE 命令获取某个用户的分数,或使用 ZREVRANK 命令获取某个...

  • Redis 为什么这么快?

    2024-05-31

    大家好呀,最近春招开始了,今天给大家分享一些优质面试题及详细解答,希望对正在求职的朋友有所帮助~后端题目一MySQL 事务有哪些隔离级别、分别有什么特点,以及 MySQL 的默认隔离级别是什么?官方解析MySQL 事务有四种隔离级别:读未提交(Read Uncommitted):事务可以读取未提交的数据,可能会读到脏数据,会导致幻读、不可重复读、脏读等问题;读已提交(Read Committed):只能读取已经提交的数据,可以避免脏读问题,但是可能会遇到不可重复读、幻读问题;可重复读(Repeatable Read):保证同一个事务中多次读取同一数据的结果是一致的,避...

  • 编程小白,自学的这一年

    2024-05-31

    大家好,今天这篇文章是的小余同学的年终总结:星球原文链接:https://t.zsxq.com/0baWdCGOG人间总有一两风 吹来十万八千梦|年度总结欢迎来到小余的2023的年度总结一年就这么过去了,此刻回首,去年那个迷茫的我,似乎还在昨天。改变前的回顾2022 年 2 月 13 号是我改变的初始起点,在这个时间点之前,我对编程是一无所知,对电脑的接触仅限于小学玩过 4399 这类游戏,学历大专,专业技术为 0。这是我那个时候的状态,是一个埋没在人堆里的大专生,刚匆匆结束了大一上半学期的实训,那个时候的我,连 vscode 都安装不好,连 HTML 都看不明白,连常用...

  • 从摆烂到上岸,我抓住了机会!

    2024-05-31

    大家好,今天这篇文章是的冷环渊同学的学习经历分享:星球原文链接:https://t.zsxq.com/0bkX3kSED摆烂大概是进 2022 年的六月吧,我成年了一段时间之后,努力了两年提升技术的我似乎是有些累了, 倦了就是那种还能保持学习时长,但是就是无法让知识像之前一样自己流进我的脑子,像是机器一样的学习,记笔记,将代码运行,测试,上线到学习仓库。三点一线的学习生活让我觉得我需要求变,但是这次的求变并不是 给自己灌心灵鸡汤,自己给自己打气这样的,我意识到似乎进入了一个闭环,习惯了每日学习的日子,逐渐不是很能适应随意放松的自己。于是我打...

  • 有了这个项目,我进了大厂!

    2024-05-31

    大家好,今天这篇文章是的 404ERROR 同学的面经分享(已上岸大厂实习):星球原文链接:https://t.zsxq.com/0bngfX6Ll首先,感谢鱼皮大佬的,凭借该项目通过了多个大厂、中厂的面试,最终拿到了某大厂 Java 后端实习生的 offer。在这里分享一下十几场面试下来被问到关于该项目的一些真题,回馈。以下回答都是基于我自己的理解整理的,如果有不准确的地方,希望各位大佬指教,也希望鱼皮大佬能多出几个这样的项目!问题1项目是你自己做的吗?你为什么做这样的一个项目?你做这个项目的背景(初衷)是什么?几乎每次都被问到答:我的初衷是尽可能地帮助和...

  • 我是如何从非科班转到计算机的?

    2024-05-31

    本来今晚没想要写文章,只想一个人听听歌,浏览自己喜欢的网页,看看小说。听着歌就想起了刚刚毕业时的情景,于是就有了这一篇文章。我本科是电子信息科学与技术专业,毕业后在深圳一家公司做嵌入式软件工程师,说是嵌入式软件开发,其实大多数时间打杂,期间做了不少大大小小的杂事。画过PCB,做过电子元器件选型,焊接调试电路板,编写单片机程序,能独立开发过一款产品,从硬件开发到单片机程序开发全部一个人完成。那时的我虽然对电子充满热情,但是心里却一直想着成为一名很牛逼的黑客(不要笑,当时我确实这样想的),于是经常下班后一个人在...

  • android应用程序开发-Intent的使用(二)

    2024-05-31

    在中,我们详细介绍了显式Intent的使用,这次我们详细介绍隐式Intent是如何使用的。一、隐式Intent相比较于显式Intent,隐式Intent就含蓄许多了,它并不明确指出我们想要启动的活动,而是通过设置action和category等一系列抽象的信息,交由操作系统去分析这个Intent并帮我们找出合适的活动启动。从我们知道通过AndroidStudio创建第一个活动的时候AndroidManifest.xml文件<activity>标签下会自动配置<intent-filter>中的内容为:<intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="and...

  • 深度剖析Linux内核链表

    2024-05-31

    01—Linux内核链表详解Linux内核链表是Linux内核最经典的数据结构之一,Linux内核链表最大的优点就是节省内存,对链表的各项操作较快,实现思路耳目一新,而且在Linux内核里频繁使用,比如内存管理和进程调度。链表结点定义struct list_head {    struct list_head *next, *prev;};内核链表初始化#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \    struct list_head name = LIST_HEAD_INIT(name)static inline void INIT_LIST_HEAD(struct list_head *list){    list->next = list;    list...

  • C++ std::lock_guard详解

    2024-05-31

    01—std::lock_guard详解std::lock_guard属于C++11特性,锁管理遵循RAII习语管理资源,锁管理器在构造函数中自动绑定它的互斥体并加锁,在析构函数中解锁,大大减少了死锁的风险。下面我们来看一段代码。#include <iostream>#include <mutex>#include <thread>class Widget{public:    Widget() = default;    ~Widget() = default;    void fun(){        std::lock_guard<std::mutex> lock(lock_);        std::cout << "Widget::fun run" << std::endl;    }private:    std::mutex lock_;};void Te...