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

 
 
> 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



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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 00:09
Рейтинг@Mail.ru


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