C - В то время как и IF заявления - Попытка тайм-аут после X времени - PullRequest
1 голос
/ 29 марта 2011

У меня проблемы с приведенным ниже кодом;

int i = 0;
int x = 0;
int ch ;
int n;

    while((i < sizeof(buffer) - 1) && (x < (TIMER_FREQ*30)))
    {
        //getkey_serial0 returns either a (int)character or 0 if nothing on                                            
        //UART0
        if((ch = getkey_serial0) == 0)
        {
             x++;    //Increment X as there is nothing being received.
        }
        else
        {
            if(ch == '\n')
            {
                 n++;
            }

            if(n < 8){    //Yes I can simplify this but for some reason
            }             //I only just noticed this :/ Anyway, it is
            else{         //just here to avoid saving info I don't need
                 buffer[i] = ch ;
                 i++;
            }
        }
    }

Поскольку вход, который он считывает, является результатом сканирования по беспроводной сети, количество отсканированных записей может сильно различаться, поэтому мне необходимовозможность избежать бесконечного зацикливания.Первоначально я только что прочитал до 11 \ n, но это был мусор, так как я пропускал SSID, которые мне были нужны, поэтому я решил, что мне нужен какой-то таймер или метод, чтобы помочь мне сломаться через X времени.

TIMER_FREQопределяется как 10.

Очевидно, что я делаю что-то глупое, поэтому любые предложения или советы будут с благодарностью.Обычно я предпочитаю предложения, которые помогут мне попытаться придумать проблему, а не сообщения с фиксированным кодом :) Мне всегда кажется, что я упускаю что-то простое, несмотря на все мои усилия!

Спасибо

РЕДАКТИРОВАТЬ: Я долженупомянуть, это на встроенной системе (ARM7)

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

У вас должен быть доступ к прерыванию таймера общего назначения, обычно называемому sys_tick ().

Обычная практика в таких «голых металлических» приложениях - настроить прерывание на срабатывание каждые n миллисекунд (на моем Cortex M3 часто используется 10 мс).Затем попросите ISR обновить счетчик.Вы хотите убедиться, что обновление счетчика является атомарным, поэтому используйте 32-битную, правильно выровненную переменную.(Я предполагаю, что ваш процессор 32-разрядный, я не могу вспомнить наверняка).Тогда ваш код «приложения» может опрашивать истекшее время по мере необходимости.

НО - это обсуждение таймера может быть спорным.В моих приложениях ARM9 мы привязываем прерывание к буферу приема UART.Связанный ISR захватывает нажатие клавиши и затем выполняет любое управление буфером.Это вариант для вас?

1 голос
/ 29 марта 2011

Вы действительно имеете в виду:

if((ch = getkey_serial0) == 0) { ...

Или вы действительно имеете в виду:

if((ch = getkey_serial0()) == 0) { ...

Если последнее, именно поэтому ваша программа никогда не возвращает ноль, поскольку вы даете ейуказатель на функциюУ вашей программы много предупреждений при сборке?

1 голос
/ 29 марта 2011

Если вы хотите рассчитать время, посмотрите на time () . Это позволит вам увидеть настенные часы системы, чтобы вы могли определить, прошло ли слишком много секунд.

...