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

 
 
> 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
Fedor
сообщение May 28 2014, 03:03
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 26-10-05
Пользователь №: 10 125



Разрешите прерывания указанным способом перед первым вызовом xTaskCreate, но если работает в thumb режиме то вот таким способом (оттуда же из FreeRTOS)
Код
void vPortEnableInterruptsFromThumb( void )
{
    asm volatile (
        "STMDB    SP!, {R0}        \n\t"    /* Push R0.                                    */
        "MRS    R0, CPSR        \n\t"    /* Get CPSR.                                */
        "BIC    R0, R0, #0xC0    \n\t"    /* Enable IRQ, FIQ.                            */
        "MSR    CPSR, R0        \n\t"    /* Write back modified value.                */
        "LDMIA    SP!, {R0}        \n\t"    /* Pop R0.                                    */
        "BX        R14" );                    /* Return back to thumb.                    */
}


Сообщение отредактировал Fedor - May 28 2014, 03:05
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:17
Рейтинг@Mail.ru


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