【发布时间】:2020-06-16 15:46:07
【问题描述】:
我正在为裸机嵌入式应用程序开发一个可移植库。
假设我有一个定时器 ISR,它增加一个计数器,并且在主循环中,这个计数器读取来自肯定不是原子负载。
我正在尝试确保负载一致性(即,我没有读取垃圾,因为负载被中断并且值发生了变化)而不使用禁用中断。只要读取的值正确,读取计数器后值是否改变都没有关系。这能解决问题吗?
uint32_t read(volatile uint32_t *var){
uint32_t value;
do { value = *var; } while(value != *var);
return value;
}
【问题讨论】:
-
为了原子性,最好有一个锁,例如一个全局标志,当设置时读取操作将循环直到未设置。锁由中断处理程序设置
-
@NikosM。这不符合图书馆的目的。基本上,我正在尝试在普通 C99 中实现条件变量。
-
我认为这行不通。条件不是也加载值以检查它吗?意味着它会受到实际负载的任何问题的影响?
-
@ChrisRollins 这个想法是,如果我可以连续两次读取相同的值,那是因为加载没有中断(或者它被中断但它的值没有改变)
-
基本上我认为尝试以完全可移植的方式做到这一点是没有希望的;人们总是可以想象一些奇怪的架构,它会失败。