Перейти к содержанию
    

Зависание программы в alt_tick()

Приветствую всех!

Подскажите, пожалуйста, в чем может быть беда..

 

Собрана система NIOS:

post-71932-1439361080_thumb.png

 

При запуске программы в режиме отладке при пошаговом выполнении выполняется только 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);
...
...

 

Что я делаю не так / куда копать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что за функция

Delay(0xFFFF);

?

Смотрите, что делается в функции alt_tick(). Есть подозрение, что у вас таймер не до конца настроен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 все на один адрес указывает.

 

Никогда раньше такой проблемы не был до этого...

А как нужно настраивать таймер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При похожей проблеме помогло удаление из main() вызовов 

alt_irq_init((void*)0);
alt_sys_init();

т.к. они уже вызываются в alt_main().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...