Обработка прерываний FPGA в C

У меня есть курсовая работа по проектированию конечного автомата на микропроцессоре Microblaze в C. У меня проблема в том, что я должен изменить определенную картину. Допустим, я нажимаю BTNL на ПЛИС; Мне нужно подарить пейзажную картинку на 5 секунд, и через несколько секунд мне нужно сделать так, чтобы эта картинка вспыхнула. Тем временем, время 5 с -> 0 с должно отображаться на 7-сегментном дисплее. Это тот случай, когда кнопка была обнаружена и должен отображаться мигающий режим. Прерывание происходит каждые 0,004 с, а тактовая частота микропроцессора составляет 100 МГц.

for(j=0; j<=5secs; j++)
{
    if(j>3secs)
    {
        if(counter == sec){
            counter=0;
            if(temp==white){ //white background
                temp=background;
            }
            else temp=white;
        }else counter++;
        XGpio_DiscreteWrite(&REGION[4],1,temp);
    }
    else XGpio_DiscreteWrite(&REGION[4],1,temp);
    if(j==5secs)
        states = IDLE;
}

Моя главная проблема с отображением числа на 7-сегментном дисплее. Когда я ставлю displayNumber() функция в случае, все это просто зависает, как только он идет к displayNumber() линия. Я знаю вложенный for Циклы требуют много времени и энергии, и я думаю, что это может вызвать проблему, но я не могу найти работающее решение. Любые мысли или советы действительно приветствуются.

Другое дело, что я пробовал с флагом, но из-за обработки прерываний он не работает.

РЕДАКТИРОВАТЬ: Я не пытаюсь получить копию / вставить решение моей проблемы. Все это довольно масштабно, я имею в виду проект verilog вместе с файлами для других функций, выполненных в c. Я не ожидал, что вы запустите код и воспроизведите все это, потому что школа предоставила мне проект Verilog, поэтому вы должны сгенерировать поток битов, а затем загрузить и запустить все это на доске. Я здесь просто ищу предложение о том, как бы вы улучшили это, сталкивались ли вы с таким поведением с ПЛИС, какие-нибудь идеи.

Спасибо за потраченное время, чтобы прочитать вопрос!

1 ответ

Благодаря Крейгу я уделил больше внимания тому, как настроена функция displayNumber(). Так вышло, что оно застряло в прерывании, и мне просто пришлось выгнать его из другого места. Спасибо, что указали верное направление, Крейг!

Если вы считаете, что это не может быть полезным для кого-то еще, дайте мне знать, чтобы я мог удалить его.

Таким образом, проблема была с определением ISR и его сочетанием с DisplayNumber() FUNC.

По сути, мой ISR выглядел так:

void hwTimerISR(void *CallbackRef)
{
interruptServiced = FALSE;
interruptCounter++;
if (interruptCounter == 1)
{
    interruptCounter = 0;
    displayDigit(); //needed to display the number on the display
    operation(state); // function that moves the FSM's states
    interruptServiced = TRUE;
}

return;
}

По сути, проблема заключалась в том, что в случае, когда мне приходилось следить за 5 секунд, displayNumber функция будет вызывать displayDigit() и все это застрянет. Что я сделал, так это изменил состояния не в функциональной функции, а в основной.

Другие вопросы по тегам