为何要使用MCU

MCU在电器设备中的优势:灵活性与功能扩展
本文揭示了为何电器设备普遍采用MCU,通过对比非MCU电路,阐述了其在实现复杂功能和易于升级方面的优势,重点在于MCU带来的编程灵活性和功能拓展能力。

为什么很多电器设备都要使用MCU呢?

让我们用一个点亮LED的电路为例,来说明。如下图所示,不使用MCU的电路是一个由LED,开关和电阻构成的简单电路。

在这里插入图片描述

  • 不安装MCU的LED电路 *

使用MCU的电路如下图所示。
在这里插入图片描述

  • 安装MCU的LED电路图 *

很显然,使用MCU的电路要复杂得多,而且设计电路还要花费精力与财力。好象使用MCU并没有什么优点。但是,现在下结论还为时尚早。

如果我们让这个电路做一些比较复杂的操作,会怎么样呢。例如:如果希望LED在按下开关后,经过一段时间再点亮或熄灭,那么,对于安装有MCU的电路来说,只需更改MCU中的程序就可以了,并不需更改原电路。另一方面,对于没有MCU的电路来说,就必须在元电路中加入定时器IC,或者用标准逻辑IC和FPGA构成逻辑电路,才能实现这个功能。

也就是说,在更改和添加新功能时,带有MCU的电路显然更加容易实现。这正是电器设备使用MCU的原因。

MCU中,volatile关键字在以下场景会被使用: ### 硬件寄存器访问 当MCU与外部硬件设备交互时,硬件寄存器的值可能会随时被硬件本身修改。例如,定时器、串口、GPIO等外设的状态寄存器或控制寄存器。使用volatile关键字可以确保每次访问这些寄存器时,都是从实际的硬件地址读取数据,而不是使用编译器可能缓存的值。比如,在读取串口接收寄存器时,若不使用volatile,编译器可能会认为寄存器值不会改变,从而进行优化,导致不能及时获取到最新的接收数据。 ### 中断服务程序与主程序共享变量 在MCU系统中,中断服务程序(ISR)可以在主程序执行过程中随时被触发。当中断服务程序和主程序共享一个变量时,为了保证数据的一致性和正确性,需要将该变量声明为volatile。如案例中系统有一个按键,按下时产生外部中断,中断服务程序负责设置一个全局标志位`keyPressed = 1`,主循环不断检查这个标志位。若`keyPressed`未声明为volatile,编译器可能会对其进行优化,导致主循环无法正确检测到标志位的变化,从而丢失按键事件。代码如下: ```c volatile int keyPressed = 0; // 必须声明为 volatile,防止编译器优化掉对内存的访问 // 中断服务程序 (ISR) void EXTI0_IRQHandler(void) { if (检查中断源是按键) { keyPressed = 1; // 中断中设置标志位 清除中断标志; } } // 主循环 void main(void) { while(1) { if (keyPressed == 1) { // 主循环读取标志位 handleKeyPress(); // 执行按键处理 keyPressed = 0; // 主循环清除标志位 } // ... 其他任务 ... } } ``` ### 多线程或多任务环境下共享变量 在支持多线程或多任务的MCU系统中,不同的线程或任务可能会同时访问和修改同一个变量。为了避免编译器对变量访问进行优化,确保每个线程或任务都能获取到变量的最新值,需要将共享变量声明为volatile。 ### Cache一致性问题相关变量 当MCU运行频率过高时,为提高执行效率会在RAM和MCU之间添加cache。但这可能会导致DMA使用的RAM数据和MCU使用的cache缓存数据不一致的问题。对于可能受此影响的变量,使用volatile关键字可以让编译器每次都从内存中读取变量的值,而不是使用cache中的缓存值,从而避免因数据不一致导致的错误 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值