Вроде разобрался я с аномальным поведением своей системы на кристалле. Докладываю о проделанной работе. Если посчитать чистое время то наверное с неделю угробил пока нашел!
Перед тем как отчитаться несколько слов о целевой системе.
В системе использовалась только внутренняя память. Было создано 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 ведут себя одинаково!
|