Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зависание программы в alt_tick()
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Unfog
Приветствую всех!
Подскажите, пожалуйста, в чем может быть беда..

Собрана система NIOS:
Нажмите для просмотра прикрепленного файла

При запуске программы в режиме отладке при пошаговом выполнении выполняется только alt_sys_init();, после чего курсор пропадает, при нажатии на паузу появляется в alt_tick(), в которой при пошаговом выполнении из нее не выходит.

Вылетает на второй строчке main:
Код
int main()
{
    alt_sys_init();
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT_BASE, 0);
    Delay(0xFFFF);
    IOWR_ALTERA_AVALON_PIO_DATA(PIO_OUT_BASE, 1);
...
...


Что я делаю не так / куда копать?
serjj
Что за функция
Код
Delay(0xFFFF);
?
Смотрите, что делается в функции alt_tick(). Есть подозрение, что у вас таймер не до конца настроен.
Unfog
Код
void Delay(int _d)
{
    volatile int i = 0;
    for(i =0; i < _d; i++);
}


Но он до нее не доходит.

В alt_tick ходит внутри цикла:
Код
/* process the registered callbacks */

  while (alarm != (alt_alarm*) &alt_alarm_list)
  {
    next = (alt_alarm*) alarm->llist.next;

    /*
     * Upon the tick-counter rolling over it is safe to clear the
     * roll-over flag; once the flag is cleared this (or subsequnt)
     * tick events are enabled to generate an alarm event.
     */
    if ((alarm->rollover) && (_alt_nticks == 0))
    {
      alarm->rollover = 0;
    }
    
    /* if the alarm period has expired, make the callback */    
    if ((alarm->time <= _alt_nticks) && (alarm->rollover == 0))
    {
      next_callback = alarm->callback (alarm->context);

      /* deactivate the alarm if the return value is zero */

      if (next_callback == 0)
      {
        alt_alarm_stop (alarm);
      }
      else
      {
        alarm->time += next_callback;
        
        /*
         * If the desired alarm time causes a roll-over, set the rollover
         * flag. This will prevent the subsequent tick event from causing
         * an alarm too early.
         */
        if(alarm->time < _alt_nticks)
        {
          alarm->rollover = 1;
        }
      }
    }
    alarm = next;
  }


При этом next все на один адрес указывает.

Никогда раньше такой проблемы не был до этого...
А как нужно настраивать таймер?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.