Пример:
Код
volatile unsigned char CntB;
volatile unsigned long CntL;
__interrupt void VeryFastInterrupt(void)
{
if (SomeConditon) {
// накопление некоторого счётчика в байт
CntB++;
}
}
__interrupt void SlowInterrupt(void)
{
enable_interrupt();
// добавление байтового счётчика CntB к CntL
// и обнуление CntL
if (CntB) {
CntL+=CntB;
CntB=0;
}
}
В быстром прерывании по некому событию инкрементируется байт, в медленном прерывании
накопленное в CntB значение добавляется к CntL и обнуляется CntB. Если в момент перед обнулением
CntB произойдёт прерывание VeryFastInterrupt, то значение CntB (если произойдёт инкремент) будет потеряно.
Правильно ли я понимаю, что объявление переменной CntB, как volatile не исключит потерю значения?
Может помочь только запрет прерываний? Например так:
Код
if (CntB) {
disable_interrupt();
CntL+=CntB;
CntB=0;
enable_interrupt();
}