Обработка прерываний 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(®ION[4],1,temp);
}
else XGpio_DiscreteWrite(®ION[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()
и все это застрянет. Что я сделал, так это изменил состояния не в функциональной функции, а в основной.