C语言
文章平均质量分 90
嵌入式软件实战派
我有一公众号:嵌入式软件实战派,透解各种疑惑。
展开
-
FreeRTOS的Heap1~Heap5有什么区别
熬夜研究RTOS,终于约到妹子了……原创 2022-09-26 22:03:08 · 1796 阅读 · 3 评论 -
C99的新特性
让各大嵌入式编译器坚守的C99,有啥特点。原创 2022-03-28 19:32:15 · 1179 阅读 · 0 评论 -
C语言宏定义中的迷惑行为
以下这段代码运行后输出什么结果?#define f(a,b) a##b #define g(a) #a #define h(a) g(a) printf("h(f(1,2))-> %s, g(f(1,2))-> %s\n", h(f(1,2)), g(f(1,2)));原创 2021-10-07 12:30:39 · 328 阅读 · 2 评论 -
C语言的奇技淫巧(1-50)
01. 宏定义用do{}while(0)如果定义的宏函数后面有多条语句,使用这样的方式会有问题:#define FUNC() func1(); func2()if(bRunF) FUNC();展开宏定义后会变成:if(bRunF) func1(); func2();逻辑就不对了。可以用这一的方式解决,非常好用:#define FUNC() do{func1(); func2();}while(0)02. 数组的初始化假如给arr的第2~6元素初始化为5,也原创 2021-06-03 20:32:34 · 8880 阅读 · 33 评论 -
if-else和switch-case的正确姿势
美国大选中的if-else看最近的新闻,我很好奇,如果用if-else来表达美国大选那些事,你有哪些想法?if(bTrumpWin){ // balabala...}else{ // balabala...}也没啥毛病,简单地就是这种方式。if(bBidenWin){ // balabala...}else{ // balabala...}是不是一样的?是的,就他们俩竞选。想想,bTrumpWin和bBidenWin是bool变量来的,也就原创 2020-11-21 21:43:04 · 1032 阅读 · 0 评论 -
软件开发相关书籍看这些就够了
本文分享以下软件开发类的书籍,附带PDF下载,但我建议你看纸质书。以下是部分截图,有需要的拿走不谢。(请到文末获得资源下载方式,下载不了的请留言,限免7日)C/C++类1. C++ Primer第五版久负盛名的经典,学习C++必备,里面还特意标注了C++ 11的新特性,知识非常全面,几乎涵盖C++所有特性,而且通俗易懂。英文电子版的还带各种很方便的超链接,想提高英语水平,坚持看看这个。同类型的,还有《C Primer》和《C Primer Plus》等。2. ...原创 2020-11-07 16:00:36 · 5010 阅读 · 7 评论 -
玩转Hex文件
手把手教你玩转Hex文件原创 2020-10-18 19:41:58 · 2956 阅读 · 3 评论 -
宏定义X-MACRO的高级应用(高阶版)
1. 结构体序列化问题通常情况下,对于模块或者设备之间通信,往往是以字节流的方式来传输,而模块内部却要将这些字节流按某种数据结构来处理。这就存在,如何将数据结构(结构体)转换(序列化)成字节流,已经如何将字节流转换(反序列化)成数据结构的方法。这不是很简单么?tStrcut s;unsigned char buff[100];memcpy(buff, &s, sizeof(s)); // serialmemcpy(%s, buff, sizeof(s)); // de-serial似原创 2020-09-26 19:13:04 · 2667 阅读 · 3 评论 -
手把手教你用VS Code仿真调试C/C++代码
手把手教你用VS Code仿真调试C/C++代码原创 2020-09-26 08:49:25 · 3811 阅读 · 1 评论 -
宏的高级应用——X-MACRO
使用switch-case/if-else对于条件/分支处理的程序设计,我们惯性地会选择switch-case或者if-else,这也是C语言老师当初教的。以下,我们用一个播放器的例子来说明,要实现的功能如下:收到用户操作播放器命令请求,如“播放”、“暂停”等,程序要对命令作区分;针对不同的命令请求,作相应的处理;输出必要的辅助信息。首先,将命令定义成enum类型:enum { CMD_PLAY, CMD_PAUSE, CMD_STOP, CMD_PLAY原创 2020-09-13 15:23:26 · 3186 阅读 · 1 评论 -
妹子说OS的时间不准?
本文来源于微信公众号:嵌入式软件实战派妹子又发现问题了自从上次给妹子详尽地讲了一个晚上的《我给妹子讲了一晚上的RTOS Task的原理》后,她好久没特意找我给她讲解RTOS的知识了。我估摸着她以及基本掌握RTOS的相关原理了。老大给她安排的项目,她也渐渐上手了,当然偶尔她还会向我请教项目上的问题,我也很乐意给她讲解。过了一段时间,她突然又来戳了下我的肩膀,说话还是有些客气:“师兄师兄,我在项目遇到了个奇怪的问题……”没等她问完,我就笑着问她是什么问题。“我发现OS的时间不准。是这样的原创 2020-08-16 21:56:57 · 684 阅读 · 2 评论 -
我给妹子讲了一晚上的RTOS Task的原理
本文首发于公众号“嵌入式软件实战派”,关注获得更多精品。师兄,不好意思,又打扰你一下。”此时的我刚解了一个bug,正闭目养神缓解一下疲惫的精神。听到妹子在叫我,忽然又精神百倍了。“没事,你说。”“自从你上次给我讲解了RTOS的一些概念原理,我没那么困惑了,我也查阅了很多资料,但是我还有些关于'Task'的疑问……”“找个时间我再给你详细讲解下吧。”热情的我没等她说完我就答应她了。于是,我约她在晚上……我当时又恰恰只有晚上比较有空(我真不是故意的)。顺着上次没讲完的问题点(见.原创 2020-08-04 22:32:48 · 2111 阅读 · 0 评论 -
我在马路上遇到一个死锁问题
本文首发于公众号“嵌入式软件实战派”。▍马路上的死锁问题我在市里的老区马路上遇到堵车了,动弹不得,后来发现是个“死锁”问题。当时我坐在③号车里,等了好久,忽然职业病犯了,好想下车跟他们讲解下发生了什么,“死锁”是怎么造成的,如何避免……简要情况,见下图,原因是右上方的小路一次只能通过一个方向的车,大路上红色的车可能因为没找到车位,随便停路边了,导致图中①、②、③、④、⑤号车动弹不得。实际上,在拥堵的马路,如果没有交通指示的话,很容易造成类似这种“死锁”。如下图这种情形。除了交原创 2020-07-08 23:20:51 · 925 阅读 · 0 评论 -
CRC8/CRC16/CRC32最全总结
CRC8/CRC16/CRC32最总结本文首发于“嵌入式软件实战派”。循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。Wikipedia一句话:CRC是将数据计算出散列的方式,一般用于校验数据的完整性。它具有简单、执行效率高等特点。当然,你可以类比于Checksum,但比Checksum复杂些,防碰撞性更好些。▍CRC的原理原创 2020-07-08 23:08:58 · 22315 阅读 · 3 评论 -
Python和Ruby嵌入C代码的N种方法
注:本文首发于“嵌入式软件实战派”公众号,关注该公众号可获得更多精品干货。▍很懒很操心有一次,我在项目开发中想监控某段空间数据的大小,即这段空间在MCU中非常有限,希望每个版本在集成软件的时候都想获取其使用了多少空间,防止某些愣头青不珍惜内存,乱塞东西。而这段空间,我定义了一个神一样的结构体映射到这个空间,即其他开发人员只要在结构体增加元素即可(我使用洪荒之力将宏定义发挥到淋漓尽致才做到的,至于怎么实现的细节就不在这个文章讨论了,后续再写篇文章装装X)。计算这个结构体空间,要求: 在软件集原创 2020-06-25 10:54:29 · 630 阅读 · 0 评论 -
SREC、Hex、Bin等烧录文件格式完全解读
注:本文首发于“嵌入式软件实战派”公众号,关注该公众号可获得更多精品干货。▍1. 关于烧录文件在典型的应用程序中,编译器或汇编器将程序的源代码(例如C或汇编语言)转换为机器代码,并将其输出到一个文件中。然后,这个文件由程序员导入,以将机器代码“烧录”到ROM(或Flash Memory)中,或传输到目标系统以进行加载和执行。这个存放机器码的文件就是烧录文件,它是用来烧录到微控制器(如MCU、EEPROM、NOR/NAND Flash等)里面的flash memory里面的一个程序文件。烧录文件可原创 2020-06-25 10:43:29 · 26472 阅读 · 1 评论 -
C语言的奇技淫巧之三
21. 行控制#line也许你知道用__LINE__可以输出行号,然而你试下这个: #line 12345 "abcdefg.xxxxx" printf("%s line: %d\n", __FILE__, __LINE__); printf("%s line: %d\n", __FILE__, __LINE__);不单止行号被改了,文件名也被改了,是不是我们可以用这个干点啥……想想?22. C和C++代码混合编译在C的头文件上面#ifdef __cplusplusext原创 2020-06-25 10:36:32 · 519 阅读 · 0 评论 -
一文讲透C语言结构体内存对齐
本文首发于公众号:嵌入式软件实战派(以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解。)面试官:你知道C语言的结构体对齐吗?应聘者:听说过……平时很少关注……面试官:好吧,那回去等通知吧C语言结构体对齐问题,是面试必备问题。本文,除了用图解的方式讲清楚结构体知识点外,还将为你解答以下问题: 为什么会有结构体内存对齐? 结构体怎么对齐? 学习结构体对齐有什么用? 结构体对齐有没有实际应用? ▍结构体内...原创 2020-06-11 23:09:47 · 897 阅读 · 0 评论 -
C语言的奇技淫巧之二
本文首发于公众号:嵌入式软件实战派11. 用异或运算实现数据交换交换俩变量数据,一般做法是:// 方法1temp = a;a = b;b = temp;// 方法2a=a+b;b=a-b;a=a-b;方法1需要第三个变量,方法二存在数据溢出可能,可以尝试下以下方法:a = a ^ b;b = a ^ b;a = a ^ b;12. 判断语句中把const数值放在前面通常条件语句写成if(n == 0){ /*...*/ }但是,有可能手误写成if(n = 0){原创 2020-06-11 22:51:44 · 471 阅读 · 0 评论 -
C语言的奇技淫巧之一
本文首发于公众号:嵌入式软件实战派01. 宏定义用do{}while(0)如果定义的宏函数后面有多条语句,使用这样的方式会有问题:#define FUNC() func1(); func2()if(bRunF) FUNC();展开宏定义后会变成:if(bRunF) func1(); func2();逻辑就不对了。可以用这一的方式解决,非常好用:#define FUNC() do{func1(); func2();}while(0)02. 数组的初始化假如原创 2020-06-11 22:48:00 · 619 阅读 · 0 评论 -
图解数据结构——栈(Stack)与队列(Queue)
数据结构身为程序猿或者攻城狮,你肯定知道数据结构这个东西的。而数据结构却有好几种类型,我简单罗列下: 数组(Array) 栈(Stack) 队列(Queue) 链表(Linked List) 树(Tree) 图(Graph) 堆(Heap) 散列(Hash) 以上,数据结构一般有以下几种常用运算: 检索。检索就是在数据结构里查找满足一定条件的节点。一般是给定一个某字段的值,找具有该字段值的节点。 插.原创 2020-05-29 21:04:03 · 1203 阅读 · 0 评论 -
基于C99规范,最全C语言预处理知识总结
本文是基于C99标准,总结C语言预处理的知识点以及其相关用法和问题剖析。原创 2020-05-24 14:57:53 · 2337 阅读 · 4 评论