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

 
 
> Странное поведение системы с ниосом.
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
 
Start new topic
Ответов
vadimuzzz
сообщение Apr 13 2011, 12:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



если сбой воспроизводится, то можно посмотреть сигналтапом, что происходит в этот момент
Go to the top of the page
 
+Quote Post
inco
сообщение Apr 27 2011, 18:00
Сообщение #3


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

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



Вроде разобрался я с аномальным поведением своей системы на кристалле.
Докладываю о проделанной работе. Если посчитать чистое время то наверное с неделю угробил пока нашел!

Перед тем как отчитаться несколько слов о целевой системе.

В системе использовалась только внутренняя память. Было создано code_rom (onchip memory установлен флаг ROM - read only),
onchip_ram (установлен флаг RAM) и использовался внешний контроллер прерываний vic.

Так вот, как только происходило любое прерывание система сбрасывалась! Путём долгих разбирательств было установлено, что
не инициализировалась таблица векторов прерываний. Эта таблица инициализируется функцией alt_ic_isr_register. Прототип этой
таблицы находится в файле altera_vic_vector_tbl.S, а в этом файле ключевая - первая фраза: .section .text !!!!!!
То есть, эта таблица ВСЕГДА по мнению альтеры, должна находится в секции .text. Но секция text - это исполняемый код, то есть
ПЗУ (code_rom). Теперь возникает вопрос, если это ПЗУ, то каким образом можно заполнить эту таблицу функцией alt_ic_isr_register,
которая должна записать туда адреса вызова функций обработчиков прерываний по ходу программы, если эта память недоступна для записи?
Как по моему это явный глюк. Но и это еще не всё! Если в отладчике остановиться непосредственно на командах записи адресов функций
обработчиков в таблицу и при этом открыть окно просмотра содержимого памяти по адресу таблицы, то эти адреса туда записываются!
То есть адреса записываются в read-only memory!!! После чего у меня наступал полный ступор!
Если исправить исходник в файле altera_vic_vector_tbl.S, заменить строку section .text на section .rwdata таблица переносится в ОЗУ, но программа всё равно НЕ работает и к тому же этот файл каждый раз заменяется при генерации BSP на родной! То есть, где-то есть подобные нестыковки ещё! Если я делаю code_rom типа RAM, то программа начинает работать нормально!!! Программа начинает работать так же как и на ките на котором отлаживалась изначально. (А на ките программа (секция text) находилась во внешней срам (то есть была записываемой!!!)). Но это же не верно идеологически!!!
Но что-то у меня пропадает энтузиазм в поиске глюков от альтеры. Или может я чего-то не понимаю!?...

Кстати это не первый обнаруженный глюк! Есть еще мелочь, проект написан на С++ и в нём использовались функции работы с флэш из файла
epcs_commands.h, а в нём альтера всего-то забыла вставить обрамление для С функций (#ifdef __cplusplus extern "C" {#endif )..., хорошо хоть это быстро обнаружилось!

Теперь вот сижу и думаю как это обойти, делать code_rom как ram что-то совсем не хочется!

Кстати у кого хорошо с английским может задать вопрос альтере? Да, чуть не забыл квартус 9.1sp2 и 10.1 ведут себя одинаково!
Go to the top of the page
 
+Quote Post
Stewart Little
сообщение Apr 28 2011, 09:17
Сообщение #4


Лентяй
******

Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843



Так, в плане ворчания sm.gif :
Цитата(inco @ Apr 27 2011, 22:00) *
... Но секция text - это исполняемый код, то есть ПЗУ (code_rom)....

Это вредное заблуждение, выросшее, скорее всего, из применения 8-битных микроконтроллеров. Секция .text может с тем же успехом располагаться и в ОЗУ (иначе бы на компах наши любимые приложения не работали sm.gif )

Ну и еще вопрос - а в чем сермяжная правда физического разделения памяти на ПЗУ и ОЗУ? Вопросы надежности? Или какие-то другие соображения?


--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
Go to the top of the page
 
+Quote Post
inco
сообщение Apr 28 2011, 11:35
Сообщение #5


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

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



Цитата(Stewart Little @ Apr 28 2011, 12:17) *
Ну и еще вопрос - а в чем сермяжная правда физического разделения памяти на ПЗУ и ОЗУ? Вопросы надежности? Или какие-то другие соображения?

Да именно из-за надёжности. По нашим требованиям ПЗУ обрамляется контрольной суммой и по ходу работы программы ПЗУ циклически проверяется.
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   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 Текстовая версия Сейчас: 23rd July 2025 - 06:15
Рейтинг@Mail.ru


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