реклама на сайте
подробности

 
 
> volatile
_Артём_
сообщение Mar 26 2007, 23:30
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Пример:
Код
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();
    }
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016