- 博客(178)
- 资源 (1)
- 收藏
- 关注
原创 举例说明单片机,主循环和中断资源访问冲突的案例
当主循环和中断服务程序异步地(即发生时机不确定)访问同一个资源,并且至少有一个访问是“写”操作时,如果访问不是“原子性”的(即不能被中断打断的最小操作单元),就可能出现冲突,导致数据损坏、程序逻辑错误或硬件操作异常。好的,我们来举几个单片机中主循环(主程序)和中断服务程序访问共享资源(如全局变量、硬件寄存器、缓冲区等)发生冲突的典型案例,并解释冲突是如何发生的。这个例子本身冲突不明显,主循环成功读取了位置5的数据,中断正确写入了位置10的数据并更新了写索引。对于案例2,保护读写索引的更新;
2025-06-13 22:54:07
652
原创 单片机,主循环和中断资源访问冲突的案例
本文分析了单片机系统中主循环与中断程序共享资源时可能引发的冲突问题,通过三个典型场景(共享变量、缓冲区操作和外设配置)展示了冲突现象及其解决方案。文章重点阐述了竞态条件的发生机制,并提供了关中断保护、状态标志管理、缓冲区检测等具体解决方法。最后总结了冲突预防的五项原则,包括最小化临界区、原子操作和中断优先级控制等。这些案例和原则对嵌入式系统开发中避免资源冲突具有实际指导意义。
2025-06-13 22:42:01
798
原创 火线、零线、地线 基础知识
变压器二次侧中性点(N)引出的线路,与相线(L)构成回路,对用电设备进行供电。通常情况下,零线在变压器二次侧中性点(N)处与保护地线(PE)重复接地(PEN),起到双重保护作用。:电路中输送电的电源线。: 不用于工作回路,只作为保护线。利用大地的绝对“0”电压,当设备外壳发生漏电,电流会迅速流入大地,即使发生PE线有开路的情况,也会从附近的接地体流入大地。(从变压器中性点接地后引出主干线并每间隔20-30米重复接地)
2025-06-12 23:36:39
283
原创 C语言中的段错误(Segmentation Fault):底层原理及解决方法
在嵌入式单片机开发中,除了段错误外,还有许多其他常见的运行时错误,这些错误可能导致系统崩溃、功能异常或性能下降。嵌入式单片机的运行时错误类型多样,需结合硬件特性和软件逻辑综合排查。通过防御性编程和调试工具的结合,可以有效减少运行时错误,提高系统稳定性。
2025-06-09 23:08:00
747
原创 嵌入式软件架构规范之 - 分层设计
该规范是嵌入式软件“分层设计”的核心原则之一,核心目标是通过驱动层→底层适配层→应用层的解耦,实现“一次编写,多平台复用”的驱动代码。实际开发中,可结合具体项目需求,通过硬件抽象层(HAL)或板级支持包(BSP)实现底层接口的隔离,确保驱动模块的独立性和可移植性。
2025-05-22 15:26:13
890
原创 51单片机同一个timer 作为定时器和波特率发生器么?
在51单片机中,同一个Timer不能同时作为普通定时器和波特率发生器。为了避免冲突,建议使用不同的Timer来实现不同的功能。如果硬件资源有限,可以考虑分时复用或使用外部定时器芯片,但这些方法实现复杂,且可能影响系统稳定性。
2025-05-06 18:16:46
967
原创 *** ERROR L127: UNRESOLVED EXTERNAL SYMBOL
在嵌入式开发中使用 Keil 编译器时,是一个常见的错误。这个错误表示编译器在链接过程中找不到某些外部符号的定义。在代码里引用了某个函数或者变量,不过该函数或者变量却没有被定义。例如,在一个源文件里调用了一个函数,但是这个函数的实现代码并未包含在项目中。// main.c// 调用未定义的函数return 0;在这个例子中,函数未被定义,链接时就会出现未解析外部符号的错误。保证所有被引用的函数和变量都有定义。查看代码,确认在源文件中实现了所有被调用的函数。
2025-05-06 08:59:56
669
原创 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
796
原创 C语言 转义字符
在C语言中,转义字符是一种特殊的字符序列,用于表示一些无法直接输入或具有特殊含义的字符。它以反斜杠“\”开头,后面跟随一个字符或一组字符,用来表示一个特定的字符或控制功能。
2025-03-22 22:13:05
683
原创 win10 添加项目右键用vscode
1、新建reg文件;在vscode安装目录下新建一个文本文件,然后将文件后缀改为:*.reg,文件名任意,例如:vsCodeOpenFolder.reg。文件编辑好了之后保存关闭.然后双击运行 vsCodeOpenFolder.reg ,遇到提示点击 “确定"或"是”;
2025-03-13 08:56:28
207
原创 %d %c %x
这种设计的核心在于数据的二进制本质和格式化符号的灵活性。它使得程序员可以根据需要以不同的方式解释和处理数据,从而提高编程的灵活性和效率。这种设计不仅适用于C语言,也是现代编程语言处理数据的通用方式。
2025-03-08 00:24:26
890
原创 示波器使用指南
直流耦合:传递信号的所有频率成分,包括直流和交流。交流耦合:仅传递交流信号,滤除直流成分。接地耦合:将输入端接地,显示零电平(仅用于参考或校准)。
2025-02-10 23:29:43
226
原创 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
865
原创 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
900
转载 嵌入式开发中观察者模式实现(转)
观察者模式(Observer Pattern)是一种广泛应用于软件设计的行为型设计模式。在该模式中,存在两种关键的角色:被观察者(Subject 或Observable):这是一个包含了一系列观察者对象的集合,并提供了增加、删除观察者对象以及通知所有观察者的接口。当被观察者的状态发生变化时,它负责触发通知机制,使所有关联的观察者得到更新。观察者(Observer):这是从被观察者那里接收状态变更通知的一组类的接口或者抽象类。每个具体观察者都必须实现这个接口,以便在接收到通知时执行相应的操作。
2025-01-05 11:53:46
54
原创 void * 的妙用
使用void *指针作为函数参数的核心出发点是灵活性和通用性。避免重复代码:使得函数和数据结构可以处理多种不同类型的数据。代码复用void *提供了一种通用的接口,可以用于许多不同的应用场景,减少了重复编写类型特定代码的需求。提高模块化:使得不同模块和系统之间的接口更加通用和抽象,简化了模块间的耦合。虽然void *提供了极大的灵活性,但也需要开发者注意类型安全问题。传递void *后,必须手动进行类型转换,并确保对其使用时的类型正确,否则可能会导致运行时错误。
2025-01-05 11:47:29
564
原创 示波器使用指南
直流耦合:传递信号的所有频率成分,包括直流和交流。交流耦合:仅传递交流信号,滤除直流成分。接地耦合:将输入端接地,显示零电平(仅用于参考或校准)。
2025-01-05 10:35:16
534
原创 中断系统 | 高优先级抢占原理
因此51的内核设置了一个高优先级的向量表,注册在高优先级向量表的先会被优先执行,而且可以打断正在执行的低优先级任务。中,不仅他们中断的执行顺序是固定的,而且在执行中断服务函数的过程中,如果有更紧急的任务,也无法被打断了。如果INT0 和TIM0 的中断同时发生,CPU会有执行INT0的服务函数,然后再执行TIM0的函数。如果PT0 设置最高优先级,如果此时,其他的中断一起发生,cpu会优先执行T0.或者说,如果此时下面的红框发生中断,此时如果发生T0中断,会马上执行T0中断。如果所有的中断都分配在同一个。
2025-01-01 21:22:28
332
转载 SourceInsight4.0的使用
一、项目管理1、新建一个项目快捷键Alt+Shift+N可以打开新建项目对话框,然后根据提示填好项目存储位置,源文件位置等,然后会出现添加删除项目文件对话框,选中自己想要编辑和浏览的文件添加即可,这样就建好了一个项目。2、添加和删除项目文件(1)、在添加删除文件前,可以先设置文件过滤器,菜单栏-选项-文档选项,就可以看到文件过滤器了,怎么设置应该是一目了然的。(2)、菜单栏-项目-添加或删除文件,即可打开添加和删除项目文件对话框。3、关闭项目、打开项目、删除项目。
2024-12-21 22:38:41
520
原创 C语言 - 变量
在C语言中,定义一个变量时,编译器会为该变量分配一块内存区域,并将其关联到一个名字(变量名)。从程序员的视角来看,这个名字就是变量,但从计算机的角度来看,变量只是内存地址的一个。
2024-12-21 17:03:34
539
原创 51单片机 串口UART
数据写入SBUF寄存器后,8051会自动开始数据的串行传输。传输完成后,TI(发送中断标志)位会被置1,表示发送完成。发送前直接写入SBUF , 然后单片机就在串口时钟的驱动下,一位一位发送,全部发送完成之后 , 发送完成标志位置1。当你想要通过串口发送数据时,需要将数据写入SBUF寄存器。1 , 当单片机通过串口接收到外部设备发送的数据时,这些数据会被存入SBUF寄存器中。2 , 当数据成功接收并存入SBUF后,RI(接收中断标志)位会被置1,表示接收完成。
2024-12-11 23:40:33
349
原创 51单片机-内部扩展RAM的应用
RAM是在程序运行中存放随机变量的数据空间,51单片机球认的内部RAM只有128B,c清于编程者来说,一个芯片的RAM空间越大,RAM不够用怎么办,连过多的变量都不敢定义。写起程序来就越容易得心应手,不会总考忠压前面我们写程序时曾讲到过,如果定义个变量后,不对这个变量进行初始化,这个修就是0,其实这个结论是流要一定的条的闲四写.政酸石用防学节之利要于品东粗烘器技式内叫限款边装控观有初哈化时编译器会默认将变量值设定为0。一旦程序中的总变量超过128娜,
2024-12-11 22:45:02
834
原创 电位器分段编码识别挡位
最近接到一个需求,就是使用电位器实现,某个用电器的功率控制,一共控制3个挡位:1、0挡位2、1挡位3、2挡位4、3挡位由于电位器本质一个是电阻,我们若希望通过电位器来控制不同挡位,就需要对其进行分段处理,然后使用单片机的IO口对adc进行采集。由于电位器本身存在一定的线性度或者回差问题,我们的做法是这样的。
2024-12-05 22:54:16
223
原创 串口通讯 | ascii | hex | 字符串(解析理解)
实验环境搭建使用一个usb转ttl的模块,将其中的TX 、RX 短接在一起,波特率随意实验截图上位机字符串发送 - > 上位机字符串接收上位机字符串发送 - > 上位机hex接收上位机HEX发送 - > 上位机字符串接收上位机hex发送 - > 上位机hex接收
2024-11-27 11:59:20
336
原创 串口通信:hex、非hex格式
HEX格式:在HEX模式下,数据以十六进制的形式显示和发送,适合发送原始的字节数据,如协议数据或者二进制数据。这种方式在底层通信和硬件调试中非常常见,因为它可以精确地控制和查看每个字节的数据。非HEX(ASCII)格式:在非HEX模式下,数据以字符的形式显示和发送,适合发送可打印的文本数据。这种方式在高层通信中更常用,因为它可以直接显示和处理文本信息,易于阅读和理解。这两种模式的选择取决于你的具体需求,包括数据的类型、用途、以及你希望如何解析和处理这些数据。
2024-11-27 11:39:02
1378
原创 高阻输入的应用 | 浮空输入
现在我使用一款51内核的单片机,单片机的引脚连接着一个按键检测电路,引脚已经被一个外部电阻上拉到5V,那么请问呢,在配置该引脚的工作模式的时候,是应该配置成高阻输入,还是上拉输入模式,还是什么其它模式?模式是比较合适的,因为这样可以减少单片机内部的功耗,并且利用外部上拉电阻来确保引脚在按键未按下时为高电平。模式,这样在按键未按下时,内部上拉电阻会将引脚拉高,按键按下时,引脚被拉低。:引脚内部连接到一个上拉电阻,当引脚悬空时,会被内部上拉电阻拉高到高电平。:引脚只能输出低电平,需要外部上拉电阻来确定高电平。
2024-11-26 10:32:07
998
转载 转载:EC11的中断实验——NVIC&EXTI
这样为了记录下完整的表述1和表述2,我们定义两个全局变量flag1和flag2,当没有进入中断的时候,默认我们将其初始化为0,当发生了属性为“下1”的中断后,我们将flag1=1;正常的EC11编码器有15档、20档等,这里的档可以理解为,我们转动一圈,开关内部闭合与打开多少次,由原理图可知,我们编码器的内部实际上是一个单刀开关,转动一次之后,开关改变一次状态,A与B的电平就发生翻转。A在下降沿的时刻B是低电平,A在上升沿的时刻B是高电平,这可以表述为(A 下 B 0,A 上 B 1),记作表述2。
2024-11-26 09:34:28
386
1
原创 赛元MCU 脱机烧录步骤
1、 将SC-LINK 使用外部5V电源供电2、将烧录口对准主板烧录接口3、busy亮红灯,进入烧录ing,烧录成功后,OK灯亮蓝灯。
2024-11-07 16:49:34
951
1
STM32开发教程:Keil环境引入cJSON进行JSON解析
2024-10-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人