Нужен счетчик количества микросекунд, прошедших с момента старта МК (STM32).
Насколько мне известно, переменные длинее байта обновляются не за одну команду МК. И надо чтобы в момент обновления была уверенность, что переменную в это время не читают, потому как она скорее всего будет иметь некорректное значение (1 байт обновился, второй еще и нет и т.д.)
Вот набросал такой счетчик, для проверки атомарности используется флаг _busy. Имеет право на жизнь такая конструкция или чего-то не учел?
Код
class AtomicUint64
{
private:
volatile uint8_t _busy;
volatile uint64_t _counterBackup;
volatile uint64_t _counterValue;
public:
AtomicUint64(){
_busy = 0;
_counterBackup = 0;
_counterValue = 0;
}
inline void inc(uint8_t value = 1){
_counterBackup = _counterValue + value;
_busy = 1;
_counterValue += value;
_busy = 0;
}
inline uint64_t get(){
if (_busy)
return _counterBackup;
else
return _counterValue;
}
};
extern AtomicUint64 gTick1MsecCounter;
Как используется. В прерывании 1 мsec вызывается gTick1MsecCounter.inc(), в остальном коде где нужно знать текущее значение счетчика - gTick1MsecCounter.get()
Сообщение отредактировал turnon - Aug 30 2015, 10:11