![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单片机
文章平均质量分 89
无痕幽雨
宠辱不惊,看庭前花开花落!
去留无意,望天上云卷云舒!
展开
-
从零开始学光电开关
光电开关是光电接近开关的简称,是利用被检测物对光束的遮挡或反射,由同步回路接通电路,从而检测物体的有无。物体不限于金属,所有能反射光线(或者对光线有遮挡作用)的物体均可以被检测。光电开关将输入电流在发射器上转换为光信号射出,接收器再根据接收到的光线的强弱或有无对目标物体进行探测。下图为常见类型光电开关示意图:2.9_001。转载 2023-08-18 08:28:13 · 1606 阅读 · 0 评论 -
stm32g070的PD0/PD2 PA8和PB15
STM23G070单片机的PD0引脚作为开漏输出的时候,外部接了一个51K上拉电阻到5V,单独测试PD0的时候是可以正常的,开漏输出高的时候5V,低的时候可以到0V,但是一旦PD1推挽输出输出高之后,情况就变了,在PD1推挽输出高情况下,PD0开漏输出高的时候却始终只有2.4V,输出低的时候是0V,正常的。STM23G070单片机的PD0引脚作为开漏输出的时候,外部接了一个51K上拉电阻到5V,想让PD0开漏输出高的时候是5V,开漏输出低的时候是0V。查阅STM32G0数据手册可知。原创 2023-08-15 12:01:39 · 1307 阅读 · 0 评论 -
从零编写STM32H7的MDK SPI FLASH下载算法
它是 JEDEC (固态技术协会)制定的串行 Flash 功能的参数表标准,最新版 V1.6B (点击这里查看)。该标准规定了,每个 Flash 中会存在一个参数表,该表中会存放 Flash 容量、写粒度、擦除命令、地址模式等 Flash 规格参数。目前,除了部分厂家旧款 Flash 型号会不支持该标准,其他绝大多数新出厂的 Flash 均已支持 SFDP 标准。所以该库在初始化时会优先读取 SFDP 表参数。转载 2023-05-14 10:38:22 · 1401 阅读 · 1 评论 -
RTOS是如何“看普通中断处理的场子”的
今天我们继续推送TencentOS Tiny少为人知的另外一篇干货——作者尝试从操作系统设计的角度为您分析RTOS是如何将普通的中断处理程序纳入自己管理范围的。觉得知识太干的小伙伴,不妨在文章后面留言,写下你的疑惑,有机会获得作者的亲自解答。以下文章来源于窗有老梅 ,作者戴胜东。转载 2023-02-28 22:52:27 · 331 阅读 · 0 评论 -
支持任意数据类型的环形队列
一个C语言编写的支持任意类型的环形队列。代码开源连接:https://gitee.com/Aladdin-Wang/byte_queue。转载 2023-01-28 08:40:28 · 370 阅读 · 0 评论 -
变参函数和可变参数宏
在上面的教程中,我们学会了变参函数的定义和使用,基本套路就是使用 va_list 、 va_start 、 va_end 等宏,去解析那些可变参数列表我们找到这些参数的存储地址后,就可以对这些参数进行处理了:要么自己动手,自己处理;要么继续调用其它函来处理。i < count;i++)可变参数宏的定义和使用。转载 2023-01-28 08:38:43 · 476 阅读 · 0 评论 -
RTD原理及其温度采集
这种热电阻是新一代的温度测量和调节传感器,它的响应时间快,精度高,尺寸小,适用于液体、气体等介质,以及固体表面等温度的测量。铜是比较柔软且有良好延展性和导电性的金属,在一定温度下铜的电阻-温度线性度很好,但铜在高温下会发生氧化反应,影响精度,所以铜RTD在低温场景下的使用比较多,常见的型号有Cu50、Cu100。测量温度时,热电阻的测温端与被测物贴合。正离子又会以一定的几何形式排列起来,在固定的位置上做高频的热振动,而失去的电子则成为自由电子,在正离子间运动,大量自由电子的移动,就造成了金属的导电性较好。转载 2022-12-18 15:24:57 · 1482 阅读 · 0 评论 -
这么好用?!99%开发者从未听说过的堆栈模型(加量增强版)
【说在前面的话】朋友:你知道如何设置栈最安全么?你知道如何不写一行汇编代码就能设置栈的大小么?你知道如何在链接脚本中使用宏和头文件么?你知道如何在代码中随时随地检查栈的最大使用情况么?本文从理论到实践,从知其然到知其所以然,一杯奶茶的功夫就给你讲得明明白白。在中文嵌入式环境中,时不时的总能看到不少朋友”堆”“栈“傻傻分不清楚,我很早之前在文章《漫谈C变量——夏虫不可语冰》介绍过二者的区别,这里就不再深入展开,总之:栈(Stack)“是我们用来分配局部变量、实现函数调用和在异常响应时保存被打断代码上下文的地方转载 2022-12-04 20:52:00 · 511 阅读 · 0 评论 -
keil5制作flm文件【插件】
初始化之后就可以填充别的函数,这里用flash的话,主要是就是初始化,读,写,擦,实现完了之后点击编译,就可以在对应设置的生成文件夹中看到相关的生成flm文件了。版权声明:本文为CSDN博主「ZL.zheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。然后就是把你需要的生成flm相关的驱动拉进来工程,可以新建一个文件夹存放驱动相关的.c文件。自此完成,吧生成的插件flm文件放到mdk的flash目录下就可以调用了。转载 2022-11-17 10:31:07 · 1538 阅读 · 0 评论 -
笔记之STM32F0芯片SPI_DMA的使用(HAL库)
在调用HAL_SPI_TransmitReceive_DMA()函数前,拉低NSS,在DMA的传输完成中断进行拉高NSS,然后测试,效果是可以的,数据传输完后就立刻拉高了,就是NSS拉低到数据传输的时间较长,那么都可以在中断里拉高NSS了,那么在开启DMA传输前,拉低NSS不也是可以的吗。现在数据传输是在NSS拉低范围内了,但是NSS拉低到数据传输有9.96us,数据传输完到NSS拉高也有11.312us,字节间距倒是减少了不少,至少证明SPI+DMA这条路应该是没问题的,可以减少数据传输的时间。转载 2022-10-02 10:14:19 · 10479 阅读 · 3 评论 -
10年硬件老司机,带你探索单片机低功耗设计
大部分没有上下拉电阻,默认是输入状态,没配置IO就容易出功耗问题,ST的相对好的多,51的IO默认的51状态有上拉电阻,没用到的脚不去配置也不会出问题。外设的时钟没关,单片机内部模块没关等,部分单片机进睡眠后自动会关闭,部分不会自动关闭的,没关的话当场测试功耗就偏高,会马上发现的。,产品上主要出的问题是这些出问题的IO比较隐蔽,当时经过多次测试也没测试出来,后来在生产或现场才发现的。,很多配置可以复制之前的IO初始化(这个已经养成了1个IO,1个IO的配置,改起来其实很舒服的)。,这时问题就可能出现了。转载 2022-09-05 11:39:15 · 1163 阅读 · 1 评论 -
难倒C语言高手的枚举细节
大家好,我是小麦。我在知乎上看到这个问题,一开始,也有一些疑惑,后面查了一些资料,对于这个问题,简单的说一下我的看法。转载 2022-08-10 15:05:51 · 534 阅读 · 0 评论 -
【为宏正名】什么?我忘了去上“数学必修课”!
实际使用的时候,无论运行时刻链表的内容和结构是否会发生变化,但在编译时刻,我们会给他一些指定数量的初始的节点(比如16个),用数组来存储。的巧妙在于,它把__VA_ARGS__放在了参数列表的最前面,并随后传递了"9,8,7,6,5,4,3,2,1"这样的序号。”的文件中——而这一文件就是我们在后面文章中要经常观察的,比如,针对前面的例子,一个可能的输出结果是。每次使用下面的预编译代码,我们就可以实现将MY_INDEX的值加一的效果。...转载 2022-07-21 08:29:57 · 172 阅读 · 0 评论 -
步进电机调速,S曲线调速算法你会吗?
大家好,我是逸珺。今天想分享一种超级实用的步进电机调速算法,这种算法在步进电机调速方案中可以说是一种非常优异的方案。为啥需要设计一个调速算法呢?步进电机不是给多少脉冲就动多少步吗?但是带上负载了就可能失步,所谓失步,简单理解就是实际电机轴转过的度数,没有输入脉冲对应度数多。为什么会这样呢?电机的扭矩有可能无法驱动负载。一般会做一个启动加速控制过程,停止的时候做一个减速控制,中间做一个匀速控制。这就是比较常见的梯形调速控制算法。这样一个梯形调速算法,相当于步进电机的运动过程包含三个阶段:①加速过程②匀速过程③转载 2022-06-05 16:43:41 · 1665 阅读 · 1 评论 -
从AC5到AC6转型之路(1)——补救和准备
【说在前面的话】时间大约在2015年,Arm第一次在 MDK 5.20 中引入了Arm Compiler 6(那时候的版本是 6.9),正式拉开了Arm官方编译器从第五版(armcc)到第六版(armclang)升级替换的序幕……嵌入式行业的长尾效应是及其突出的,且不说都2022年了还有很多人在坚持 MDK4,即便是从“Arm在2017年对外宣布停止维护 Arm Compiler 5”算起,如今5年过去了,坚持使用 armcc 的用户仍然不在少数。Arm Compiler 5,也就是大家口中的 armcc,转载 2022-06-05 16:42:19 · 2031 阅读 · 0 评论 -
【非常C结构】简单而不失强大的表格
【说在前面的话】2022年了,想必已经不会有人对嵌入式开发中“数据结构(Data Structure)”的作用产生疑问了吧?无论你是否心存疑惑,本文都将给你一个完全不同的视角。每每说起数据结构,很多人脑海里复现的一定是以下的内容: 看似简单,但实际操作起来很容易出错的链表; 每天都挂在嘴边的队列; 程序跑飞的第一嫌疑人(没有之一):栈——其实平时根本没有自己用过; 稀里糊涂揉在一起说的“堆栈”——其实脑海里想的只是malloc,其实跟栈(Stack)一毛钱关系转载 2022-04-15 20:42:49 · 830 阅读 · 1 评论 -
Cat.1模块使用总结(EC600N)
由于Cat.4模块(EC20)功耗大,考虑到NB网络覆盖问题(设备在野外工作场景),因此项目上用选择了Cat.1(EC600N)模块,现在把调试过程总结下,希望能够帮助到大家。EC20使用总结请看:单片机和4G模块通信总结(EC20)。一、电源手册说供电电压≥3.4V,峰值电流3A。二、通信口UART和IO口都是1.8V,需要做电平准换。三、开机顺序我是上电1s后复位,复位低电平600ms,然后100ms后开机,开机等待10s后进行操作。四、AT指令采用消息地体原理,具体请看原创 2022-03-12 18:36:04 · 12885 阅读 · 0 评论 -
STM32G070的AD调试
前几天在调试STM32G070的AD功能,采集电池电压去计算电池剩余电量,开始用通道1,没有问题,后来硬件改版变成了通道16,发现AD采用异常,现在把调试过程记录如下,希望能够帮助其他人吧。1、首先看通道16能不能用G070一共19个采样通道,其中三个内部通道(温度、基准、Vbat),16个外部通道,如下图所示:从图可知,ADC_IN16是可用的外部通道。2、既然通道没问题,那就只能看AD的配置了在通道配置这章,说的很清楚了Sequencer fully con...原创 2021-12-07 12:01:24 · 3153 阅读 · 3 评论 -
AD7865使用总结
AD7865是一款高速14位的4通道采样芯片,网上手册基本都是英文(PS:可以在这个网址把英文文档翻译成中文:搜狗文档翻译-我的贴身智能翻译专家),这里只介绍芯片的大概情况和使用注意点,更为详细的信息请参考数据手册。一、芯片特征二、引脚介绍序号 名称 方向 功能 1 BUSY 输出 空闲或者所选序列全部转换完成后,为低电平;所选序列转换期间为高电平。 2 FRSTDATA 输出 第一个数据输出指示信号...原创 2021-11-29 11:35:07 · 1988 阅读 · 0 评论 -
J-Link RTT库和CmBacktrace库使用总结
目前一个项目由于资料、PCB体积等各方面限制,LOG_UART口没有引出,导致开发不能打印log,这对于习惯查看log分析问题的我来说,很不习惯,开发效率大大降低,遇到问题就抓狂了(在线调试,有些问题很难发现),于是查看网络,看看有没有其它的调试手段,找到了利用SWD口输出LOG的方法,如下:1、是利用MCU自带的ITM2、J-Link RTTM0和M0+内核不支持ITM,RTT支持ARM的全系列,没办法,我用的M0+内核,只能选择RTT。至于一直和使用方法,请查看J-Li...原创 2021-11-24 14:37:21 · 1756 阅读 · 3 评论 -
代码出错提示_ARM CortexM 系列 MCU错误代码自动追踪库的使用经验分享
大家在用STM32的时候有没有遇到过HardFault的问题呢:之前有一段时间被这个问题困扰了很久,下面针对这个问题做个小总结。现象还原:在debug模式下进行仿真调试,全速运行再停止运行,程序会跑到 HardFault_Handler函数中,产生 HardFault,即硬错。其产生的原因大概有如下几类:(1)数组越界操作;(2)内存溢出,访问越界;(3)堆栈溢出,程序跑飞;(4)中断处理错误;针对HardFault问题的定位,网上有几种方法,大概都是围绕着:在debu.转载 2021-11-24 11:35:33 · 817 阅读 · 0 评论 -
Cortex-M3开发经验:确定发生HardFault的地方
Cortex-M3开发经验(二):确定发生HardFault的地方我们在调试时,最害怕就是出现HardFault错误了。因为我们不知道是从哪个地方跳到这里的?单步调试起来太过于麻烦,特别在代码量大的时候,更是费时间。那么有没有一种方法,可以快速定位到发生HardFault错误的代码位置(函数)呢?Cortex-M3中断/异常的响应过程我们知道,HardFault实质上是一个中断,中断的过程如下图:在这里我就有一个疑问了:既然FUNC1和IRQ_Handler之间不存在调用关系,那IR..转载 2021-11-24 09:06:58 · 819 阅读 · 0 评论 -
J-link v9 使用技巧之虚拟串口功能
使用ITM机制实现调试contex-M系列,实现printf与scanf。1. ITM简介ITM机制是一种调试机制,是新一代调试方式,ITM是ARM Cortex-M系列内核芯片中的一种全新的调试功能,可以方便的通过调试器来实现printf调试功能。来自STM32中文参考手册的介绍:ITM ( 指令跟踪微单元 instrumentation trace macrocell):ITM是一应用驱动的跟踪源,它支持printf类的调试手段来跟踪操作系统(OS)和应用事件,并发布判定的系统信息。I转载 2021-11-19 09:16:23 · 1740 阅读 · 0 评论 -
J-Link RTT使用
目录--点击可快速直达目录写在前面 什么是RTT? RTT的工作原理 RTT的性能 快速使用教程 高级使用教程 附上测试代码 2019年12月27日更新--增加打印float的功能写在前面本文介绍了J-Link RTT的部分使用内容,很多地方参考和使用了J-Link的官方资料,有的地方可能翻译的不太准确,请见谅。如果想了解更加准确详细的内容,请点此处。什么是RTT?RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的技术,它结合.转载 2021-11-11 11:06:36 · 2327 阅读 · 0 评论 -
联合体(共同体)
转载自:http://blog.csdn.net/haiou0/article/details/6903463void test(){union V {struct X { unsigned char s1:2; //:2 指 占两个字符?是两个bit。若是int 占多少?转载 2015-11-05 14:03:19 · 801 阅读 · 0 评论 -
批处理多个文件合成一个HEX
由于项目里面包含boot程序区,boot数据区,APP程序区,APP数据区,如下如所示因此成产发行时候需要把多个文件合成一个hex下载。通过百度有如下几种方案:1、通过J-Falsh工具,把多个Bin文件合成一个hex(具体操作方法,请自行百度);2、通过批处理工具(用到fsutil.exe、cat.exe和hbin.exe)把多个Bin文件合成一个Bin文件,再转换成一个hex,请参考:bin文件合并工具(UBIN)使用方法_u012572552的博客-CSDN博客;3、通过批处.原创 2021-10-12 11:49:40 · 2830 阅读 · 1 评论 -
HEX文件学习心得
一、hex文件格式hex是十进制格式,它每行为一个原创 2014-07-17 19:35:45 · 995 阅读 · 0 评论 -
Windows上Mqtt服务器搭建与使用客户端工具MqttBox进行测试
场景MQTT协议MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。发布/订阅者模式MQTT是一个基于客户端-服务转载 2021-10-08 15:47:33 · 1747 阅读 · 1 评论 -
C语言中如何“指名道姓”的进行初始化
指定初始化器的概念C90 标准要求初始化程序中的元素以固定的顺序出现,与要初始化的数组或结构体中的元素顺序相同。但是在新标准 C99 中,增加了一个新的特性:指定初始化器。利用该特性可以初始化指定的数组或者结构体元素。数组的指定初始化器一维数组的指定初始化器利用指定初始化器的特性,我们可以这样定义并初始化一个数组: int a[6] = {[4] = 10,[2] = 25}; 上述的初始化就等同于如下方式: int a[6] = {0,0,25,0,10,0转载 2021-09-17 18:26:02 · 137 阅读 · 0 评论 -
如何“优雅”的测量系统性能
【说在前面的话】在之前的文章《【嵌入式秘术】相约榨干SysTick的每一滴汁水》里,我们介绍了一个以“寄居”形式(也就是在不影响用户已有SysTick应用的情况下)测量CPU性能的开源函数库perf_counter。其仓库连接如下:https://github.com/GorgonMeducer/perf_counter不知不觉中,perf_counter已经经历了大大小小7个版本: 提高了delay_us()的精度 增加了对GCC、IAR的支持 ...转载 2021-07-12 09:14:05 · 181 阅读 · 0 评论 -
揭秘被Arm编译器所隐藏的浮点运算
引言笔者接触嵌入式领域软件开发以来,几乎用的都是 ARM Cortex M 内核系列的微控制器。感谢C语言编译器的存在,让我不用接触汇编即可进行开发,但是彷佛也错过了一些风景,没有领域到编译器之美和CPU之美,所以决定周末无聊的休息时间通过寻找资料、动手实验、得出结论的方法来探索 ARM CPU 架构的美妙,以及C语言编译器的奥秘。(因为我个人实在是不赞同学校中微机原理类课程的教学方法)。 ARM探索之旅 01 | 带你认识ARM Cortex-M阵营 ARM探索之旅 02 | ...转载 2021-06-21 11:46:05 · 1946 阅读 · 0 评论 -
单片机和4G模块通信总结(EC20)
第一代数据汇集单元基本开发完毕,运行也有一年了,做下总结吧,希望能够给大家提供帮助。4G模块选择的是移远的EC20,通过串口和单片机交互。其实是什么型号并不重要,大体的流程和注意事项基本都一样。一、硬件首先4G模块本身功耗很高,尤其是4G模块刚上电开机瞬间,会有一个大的电流脉冲,这里我们选择的芯片本身参数符合指标,但是实际使用时候,发现有一些模块损坏问题,现场反馈是后台没有数据,查问题发现是MCU不断在重启,在查发现是4G模块重启导致MCU复位,再分析是4G电源貌似处于一种震荡状原创 2021-05-14 10:25:53 · 41569 阅读 · 23 评论 -
AD7797芯片驱动调试
今天在测试拉力传感器,调校后,发现拉力值还是零。查看AD采样值,结果如图:先不去分析为啥零,只看AD采样数据就不对,怎么会偏差这么大,而且有极大值和极小值。驱动是同事写的,目前已经不负责这个项目了,我只能一点来看手册了。一、AD7797引脚引脚图,如下图:注:和通信先关的就是标准的几个引脚,单个芯片,CS可以一直拉低,表示一直选中。DOUT/RDY为低表示转换完成,数据读走或者在数据更新之前为高(数据跟新完后为低)。时序图:二、复位AD...原创 2021-04-29 10:07:43 · 1802 阅读 · 7 评论 -
MCU模拟UART口
群里交流,有人问用IO口怎么模拟UART,19年做过一个项目,其中就有这个功能,测试后,效果还可以,做下记录吧,希望能够对大家有所帮助。一、设计思路由于我的项目需要模拟UART能够同时实现RX和TX,因此利用两个Timer和GPIO去实现:Timer1中断+GPIO 实现TX;Timer8中断+GPIO中断 实现RX。采用模块化设计,把驱动层和上层应用分离,采用基于接口变成,把驱动层分离:驱动需要提供接口:typedef void timer_stop(voi...原创 2021-04-20 16:58:05 · 1611 阅读 · 2 评论 -
【为宏正名】本应写入教科书的“世界设定”
【说在前面的话】市面上大部分C程序员对宏存在巨大的误解甚至是恐惧,并因此极力避免宏的适度使用,甚至将宏在封装中发挥正确作用的行为视作是对C语言的“背叛”——震惊之余,对于为什么大家会有这种想法的原因,我曾经一度是非常“傲慢的”,这种傲慢与某些人宣称“穷人都是因为懒所以才穷”时所表现出的那种态度并无任何本质不同——然而我错了,在闲暇之余认真看了不少经典的C语言教材后我才意识到:不是读者普遍懒或者轻视教材中有关宏的内容,而是那些对宏来说如同“加法交换律、结合律”一样的基本规则和知识并没有认真且完整.转载 2021-04-12 08:50:26 · 252 阅读 · 0 评论 -
真刀真枪模块化(3.5)——骚操作?不!这才是正统
【你可曾怀疑过?】C语言写多了,或多或少会听说一些“上古传下来”的教条,比如: #include 语句只能用来包含头文件 头文件一定要用宏保护起来——以防止重复包含 #include语句包含C源代码是不对的 …… 等等不一而足。然而,对于这些规则,你可曾怀疑过它们的正确性?它们真的是正确的么?它们真的合理么?它们真的是绝对的么?作为一个培养嵌入式思维的公众号,我们先不着急做出结论。要回答以上的问题,不妨先换个视角。【编译器“渴求”的理想状况】..转载 2021-04-12 08:46:27 · 340 阅读 · 0 评论 -
STM32之中断与事件---中断与事件的区别
1.前言本文主要介绍STM32中中断与事件的区别。2.中断与事件框架图 中断与事件处理框图这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径2.1 中断路径中断总体流程首先外部信号从编号1的芯片管脚进入-》经过编号2的边沿检测电路-》通过编号3的或门进入中断挂起请求寄存器-》最后经过编号4的与门输出到NVIC中断检测电路边沿检测电路...转载 2021-03-01 09:21:46 · 2667 阅读 · 0 评论 -
从零开始的状态机漫谈(3)——状态机设计原则:清晰!清晰!还是清晰!
【说在前面的话】我们常说状态机是一种思维方式、一种工具,同时它也是一种拥有极高自由度的语言。说到语言,类比我们日常使用的口语,你会发现:有的人表达能力很强——说话条理清晰、逻辑严密、详略得当——能充分表达自己意图的同时还很凝练;相对的,有人颠三倒四、缺乏逻辑性还罗里吧嗦一大堆——在需要认真交换观点(而不是闲聊)的场合,往往沟通双方都很憋屈——大有一副茶壶里煮饺子,有货倒不出的感觉。其实,作为一种翻译思维的语言工具,不同人在使用状态机时也有类似的表达能力的问题。回顾下之前介绍的内容: 《从.转载 2021-03-01 09:00:17 · 1333 阅读 · 0 评论 -
从零开始的状态机漫谈(2)——switch:你的状态机初恋
【说在前面的话】在前面的一篇文章《从零开始的状态机漫谈(1)——万物之始的语言》中,我们介绍了状态机在整个计算机科学中宛如“世界基石”般的地位,同时介绍了一种“面向嵌入式环境”“高度简化”了的实用型状态图绘制方法——这里的“简化”是相对UML状态图的“繁杂”而言、且更接近课本上所使用的状态机图例;而这里的“实用”体现在:基于这套方法绘制的状态图是可以“无脑”而“严格”的翻译成C语言代码的。在展开后续内容之前,不得不为大家解释清楚一个非常具有误导性的错误认知,即:状态机天然是非阻塞(non-bl.转载 2021-03-01 08:58:20 · 675 阅读 · 0 评论 -
从零开始的状态机漫谈(1)——万物之始的语言
【说在前面的话】也许从12年前我第一次开始分享状态机编写心得开始,“状态机”就像标签一样紧紧的贴在了“傻孩子”这个网络昵称的额头上——真是抠都扣不下来。不得不坦白的是,从一开始我介绍状态机更多只注重状态机这一语言的表现形式,而故意偷懒避开了状态机开发思维的系统性介绍——也许刚开始真的是没什么自信,觉得自己也没有能真正领会状态机的所谓精髓,所以不敢瞎说;后来慢慢的掌握了所谓的状态机思维模式以后,就是真正的懒惰了。在过去的5年间,尽管那些毛遂自荐参加过我免费远程培训的人或多或少都学习到了一系列使用状态机转载 2021-03-01 08:55:41 · 459 阅读 · 0 评论