- 博客(191)
- 资源 (1)
- 收藏
- 关注
原创 FreeRTOS 二值信号量应用
应用场景核心思想信号量初始值典型调用方任务同步等待一个预期的事件0任务Take-> 任务Give中断与任务同步ISR通知任务处理0任务Take-> ISR单向信号通知(门控)标志一个状态/条件0任务Give-> 任务Take(带超时)简单来说,当你需要让一个任务“等待某事发生”时,二值信号量是一个极佳的选择。而如果需要保护共享资源,则应使用互斥量来避免优先级反转问题。
2025-11-28 15:52:24
435
原创 reeRTOS 二值信号量为什么会存在优先级反转的问题,说明原理,并举例说明
问题根源:普通的二值信号量不具备优先级继承功能。低优先级任务持有资源时,无法抵抗中优先级任务的抢占,导致高优先级任务被无限期推迟。关键区别:在 FreeRTOS 中,用于同步的二值信号量和用于互斥的互斥量是不同的。互斥量内部实现了优先级继承协议,而二值信号量没有。实践建议如果你要保护共享资源,防止优先级反转,请务必使用互斥量,而不是二值信号量。在 FreeRTOS 中,应使用来创建互斥量,而不是。
2025-11-28 14:31:26
353
原创 freeRTOS临界段资源
不能被其他任务抢占不能被中断服务程序打断必须完整执行,不能部分执行临界段代码必须原子性执行的代码段执行期间禁止任务切换和中断用于保护共享资源或关键硬件操作应该保持尽可能短通过和来保护正确使用临界段是确保FreeRTOS应用程序稳定性和可靠性的关键。
2025-11-26 23:44:22
309
原创 为什么有的mcu烧录的时候是用hex,有的是用bin
特性HEX 文件BIN 文件格式ASCII 文本纯二进制地址信息内置在文件中需要外部指定数据连续性支持不连续的数据块必须是连续的数据块文件大小较大(有冗余信息)较小(纯数据)可读性可用文本编辑器查看不可读(乱码)错误校验每行有校验和无典型应用开发调试、复杂内存布局的MCU量产烧录、Bootloader升级、简单MCU选择HEX还是BIN,并非由MCU本身绝对决定,而是由**“工具链 + 内存布局 + 应用场景”**共同决定的。
2025-10-29 08:21:28
1409
原创 物理电气协议标准:RS485 RS232
是的,RS232和RS485本质上是物理层和电气层的协议标准,它们定义的是信号的电气特性(如电压范围、传输介质、抗干扰能力等),而不涉及数据格式和软件时序。数据链路层协议是计算机网络体系结构(如OSI七层模型)中的第二层协议,主要负责相邻两个设备(如两个路由器、计算机与打印机)之间通过物理链路传输数据时的规范和控制。简单来说,它解决的是“如何在物理线路上可靠地传递数据”的问题。
2025-08-21 21:55:41
1105
原创 C语言深度剖析
register这个关键字请求编译器尽可能将变量存在CPU内部寄存器中,而不是通过内存寻址以提高效率。注意是:尽可能、而不是绝对。
2025-08-10 23:07:46
368
原创 计算机网络中:传输层和网络层之间是如何配合的
应用层数据││ 传输层(TCP) │ 分段、编号、确认、重传、流量控制│ TCP段│ 网络层(IP) │ 路由、寻址、转发(不保证可靠性)│ IP数据报│ 链路层 │ 真正在物理媒介上发帧网络层提供“主机到主机”的可达性;传输层在网络层之上提供“进程到进程”的端到端语义(可靠或不可靠)。二者一前一后,共同完成完整的网络通信。客户端进程不监听端口,但操作系统为它临时“注册”了四元组;所有返回包按四元组精准投递,因此绝不会搞错收件人。
2025-07-21 23:56:09
1110
1
原创 wifi配网
物联网设备,当我们购置回家的时候,一开始厂家并不知道你家的wifi账号密码,所以没办法写到程序中去,所以需要设计一种特殊的程序,让买回来的设备能连接上家里的wifi,对于有界面的产品来说,可以直接在图形化UI界面上操作,比如智能液晶电视,可以直接用户输入SSID,password、但是对于没有图形化界面的设备,比如智能插座而言,就需要用到智能配网了这里我就讲解其中一种配网技术,是由 TI(德州仪器)最早提出的一种无线配网技术,后被广泛应用到如 ESP8266 / ESP32 等平台中。它允许设备。
2025-07-05 18:19:38
740
原创 #ifdef和#if 的应用差异
可以灵活控制代码的编译行为,适应不同的硬件、配置或调试需求。中检查宏是否定义,避免未定义宏导致的错误。(必须是常量表达式)决定是否编译代码。在嵌入式软件开发中,
2025-06-26 09:47:43
844
原创 举例说明单片机,主循环和中断资源访问冲突的案例
当主循环和中断服务程序异步地(即发生时机不确定)访问同一个资源,并且至少有一个访问是“写”操作时,如果访问不是“原子性”的(即不能被中断打断的最小操作单元),就可能出现冲突,导致数据损坏、程序逻辑错误或硬件操作异常。好的,我们来举几个单片机中主循环(主程序)和中断服务程序访问共享资源(如全局变量、硬件寄存器、缓冲区等)发生冲突的典型案例,并解释冲突是如何发生的。这个例子本身冲突不明显,主循环成功读取了位置5的数据,中断正确写入了位置10的数据并更新了写索引。对于案例2,保护读写索引的更新;
2025-06-13 22:54:07
1275
原创 单片机,主循环和中断资源访问冲突的案例
本文分析了单片机系统中主循环与中断程序共享资源时可能引发的冲突问题,通过三个典型场景(共享变量、缓冲区操作和外设配置)展示了冲突现象及其解决方案。文章重点阐述了竞态条件的发生机制,并提供了关中断保护、状态标志管理、缓冲区检测等具体解决方法。最后总结了冲突预防的五项原则,包括最小化临界区、原子操作和中断优先级控制等。这些案例和原则对嵌入式系统开发中避免资源冲突具有实际指导意义。
2025-06-13 22:42:01
1143
原创 火线、零线、地线 基础知识
变压器二次侧中性点(N)引出的线路,与相线(L)构成回路,对用电设备进行供电。通常情况下,零线在变压器二次侧中性点(N)处与保护地线(PE)重复接地(PEN),起到双重保护作用。:电路中输送电的电源线。: 不用于工作回路,只作为保护线。利用大地的绝对“0”电压,当设备外壳发生漏电,电流会迅速流入大地,即使发生PE线有开路的情况,也会从附近的接地体流入大地。(从变压器中性点接地后引出主干线并每间隔20-30米重复接地)
2025-06-12 23:36:39
2082
原创 C语言中的段错误(Segmentation Fault):底层原理及解决方法
在嵌入式单片机开发中,除了段错误外,还有许多其他常见的运行时错误,这些错误可能导致系统崩溃、功能异常或性能下降。嵌入式单片机的运行时错误类型多样,需结合硬件特性和软件逻辑综合排查。通过防御性编程和调试工具的结合,可以有效减少运行时错误,提高系统稳定性。
2025-06-09 23:08:00
1235
原创 嵌入式软件架构规范之 - 分层设计
该规范是嵌入式软件“分层设计”的核心原则之一,核心目标是通过驱动层→底层适配层→应用层的解耦,实现“一次编写,多平台复用”的驱动代码。实际开发中,可结合具体项目需求,通过硬件抽象层(HAL)或板级支持包(BSP)实现底层接口的隔离,确保驱动模块的独立性和可移植性。
2025-05-22 15:26:13
1309
原创 51单片机同一个timer 作为定时器和波特率发生器么?
在51单片机中,同一个Timer不能同时作为普通定时器和波特率发生器。为了避免冲突,建议使用不同的Timer来实现不同的功能。如果硬件资源有限,可以考虑分时复用或使用外部定时器芯片,但这些方法实现复杂,且可能影响系统稳定性。
2025-05-06 18:16:46
1129
原创 *** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
在嵌入式开发中使用 Keil 编译器时,是一个常见的错误。这个错误表示编译器在链接过程中找不到某些外部符号的定义。在代码里引用了某个函数或者变量,不过该函数或者变量却没有被定义。例如,在一个源文件里调用了一个函数,但是这个函数的实现代码并未包含在项目中。// main.c// 调用未定义的函数return 0;在这个例子中,函数未被定义,链接时就会出现未解析外部符号的错误。保证所有被引用的函数和变量都有定义。查看代码,确认在源文件中实现了所有被调用的函数。
2025-05-06 08:59:56
1881
原创 OTA和IAP的关系
OTA是Over-the-Air的简写,即空中下载技术,通过网络远程给用户进行系统更新和升级。IAP是In Application Programming的简写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。IAP主要包括BootLoader和应用程序两部分,基于IAP的OTA设计思路是先通过OTA接收升级固件,再利用IAP进行固件搬移、校验和程序跳转,实现空中升级的目的。,但两者并非完全等同。
2025-04-26 21:56:28
1039
原创 C语言 转义字符
在C语言中,转义字符是一种特殊的字符序列,用于表示一些无法直接输入或具有特殊含义的字符。它以反斜杠“\”开头,后面跟随一个字符或一组字符,用来表示一个特定的字符或控制功能。
2025-03-22 22:13:05
779
原创 win10 添加项目右键用vscode
1、新建reg文件;在vscode安装目录下新建一个文本文件,然后将文件后缀改为:*.reg,文件名任意,例如:vsCodeOpenFolder.reg。文件编辑好了之后保存关闭.然后双击运行 vsCodeOpenFolder.reg ,遇到提示点击 “确定"或"是”;
2025-03-13 08:56:28
263
原创 %d %c %x
这种设计的核心在于数据的二进制本质和格式化符号的灵活性。它使得程序员可以根据需要以不同的方式解释和处理数据,从而提高编程的灵活性和效率。这种设计不仅适用于C语言,也是现代编程语言处理数据的通用方式。
2025-03-08 00:24:26
1046
原创 示波器使用指南
直流耦合:传递信号的所有频率成分,包括直流和交流。交流耦合:仅传递交流信号,滤除直流成分。接地耦合:将输入端接地,显示零电平(仅用于参考或校准)。
2025-02-10 23:29:43
324
原创 MCU应用踩坑笔记(ADC 中断 / 查询法)
2.同时使用查询法和中断法且芯片温度超过47℃导致采样时间过长原因为高温下芯片内部HRC频率会产生漂移(频率变快,但时钟精度控制在±1%),该状态下MCU采样ADC ADC中断标志会比while语句更快速,CPU优先处理中断服务函数,导致采样完成标志在中断服务函数中清除,进一步导致MCU卡死在while循环中无法清除WDT致使WDT超时溢出复位,且外部电路也会受温度影响,综合影响下最终表现为MCU 47℃下ADC采样卡死。在使用过程中,因配置了ADC中断使能,在中断服务程序中,清除了了中断标志位。
2025-02-07 11:23:55
1091
原创 KEIL修改工程名
假设原来的工程文件名是first,要改成second1.在工程文件目录中,将first.uvopt和first.uvproj名字改成second.uvopt和second.uvproj。2.其他first文件统统删除。3.打开second.uvproj,4.点击品字形图标,在弹出的界面上,双击“Progect Components”下面的工程名,修改成second。
2025-02-06 10:00:25
1551
转载 嵌入式开发中观察者模式实现(转)
观察者模式(Observer Pattern)是一种广泛应用于软件设计的行为型设计模式。在该模式中,存在两种关键的角色:被观察者(Subject 或Observable):这是一个包含了一系列观察者对象的集合,并提供了增加、删除观察者对象以及通知所有观察者的接口。当被观察者的状态发生变化时,它负责触发通知机制,使所有关联的观察者得到更新。观察者(Observer):这是从被观察者那里接收状态变更通知的一组类的接口或者抽象类。每个具体观察者都必须实现这个接口,以便在接收到通知时执行相应的操作。
2025-01-05 11:53:46
125
原创 void * 的妙用
使用void *指针作为函数参数的核心出发点是灵活性和通用性。避免重复代码:使得函数和数据结构可以处理多种不同类型的数据。代码复用void *提供了一种通用的接口,可以用于许多不同的应用场景,减少了重复编写类型特定代码的需求。提高模块化:使得不同模块和系统之间的接口更加通用和抽象,简化了模块间的耦合。虽然void *提供了极大的灵活性,但也需要开发者注意类型安全问题。传递void *后,必须手动进行类型转换,并确保对其使用时的类型正确,否则可能会导致运行时错误。
2025-01-05 11:47:29
671
原创 示波器使用指南
直流耦合:传递信号的所有频率成分,包括直流和交流。交流耦合:仅传递交流信号,滤除直流成分。接地耦合:将输入端接地,显示零电平(仅用于参考或校准)。
2025-01-05 10:35:16
885
STM32开发教程:Keil环境引入cJSON进行JSON解析
2024-10-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅