[其他ST产品] STM32的临界变量

[复制链接]
2941|35
chuxh 发表于 2021-8-6 23:26 | 显示全部楼层
STM32就应该用RTOS,中断和任务之间用信号量、邮箱、消息队列传递信息。用全局变量太low了。
pengf 发表于 2021-8-6 23:29 | 显示全部楼层
这个问题虽然简单, 但楼主说的情况不算杞人忧天, 要分情况搞懂其中道理才会设计出正确的程序来.
dengdc 发表于 2021-8-6 23:30 | 显示全部楼层
比如一个变量是局部的, 主程序读写.
dengdc 发表于 2021-8-6 23:33 | 显示全部楼层
uint32_t test_var32 = 1;



test_var32 ++;
yszong 发表于 2021-8-6 23:35 | 显示全部楼层
在修改的过程中, 确实要先把变量的地址载入寄存器, 修改完再存入该地址. 在载入地址, 修改后还没有存回去的时候发生中断怎么样?
liliang9554 发表于 2021-8-6 23:37 | 显示全部楼层
硬件会自动push一个stack frame
wyjie 发表于 2021-8-6 23:41 | 显示全部楼层
wyjie 发表于 2021-8-6 23:43 | 显示全部楼层
这时寄存器会自动保存到Stack上去, 中断退出返回到主程序时, 又会自动恢复现场,所以继续执行没问题的.
llljh 发表于 2021-8-6 23:44 | 显示全部楼层
这个说的是不涉及到FPU的情况, 如果涉及到FPU情况会复杂点, 但是原理就是会在发生中断时多保存一些寄存器
huangchui 发表于 2021-8-6 23:46 | 显示全部楼层
也可以配置为Lazy Stacking
 楼主| dingy 发表于 2021-8-6 23:49 | 显示全部楼层
关于FPU的情况细节不表,不影响这里的讨论
jiajs 发表于 2021-8-6 23:51 | 显示全部楼层
那么使用的寄存器并非R0,R1, R2, R3, R12中的怎么办, 编译器会在中断入口另外push所用的寄存器, 也不会有问题.
chuxh 发表于 2021-8-6 23:53 | 显示全部楼层
但是如果这个变量是全局的, 中断中也会修改这个变量, 那么就会有冲突. 这时用临界区的处理办法, 或者杜绝使用全局变量.
supernan 发表于 2021-8-6 23:55 | 显示全部楼层
如果是RTOS, 不仅主程序与中断有冲突可能, task之间也有可能冲突
wyjie 发表于 2021-8-6 23:56 | 显示全部楼层
决办法除了临界区和杜绝使用全局变量之外, 还可以加锁, mutex, semaphore都可以.
 楼主| dingy 发表于 2021-8-6 23:58 | 显示全部楼层

明白了,多谢大家讨论这么多哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部