这么个存数据函数, 给中断打断的机会肯定是有的. 但是很多时候都会遇到这样的数据访问共享冲突.
处理器提供了不少办法解决这个问题, 比如
1. 禁止中断. 就是 2楼的办法.
2. 用半主机, 借助系统服务异常, 把共享数据的访问交给 SVC 服务来实现
3. Cortex-M3 特别提供的共享互斥访问机制, ldrex 指令, 效率很高.
此外, 还有一些编程技巧也可以避免共享访问的影响, 就是合理安排指令顺序和标志方式. 这么说有点难懂. 不过楼主的代码就是个例子.
主程序先写数据, 再置标志, 中断服务先判标志, 再读数据,
那么主程序在完成置标志前, 中断服务即使执行了, 因为没有标志, 空操作就退出了, 所以不会影响主程序写数据的操作.
当然这个做法只能应付单数据的缓冲, 如果 data_buf 里有多次中断才能发送完的数据, 那这办法就不行了. 当然还有更巧妙的技巧.
|