裸机思维

其他

C语言语法中匿名的最高境界

//复合型表述注意去掉申明中的数组名,留下的int[2]就是复合型表述的类型名。初始化有数组名的数组可以省略数组的大小,复合型表述也可以省略大小,编译器会自动计算数组当前的元素个数:(int
2022年3月1日
其他

【嵌入式秘术】手把手教你如何劫持RTOS(上)

【说在前面的话】作为一篇严肃的技术文章,我们首先要以最大的善意来看待读者打开这篇文章的动机——肯定是学习目的啦——并在此基础上精确定义“所要实现的功能、目的”、以及“所使用的环境”是怎样的:环境:Cortex-M
2020年10月12日
其他

【为宏正名】什么?我忘了去上“数学必修课”!

【说在前面的话】在前面的文章《【为宏正名】本应写入教科书的“世界设定”》中我们了解到:宏会在预编译阶段被“处理掉”——宏会被逐级展开、其最终代表的字符串会被替换到对应的文本文件中(只不过通常这个文本文件就是".c"文件)——它不仅活不到正式的编译(make)阶段,更无法对程序运行时刻的行为产生丝毫影响。简而言之,通过宏所确定的内容是在编译时刻就固化下来的。很多人都了解这一点,也很擅长使用宏的方式来固化一些常数,比如,教科书中最常见的一个例子是://!
2020年8月3日
其他

一种Cortex-M内核中的精确延时方法(ns级别)

本文介绍一种Cortex-M内核中的精确延时方法前言为什么要学习这种延时的方法?很多时候我们跑操作系统,就一般会占用一个硬件定时器——SysTick,而我们一般操作系统的时钟节拍一般是设置100-1000HZ,也就是1ms——10ms产生一次中断。很多裸机教程使用延时函数又是基于SysTick的,这样一来又难免产生冲突。很多人会说,不是还有定时器吗,定时器的计时是超级精确的。这点我不否认,但是假设,如果一个系统,总是进入定时器中断(10us一次/1us一次/0.5us一次),那整个系统就会经常被打断,线程的进行就没办法很好运行啊。此外还消耗一个硬件定时器资源,一个硬件定时器可能做其他事情呢!对应ST
2020年7月30日
其他

【为宏正名】本应写入教科书的“世界设定”

【说在前面的话】市面上大部分C程序员对宏存在巨大的误解甚至是恐惧,并因此极力避免宏的适度使用,甚至将宏在封装中发挥正确作用的行为视作是对C语言的“背叛”——震惊之余,对于为什么大家会有这种想法的原因,我曾经一度是非常“傲慢的”,这种傲慢与某些人宣称“穷人都是因为懒所以才穷”时所表现出的那种态度并无任何本质不同——然而我错了,在闲暇之余认真看了不少经典的C语言教材后我才意识到:不是读者普遍懒或者轻视教材中有关宏的内容,而是那些对宏来说如同“加法交换律、结合律”一样的基本规则和知识并没有认真且完整的出现在教科书中!这是何等的“呵呵”。这下全都清楚了:为什么大家会那么惧怕宏的使用;定义宏的时候,为什么遇到哪怕很基本的小问题也根本无从下手;为什么那么多人声称系统提供的诸如
2020年7月21日
其他

【为宏正名】99%人都不知道的"##"里用法

【说在前面的话】有人说C语言中最臭名昭著的两兄弟就是指针和宏了。对于前者,很多有经验的老鸟会告诉你:用好了指针你就掌握了C语言的内功心法——如同原力一样,无论是追随光明还是堕入黑暗都离不开它。宏就没这么幸运了,不光年年受到邪恶的混乱C语言大赛的肆意霸凌(https://www.ioccc.org/),更是让“让代码爹妈都不认识”的身份标签贴到了骨头上——怎一个惨字了得。这个系列将本着实用的原则介绍一些宏在模块封装中“点石成金”的用法,让大家正确认识到宏真实的作用和使用规则——真真正正还“宏”一个公道。【"##"的“表”用法】想必很多人都知道"##"的用法——它本质上是一个“胶水运算”,用于把参数宏中的“形参”与其它没有天然分割的内容粘连在一起,例如:#define
2020年7月8日
其他

【C进阶】听说用 “ 逗号表达式 ” 仅仅为了秀技?

正准备下一篇文章介绍一个与逗号表达式有关的骚操作,未知bug就送来了一篇扫盲贴——大家可以先看看普通的逗号表达式是怎么用的,打个基础——然后再来看看99%人都不知道的逗号表达式的骚操作。
2020年7月7日
其他

【编译器玄学研究报告】第一期——位域和volatile

【写在前面的话】在鸽了将近4年之后,我终于良心发现,决定重新恢复【裸机思维】公众号的更新。谢谢大家的长久守候和等待——非常非常抱歉。这段期间,发生了很多事情,我也憋了很多内容想跟更多的朋友分享。作为一个开端,我准备踏踏实实的从一些小的话题开始,慢慢恢复写作状态。《编译器的玄学研究报告》就是这样一个系列,我会为大家分析一些常见的、同时也是最新的、嵌入式编译器使用中可能会遇到的问题——尤其是那些看似是玄学的现象——为大家庖丁解牛、由浅入深,不仅给个痛快,也给大家个明明白白——我最终的目的是希望大家不惧怕优化,不要把编译器的行为看作是玄学,最终人人都拥有屈驾最高优化等级的知识和信心。在正文开始前,给大家提个小问题:你们用过的最高优化等级是什么(编译器是什么)?遇到过什么问题?欢迎大家在评论区留言。我会筛选最高赞的评论,并尝试在以后的《编译器玄学报告》中为大家解答。【正文】位域和volatile大家再熟悉不过了:前者用于将指定类型的整形变量按照我们的意愿像蛋糕一样切分成或大或小的若干份;后者用于告诉编译器“绝不允许对被修饰的变量动手动脚(做优化)”,因为在“编译器不知道的情况下”,这个变量的值是可能会因为各种原因被更新或者是改变的。外设(peripheral)本质上就是大家最近热炒的“硬件加速器”。在遥远的过去,UART、SPI这类外设其实都只是一个通信协议,由软件通过操作GPIO(最多配合引脚上的外中断)来实现。后来,为了降低CPU的负担(offload
2020年6月19日
其他

C语言#和##连接符在项目中的应用(漂亮)

BUF_PREF(buffer_init)BUF_PREF(buff_free)BUF_PREF(buff_write)BUF_PREF(buff_read)等等。。。接下来看看到底是怎么用的:
2020年5月24日
其他

什么是嵌入式(下)—— “重力”和“沉淀”

嵌入式(Embedded),听起来也许是一个很有点科技感的名词,加之最近大热的所谓物联网(IoT)、智能硬件,似乎从事嵌入式开发很有点逼格的感觉——没错,在上世纪70年代,大洋彼岸的很多Freaks们也是这么想的,他们中的很多人已经印刷在各类书籍的封面上了。
2020年5月20日
其他

什么是嵌入式系统(上)—— “为用而专”

作为开篇,我们首先对"什么是嵌入式系统"的认识开始。那么什么是嵌入式系统呢?我首先保证,下面的定义已经非常精简,一个多余的单词都没有(请允许我在一个完整的句子中加入空格来强调每一个要素):
2020年5月20日
其他

漫谈C变量——对齐(3)

Cortex-M中断向量表保存的都是32位的地址,每一个地址指向一个中断处理程序,因此中断向量表的大小必然是4的整倍数。理论上,你有n个中断,就因该有(n+1)*4
2020年5月17日
其他

大白话说嵌入式安全(1)

在一个PPT满天飞的世界里,有些现象还是蛮有趣的。比如也许你的女朋友没有听说过什么叫做嵌入式系统,但她一定知道什么是物联网;就算她并不知道“互联网无隐私”,也一定知道“物联网最关键的是安全”——正所谓故事听得多了,爱因斯坦的司机都可以讲相对论了。那么问题来了:作为专业人士的你,物联网的安全是什么,你能说的清楚么?好了,好了,别装逼了,知道你啥都不懂,如果不服,请掠过这篇文章。下面,我们首先从几个常见的误区开始,慢慢为你展开:误区一:安全和安全
2020年5月16日