Как бороться со счетчиком упаковки во встроенном С - PullRequest
12 голосов
/ 22 июня 2010

Мне нужно иметь дело со счетчиком, который дает мне галочки для моего приложения. Счетчик 32 бита, так что мне нужно знать, как бороться с ним, когда он заканчивается. например:

У меня есть функция, которая возвращает (timestamp + shifttime), и у меня есть другая функция, которая будет возвращать 1 или 0 в зависимости от того, истекло ли время, но может быть вероятность того, что мой счетчик обернется, как мне поступить с этим ?.

Спасибо

Большое спасибо за все ответы, ребята. Я дам более подробно в этом редактировании.

Я использую STM32 Cortex-M3. Я хочу использовать счетчик RTC, чтобы использовать его в качестве отметки для моего приложения для планирования задач, которые должны выполняться через определенные промежутки времени. RTC может генерировать прерывание переполнения, поэтому его не проблема обнаружить. основная проблема, с которой я сталкиваюсь (или, по крайней мере, считаю ее проблемой), заключается в том, что определенные задачи получают (метка времени + смещение), т. е.


int main( void )
{
FlashLedTimeStamp = ReturnCounter( 20 );  // currentcounter value + a shift of 20
StatusLedTimeStamp = ReturnCounter( 3 );  // currentcounter value + a shift of 3

//then later on ....
while(1)
{
    /* other tasks could go here */

    if( HasTimeElapsed( FlashLedTimeStamp );
    {
       /* do something and get another timestamp value */
       FlashLedTimeStamp = ReturnCounter( 20 );  // currentcounter value + a shift of 20
    }

    if( HasTimeElapsed( StatusLedTimeStamp );
    {
       /* do something and get another timestamp value */
       FlashLedTimeStamp = StatusLedTimeStamp( 3 );  // currentcounter value + a shift of 3
    }
}   
}

давайте предположим, что мой счетчик RTC имеет длину всего 8 бит, чтобы упростить математику.

если мой текущий счетчик равен 250, когда я получаю свои метки времени, это означает, что FlashLedTimeStamp = 14 и StatusLedTimeStamp = 253, как мне проверить, что FlashLedTimeStamp истек ?? 1014 *

имейте в виду, что я не обязательно проверяю все время, чтобы увидеть, что является текущим счетчиком и истек ли определенный временной штамп. Надеюсь, это прояснит, в чем заключается проблема, с которой я сталкиваюсь.

Ответы [ 11 ]

0 голосов
/ 22 июня 2010

Предполагая, что вы имеете дело с неподписанными типами, вы можете довольно легко проверить на перенос -

if (timestamp + shifftime < timestamp) 
    it_wrapped();
...