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

 
 
> AT91SAM7X256 запретить прерывания временно, запрет всех прерываний
TU-104
сообщение May 27 2014, 05:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



Нужно на время запретить прерывания при записи внутренней флешки.
Делаю так:

Код
ISR_MASK = AT91C_BASE_AIC->AIC_IMR;
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;  // запрет
... FalshDWrite(...);
AT91C_BASE_AIC->AIC_IECR = ISR_MASK; // восстановить


В какой-то момент виснет на записи в IDCR=FFFFFFFF

Проверял так, без записи во внутреннюю флеш:
Код
printf(".");
ISR_MASK = AT91C_BASE_AIC->AIC_IMR;  /*printf("m");*/
printf(",");
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;
j++;
printf("|");
AT91C_BASE_AIC->AIC_IECR = ISR_MASK;
j++;


Соответственно, в консоли:
Код
,|.,|.,|.,|.,|.,|.,
и зависает.

Правильно ли так запрещать прерывания? Что еще попробовать? Заранее благодарю любые за любые советы

Включен PIT, TC0, UART, прерывания от ног.
И еще, вроде бы только с PIT -ом виснет, попробую его отдельно отключить...

Сообщение отредактировал TU-104 - May 27 2014, 06:18
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
TU-104
сообщение May 28 2014, 05:42
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



Цитата(Fedor @ May 28 2014, 13:13) *
Разрешите прерывания указанным способом перед первым вызовом xTaskCreate, но если работает в thumb режиме то вот таким способом (оттуда же из FreeRTOS)
Код
void vPortEnableInterruptsFromThumb( void )

Попробую.

Цитата(Сергей Борщ @ May 28 2014, 13:26) *
Так в каком случае работает, а в каком - нет?
Дайте, пожалуйста, ссылочку, почитаю. Надеюсь, память в ОЗУ под эти 0x80 байт вы резервируете?

На самом деле таблица векторов ARM7TDMI занимает 8 слов, плюс еще 7 слов могут занимать адреса векторов для перехода командами LDR PC, адрес. Итого достаточно копировать 60 байтов. И делать это в загрузчике (хотя это больше вопрос вкуса). Расположение вашей программы и загрузчика с адресов 01xxxxxx (а не с 0) - правильное.

Отладчика нет?

ISR_DISABLE_IDCR() обозвал способ из своего первого сообщения:
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;
ISR_DISABLE - макрос из фриртоса, предложенный Федором во втором сообщении.
Если пользуюсь вторым макросом, то виснет на старте шедуллера.

Тема про бутлоадер вот
http://electronix.ru/forum/index.php?showt...p;#entry1254289
Да, просто скопировал с запасом круглое число rolleyes.gif . В ИАРе указал, что ОЗУ начинается с 0х2000080.

Отладчика нет.. Точнее, достать можно JLINK, но jtag не разведен, припаиваться буду целый день

Сообщение отредактировал TU-104 - May 28 2014, 05:42
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 28 2014, 06:32
Сообщение #3


Гуру
******

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



Цитата(TU-104 @ May 28 2014, 12:52) *
Если пользуюсь вторым макросом, то виснет на старте шедуллера.

Отладчика нет.. Точнее, достать можно JLINK, но jtag не разведен, припаиваться буду целый день
Посмотрел описание процессора и описание самого ядра от ARM и ни там ни там не нашел указания, в каком состоянии находятся биты запрета прерывания в ядре при старте. Учитывая, что они называются "Interrupt disable bits" можно предположить, что прерывания ядра по умолчанию включены и FreeRTOS может полагаясь на это не трогать их и не разрешать прерывания дополнительно. Увы, у меня нет под рукой устройства на ARM7TDMI чтобы проверить это предположение. Но если я прав, вам действительно надо перед передачей управления запрещать все прерывания в AIC записью в IDCR не трогая CPSR.

А вот для первой вашей задачи - "временно запретить все прерывания на время записи во флешь" надо использовать манипуляцию с CPSR.

Кстати, а чем обусловлен ваш выбор этого морально устаревшего контроллера?


--------------------
На любой вопрос даю любой ответ
"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



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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 02:11
Рейтинг@Mail.ru


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