2015-11-22 9 views
0

У меня есть курсовая работа по разработке конечной машины на микропроцессоре Microblaze в C. Проблема заключается в том, что мне нужно изменить определенное изображение. Скажем, я нажимаю BTNL на FPGA; Я должен быть представлен пейзажной картиной в течение 5 секунд, и через определенные 3 секунды я должен сделать эту картинку вспышкой. В то же время на 7-сегментном дисплее должно отображаться время 5s -> 0s. Это тот случай, когда кнопка была обнаружена, и должен отображаться мигающий режим. Прерывание происходит каждые 0.004s , а часы микропроцессора 100 МГц.Обработка прерываний FPGA в C

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 стоят много времени и энергии, и я думаю, что это может вызвать проблему, но я не могу найти рабочего решения. Любые мысли или советы действительно оценены.

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

EDIT: Я не пытаюсь получить решение для копирования/вставки моей проблемы. Все это довольно массивно, я имею в виду проект verilog вместе с файлами для других функций, выполненных в c. Я не ожидал, что вы запустите код и воспроизведете все это, потому что мне был предоставлен проект Verilog в школе, поэтому вам нужно создать бит-поток, а затем загрузить и запустить все это на доске. Я здесь просто ищу предложение о том, как бы вы улучшили это, столкнулись с таким поведением с FPGA, любыми идеями.

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

+1

Вопросы, требующие помощи по отладке («почему этот код не работает?») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См.: Как создать минимальный, полный и проверенный пример. – Olaf

+1

«Мой код dosn't work» не является ** конкретной ** проблемой. У нас нет вашего оборудования, поэтому вам нужно предоставить дополнительную информацию. Например. используйте отладчик. – Olaf

+1

Вы делаете все это внутри обработчика прерываний? Если вам это нужно, вам нужно подумать о том, что произойдет, если произойдет другое прерывание. –

ответ

0

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

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

Итак, проблема заключалась в определении ISR и его комбинации с функцией DisplayNumber().

В принципе, мой 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; 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^