реклама на сайте
подробности

 
 
> Странное поведение системы с ниосом.
inco
сообщение Apr 12 2011, 18:18
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 161
Регистрация: 26-08-05
Из: Российская Империя
Пользователь №: 7 984



Была создана и более менее отлажена система на ките 4 цыклона.

Теперь приехали боевые платы, ну и начал переносить проект на реальное железо.
Ну и как обычно, то что работало на ките не захотело работать на реальной плате (кто бы сомневался).

Но проблема оказалась ну очень какая-то странная.
Уже все идеи кончились! Требуются идеи в каком направлении смотреть.

По ходу поиска причин, написал максимально примитивный код, который не работает:

Код
volatile uint32_t flag = 0;
volatile uint32_t counter = 0;

void timeoutRestart(void);

static void handle_eth0_timeout(void* context)
{
  IOWR_ALTERA_AVALON_TIMER_STATUS(ETH_TIMEOUT_TIMER_BASE, 0);    // Clear TO bit in status register
  printf("Hello from Nios II %d!\n", counter);                  // <- 1
  counter++;                                                               // <- 2
  flag = 1;
}


int main()
{
// Register timeout interrupt
  alt_ic_isr_register(ETH_TIMEOUT_TIMER_IRQ_INTERRUPT_CONTROLLER_ID,
    ETH_TIMEOUT_TIMER_IRQ,
    handle_eth0_timeout,
    NULL,
    NULL
  );

  timeoutRestart();

  while(1) {
    if(flag) {
      flag = 0;
      timeoutRestart();
    }
  }

  return 0;
}

//! \brief Функция перезапуска таймера в случае прихода запроса по Ethernet.
void timeoutRestart(void)
{
  IOWR_ALTERA_AVALON_TIMER_PERIODL(ETH_TIMEOUT_TIMER_BASE,
    (uint16_t)ETH_TIMEOUT_TIMER_LOAD_VALUE
  );
  IOWR_ALTERA_AVALON_TIMER_PERIODH(ETH_TIMEOUT_TIMER_BASE,
    (uint16_t)(ETH_TIMEOUT_TIMER_LOAD_VALUE >> 16)
  );
  IOWR_ALTERA_AVALON_TIMER_CONTROL(ETH_TIMEOUT_TIMER_BASE,
    ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK
  );    // Restart timer with interrupt
}


Запускаю программу - счётчик counter не наращивается, сообщение печатается.
Ставлю точку останова на метку (1) и на стартап. Запускаю на исполнение, срабатывают по очереди стартап и (1),
то есть понятно, система перегружается. Ладно идём дальше. Останавливаюсь на точке (1) иду по шагам через printf и counter++ -
счетчик наращивается нормально, printf тоже не вылетает(отрабатывает)! После этих двух шагов запускаю систему в динамике. Система перегружается (срабатывает стартап)!

А вот теперь самое интересное!
Останавливаюсь на точке (1). Открываю окно в отладчике (в эклипсе) Memory, чтобы посмотреть содержимое ячейки памяти
где лежит counter. Делаю шаг смотрю в памяти счетчик изменился, стал равен 1. Запускаю дальше систему в динамике.
Всё работает!!! Причём работает долго (больше часа точно!).

Путём разных манипуляций выяснил, что пока не открою окно просмотра памяти в эклипсе, система работать не хочет!
После того как в режиме просмотра содержимого памяти измениш counter с 0 на 1 (в пошаговом режиме), потом с системой
можно делать всё что угодно, останавливать, стартовать, шагать, всё работает.

Первая мысль была, что не тянет по частоте, но как тогда объяснить что после просмотра памяти она работает часами?
По стеку тоже не понятно, опять же почему работает потом?

Если printf с переменной, заменить на простой текст без параметров, тоже работает часами (не перегружается) счётчик наращивается.
Причём работает сразу без манипуляций с эклипсом. Правда в этом случае вызывается не честный printf, а puts.

Вобщем загадка природы! У меня идеи кончились!
Может кто-то, что-то подскажет? В каком направлении копать?
Квартус и ниос 9.1. Пробовал и в 10.1, тоже не работает, но с ним глубоко не копал. Проект написан на c++.
По частоте тоже вроде запас большой.
По ходу отладки выкинул из sopc 2/3 оборудования. Констрейны описаны. При требуемой частоте 50 МГц, квартус говорит допустимая 74 МГц.

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- inco   Странное поведение системы с ниосом.   Apr 12 2011, 18:18
- - vetal   У вас для printf - блокирующий доступ по умолчанию...   Apr 12 2011, 19:19
|- - inco   Цитата(vetal @ Apr 12 2011, 22:19) У вас ...   Apr 12 2011, 19:42
|- - barabek   Цитата(inco)А вот теперь самое интересное! Ост...   Apr 12 2011, 22:00
|- - inco   Цитата(barabek @ Apr 13 2011, 01:00) А ка...   Apr 13 2011, 05:08
- - vetal   ЦитатаТак размер буфера jtag_uart по умолчанию 64 ...   Apr 13 2011, 04:43
- - vadimuzzz   а с alt_printf пробовали?   Apr 13 2011, 06:55
|- - inco   Цитата(vadimuzzz @ Apr 13 2011, 09:55) а ...   Apr 13 2011, 07:56
- - vadimuzzz   дело в том, что alt_printf работает без блокировок...   Apr 13 2011, 08:17
- - vetal   Цитатадело в том, что alt_printf работает без блок...   Apr 13 2011, 08:25
|- - inco   Да, но если бы блокировка printf происходила в пре...   Apr 13 2011, 08:43
- - vetal   Цитатано она почему-то перегружается? Значит проис...   Apr 13 2011, 09:33
|- - vadimuzzz   Цитата(vetal @ Apr 13 2011, 16:33) Значит...   Apr 13 2011, 09:47
|- - inco   Это всё понятно на сложных системах. Код программы...   Apr 13 2011, 10:05
- - vetal   Цитатакстати, а такое может произойти, если постоя...   Apr 13 2011, 09:56
- - vadimuzzz   если сбой воспроизводится, то можно посмотреть сиг...   Apr 13 2011, 12:42
|- - inco   Вроде разобрался я с аномальным поведением своей с...   Apr 27 2011, 18:00
|- - Stewart Little   Так, в плане ворчания : Цитата(inco @ Apr 27...   Apr 28 2011, 09:17
|- - inco   Цитата(Stewart Little @ Apr 28 2011, 12:1...   Apr 28 2011, 11:35
- - vadimuzzz   inco, респект вашему упорству, очень интересная ис...   Apr 28 2011, 02:44
|- - inco   Пробовал! Тоже самое только вид сбоку 8-) Я ж...   Apr 28 2011, 04:42
- - vadimuzzz   В BSP-editor на вкладке drivers/altera_vic_driver ...   Apr 28 2011, 05:48
- - inco   Цитата(vadimuzzz @ Apr 28 2011, 08:48) В ...   Apr 28 2011, 07:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01369 секунд с 7
ELECTRONIX ©2004-2016