发新帖我要提问
12
返回列表
打印
[其他ST产品]

STM32的临界变量

[复制链接]
楼主: dingy
手机看帖
扫描二维码
随时随地手机跟帖
21
STM32就应该用RTOS,中断和任务之间用信号量、邮箱、消息队列传递信息。用全局变量太low了。

使用特权

评论回复
22
pengf| | 2021-8-6 23:29 | 只看该作者
这个问题虽然简单, 但楼主说的情况不算杞人忧天, 要分情况搞懂其中道理才会设计出正确的程序来.

使用特权

评论回复
23
dengdc| | 2021-8-6 23:30 | 只看该作者
比如一个变量是局部的, 主程序读写.

使用特权

评论回复
24
dengdc| | 2021-8-6 23:33 | 只看该作者
uint32_t test_var32 = 1;



test_var32 ++;

使用特权

评论回复
25
yszong| | 2021-8-6 23:35 | 只看该作者
在修改的过程中, 确实要先把变量的地址载入寄存器, 修改完再存入该地址. 在载入地址, 修改后还没有存回去的时候发生中断怎么样?

使用特权

评论回复
26
liliang9554| | 2021-8-6 23:37 | 只看该作者
硬件会自动push一个stack frame

使用特权

评论回复
27
wyjie| | 2021-8-6 23:41 | 只看该作者

使用特权

评论回复
28
wyjie| | 2021-8-6 23:43 | 只看该作者
这时寄存器会自动保存到Stack上去, 中断退出返回到主程序时, 又会自动恢复现场,所以继续执行没问题的.

使用特权

评论回复
29
llljh| | 2021-8-6 23:44 | 只看该作者
这个说的是不涉及到FPU的情况, 如果涉及到FPU情况会复杂点, 但是原理就是会在发生中断时多保存一些寄存器

使用特权

评论回复
30
huangchui| | 2021-8-6 23:46 | 只看该作者
也可以配置为Lazy Stacking

使用特权

评论回复
31
dingy|  楼主 | 2021-8-6 23:49 | 只看该作者
关于FPU的情况细节不表,不影响这里的讨论

使用特权

评论回复
32
jiajs| | 2021-8-6 23:51 | 只看该作者
那么使用的寄存器并非R0,R1, R2, R3, R12中的怎么办, 编译器会在中断入口另外push所用的寄存器, 也不会有问题.

使用特权

评论回复
33
chuxh| | 2021-8-6 23:53 | 只看该作者
但是如果这个变量是全局的, 中断中也会修改这个变量, 那么就会有冲突. 这时用临界区的处理办法, 或者杜绝使用全局变量.

使用特权

评论回复
34
supernan| | 2021-8-6 23:55 | 只看该作者
如果是RTOS, 不仅主程序与中断有冲突可能, task之间也有可能冲突

使用特权

评论回复
35
wyjie| | 2021-8-6 23:56 | 只看该作者
决办法除了临界区和杜绝使用全局变量之外, 还可以加锁, mutex, semaphore都可以.

使用特权

评论回复
36
dingy|  楼主 | 2021-8-6 23:58 | 只看该作者

明白了,多谢大家讨论这么多哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则