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

 
 
> 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, 02:24
Сообщение #2


Участник
*

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



Есть подобие бутлоадера, который распологается с начала флеш, 0х100000.
Есть Freertos, которая лежит дальше с дреса 0х110000.
Из бутлоадера делаю запуск freertos так:
Код
  //запрет всех прерываний
  //ISR_DISABLE();
  ISR_DISABLE_IDCR();
  JUMP_ADDR = (void(*)(void))(0х110000);
  JUMP_ADDR();

Или так тоже неправильно делать?

Во freertos, как подсказали в соседней ветке, я сначала копирую первые 0х80 байт в оперативную память.
"FreeRTOS не стартует" - уточняю: доходит до запуска шедуллера и виснет.
Если же этим макросом не запрещать прерывания, то шедуллер стартует и работает

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


Гуру
******

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



Цитата(TU-104 @ May 28 2014, 09:34) *
Или так тоже неправильно делать?
Хм. Трудно сказать, не зная точно, что вы поместили внутрь ISR_DISABLE() и ISR_DISABLE_IDCR().
Цитата(TU-104 @ May 28 2014, 09:34) *
Если же этим макросом не запрещать прерывания, то шедуллер стартует и работает
В вашем коде два макроса, при этом один закомментирован. Так в каком случае работает, а в каком - нет?
Цитата(TU-104 @ May 28 2014, 09:34) *
Во freertos, как подсказали в соседней ветке, я сначала копирую первые 0х80 байт в оперативную память.
Дайте, пожалуйста, ссылочку, почитаю. Надеюсь, память в ОЗУ под эти 0x80 байт вы резервируете?

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

Цитата(TU-104 @ May 28 2014, 09:34) *
"FreeRTOS не стартует" - уточняю: доходит до запуска шедуллера и виснет.
Отладчика нет?


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 19th August 2025 - 20:15
Рейтинг@Mail.ru


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