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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AT91RM9200 после разрешения прерываний улетает на непонятные адреса, Под IAR + SAM-ICE-JTAG всё работает...
Paramedic
сообщение Apr 11 2007, 16:31
Сообщение #1


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Странная ситуация: отлаживал код под IAR + SAM-ICE-JTAG в SDRAM, всё было нормально. Затем сварганил загрузчик из RomBoot от Атмеля и стал загружать бинарник из датафлэш в SDRAM. И вот теперь, когда загрузчик загружает код в SDRAM и запускает его на выполнение, программа стартует всегда, но иногда (с вероятностью ~50%) программа слетает. Место слёта определил: после инициализации таймера и разрешения всех прерываний. До этого момента код работает адекватно. Никто не сталкивался с такой проблемой?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 11 2007, 18:40
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Значит напахано в обработчике прерываний. Показал бы, как ты его реализуешь, тогда можно чего и посоветовать.
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Apr 11 2007, 20:30
Сообщение #3


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Да код-то собственно, как в примере от ИАРа:

void AT91F_ST_HANDLER(void)
{
volatile int StStatus;

// Read the system timer status register
StStatus = *(AT91C_ST_SR);
StTick++;
}

void SysTmrInit (Int32U Resolution)
{
//* System Timer initialization
AT91F_ST_SetPeriodIntervalTimer(AT91C_BASE_ST,3*Resolution);
AT91F_ST_EnableIt(AT91C_BASE_ST, AT91C_ST_PITS);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, // AIC base address
AT91C_ID_SYS, // System peripheral ID
(AT91C_AIC_PRIOR_HIGHEST - 1),
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
AT91F_ST_HANDLER );
//* Enable ST interrupt
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);
}

Настраиваю на период 100мкс.
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Apr 12 2007, 08:41
Сообщение #4


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Не понятно почему под отладчиком ниразу не сбойнуло...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 12 2007, 09:55
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Да дело не в этих процедурах. Скорее всего в startup модуле прописана таблица прерываний в короткой форме, т.е. в виде branch instruction. Но это позволяет адресоваться в пределах 32 Mb.

Надо просто создать эту таблицу в виде load PC instruction:

Vector_Init_Block
LDR pc, Reset_Addr
LDR pc, Undefined_Addr
LDR pc, SVC_Addr
LDR pc, Prefetch_Addr
LDR pc, Abort_Addr
NOP ;Reserved vector
LDR pc, IRQ_Addr
LDR pc, FIQ_Addr

Reset_Addr DCD Start_Boot
Undefined_Addr DCD Undefined_Handler
SVC_Addr DCD SVC_Handler
Prefetch_Addr DCD Prefetch_Handler
Abort_Addr DCD Abort_Handler
DCD 0 ;Reserved vector
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler

Про это хорошо написано в RealView Compilation Tools Developer Guide (ARM DUI 0203G)
на сайте ARM'a.
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Apr 12 2007, 10:14
Сообщение #6


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Спасибо за совет, почитаю. Только не понятно почему под отладчиком работает...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 12 2007, 10:22
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Paramedic @ Apr 11 2007, 15:31) *
Место слёта определил: после инициализации таймера и разрешения всех прерываний.
Был в похожей ситуации. Вкратце так: загрузчик настраивает контроллер прерываний по-своему, отрабатывает, передает управление основной программе. Основная программа, надеясь на настройки контроллера прерываний по умолчанию прописывает только свои значения и разрешает прерывания. Срабатывает какое-то из непереназначенных прерываний загрузчика и программа улетает в несуществующий обработчик. Здесь может быть что-то похожее?
При старте ядро успевает выполнить несколько инструкций из флеша до того, как управление перехватит JTAG и остановит его. За это время старый код вполне мог успеть проинициализировать контроллер прерываний. Может поэтому под отладчиком и работает?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Apr 17 2007, 14:31
Сообщение #8


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Цитата(sergeeff @ Apr 12 2007, 10:55) *
Да дело не в этих процедурах. Скорее всего в startup модуле прописана таблица прерываний в короткой форме, т.е. в виде branch instruction. Но это позволяет адресоваться в пределах 32 Mb.

Надо просто создать эту таблицу в виде load PC instruction:

Vector_Init_Block
LDR pc, Reset_Addr
LDR pc, Undefined_Addr
LDR pc, SVC_Addr
LDR pc, Prefetch_Addr
LDR pc, Abort_Addr
NOP ;Reserved vector
LDR pc, IRQ_Addr
LDR pc, FIQ_Addr

Reset_Addr DCD Start_Boot
Undefined_Addr DCD Undefined_Handler
SVC_Addr DCD SVC_Handler
Prefetch_Addr DCD Prefetch_Handler
Abort_Addr DCD Abort_Handler
DCD 0 ;Reserved vector
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler

Про это хорошо написано в RealView Compilation Tools Developer Guide (ARM DUI 0203G)
на сайте ARM'a.



Сделал всё по Вашей рекомендации и согласно документу - не помогло.


Цитата(Сергей Борщ @ Apr 12 2007, 11:22) *
Был в похожей ситуации. Вкратце так: загрузчик настраивает контроллер прерываний по-своему, отрабатывает, передает управление основной программе. Основная программа, надеясь на настройки контроллера прерываний по умолчанию прописывает только свои значения и разрешает прерывания. Срабатывает какое-то из непереназначенных прерываний загрузчика и программа улетает в несуществующий обработчик. Здесь может быть что-то похожее?
При старте ядро успевает выполнить несколько инструкций из флеша до того, как управление перехватит JTAG и остановит его. За это время старый код вполне мог успеть проинициализировать контроллер прерываний. Может поэтому под отладчиком и работает?



При выходе из-загрузчика там запрещаются все прерывания, а при входе в основную программу вектора переназначаются...

Вообще, попробовал написать простейший проект с мигающим светодиодом - даже с ним сложности возникли - нестабильно стартует и всё. Под дебагером работает устойчиво. Может в загрузчике где-то проблема. Не понятно в какую сторону копать...
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 17 2007, 15:31
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Возможно в этих двух случаях разны карты памяти.
Смотреть код и даташит на предмет REMAP.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Apr 17 2007, 15:57
Сообщение #10


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Цитата(amw @ Apr 17 2007, 16:31) *
Возможно в этих двух случаях разны карты памяти.
Смотреть код и даташит на предмет REMAP.


Remap делаю, да и под отладчиком-то всё работает.

А кто-нибудь вообще атмеловкий RomBoot использовал? Не было проблем?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 17 2007, 16:05
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Можно до разрешения прерываний распечатать таблицу прерываний с адреса 0х000000000 и посмотреть, что-же там реально прописано.
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 17 2007, 16:07
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(Paramedic @ Apr 17 2007, 15:57) *
Remap делаю, да и под отладчиком-то всё работает.

А кто-нибудь вообще атмеловкий RomBoot использовал? Не было проблем?

Кроме самого remap нужно еще убедится, что смещения в командах Exception vectors правильны.
Возможно это поможет http://electronix.ru/forum/index.php?showtopic=25634


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Apr 17 2007, 16:08
Сообщение #13


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Цитата(sergeeff @ Apr 17 2007, 17:05) *
Можно до разрешения прерываний распечатать таблицу прерываний с адреса 0х000000000 и посмотреть, что-же там реально прописано.


Делал. В сбойном и не сбойном случае одно и тоже. Даже CRC кода считал - тоже не меняется...
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 17 2007, 16:13
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(Paramedic @ Apr 17 2007, 16:08) *
Делал. В сбойном и не сбойном случае одно и тоже. Даже CRC кода считал - тоже не меняется...

А таблица ссылается на правильные адреса обработчиков?


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Paramedic
сообщение Apr 18 2007, 07:40
Сообщение #15


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

Группа: Свой
Сообщений: 181
Регистрация: 15-01-07
Пользователь №: 24 436



Цитата(amw @ Apr 17 2007, 17:13) *
А таблица ссылается на правильные адреса обработчиков?


Да, тем более иногда-то запускается...
Go to the top of the page
 
+Quote Post

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

 


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


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