本帖最后由 zhanzr21 于 2019-9-6 21:22 编辑
这个问题虽然简单, 但楼主说的情况不算杞人忧天, 要分情况搞懂其中道理才会设计出正确的程序来.
比如一个变量是局部的, 主程序读写.
uint32_t test_var32 = 1;
test_var32 ++;
在修改的过程中, 确实要先把变量的地址载入寄存器, 修改完再存入该地址. 在载入地址, 修改后还没有存回去的时候发生中断怎么样?
此时硬件会自动push一个stack frame:
这时寄存器会自动保存到Stack上去, 中断退出返回到主程序时, 又会自动恢复现场,所以继续执行没问题的.
这个说的是不涉及到FPU的情况, 如果涉及到FPU情况会复杂点, 但是原理就是会在发生中断时多保存一些寄存器(也可以配置为Lazy Stacking)关于FPU的情况细节不表,不影响这里的讨论.
那么使用的寄存器并非R0,R1, R2, R3, R12中的怎么办, 编译器会在中断入口另外push所用的寄存器, 也不会有问题.
但是如果这个变量是全局的, 中断中也会修改这个变量, 那么就会有冲突. 这时用临界区的处理办法, 或者杜绝使用全局变量.
如果是RTOS, 不仅主程序与中断有冲突可能, task之间也有可能冲突, 解决办法除了临界区和杜绝使用全局变量之外, 还可以加锁, mutex, semaphore都可以.
不当之处请大家指正.
|