Easyelectronics.ru

Электроника для всех
Текущее время: 08 мар 2021, 09:07

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 20 янв 2020, 11:58 
Только пришел

Зарегистрирован: 14 мар 2018, 17:32
Сообщения: 24
Прошу помощи профессионалов!
Пишу Загрузчик для STM32F4xx. Взял пример от ST загрузчика по TFTP.
Обычная программа (не FreeRTOS) успешно загружается со смещением и стартует.
Программа с FreeRTOS загружается,
но виснет наглухо. Причем где именно виснет - понять не могу.

Таблица векторов прописана верно, прерывания в программе разрешаю.
Подскажите, в чем особенность именно FreeRTOS ?

Код:
/*      ----------------------------
              RUN APPLICATION
        ----------------------------
*/
static void RunApplication (void)
{
      uint32_t JumpAddress;
      typedef void(*pFunction)(void);
      pFunction Jump_To_Application;
       
      __disable_irq();
     
      /* DeInit All */
      NVIC->ICER[0] = 0xFFFFFFFF; // disable all IRQ in NVIC
      NVIC->ICER[1] = 0xFFFFFFFF;
      NVIC->ICER[2] = 0xFFFFFFFF;
     
      NVIC->ICPR[0] = 0xFFFFFFFF; // clear all pending bits
      NVIC->ICPR[1] = 0xFFFFFFFF;
      NVIC->ICPR[2] = 0xFFFFFFFF;
     
      RCC->AHB1RSTR = 0x22E017FF; // peripherial reset enable
      RCC->AHB2RSTR = 0x000000F1;
      RCC->AHB3RSTR = 0x00000001;
      RCC->APB1RSTR = 0xF6FEC9FF;
      RCC->APB2RSTR = 0x04777933;
     
      RCC->AHB1RSTR = 0; // peripherial reset disable
      RCC->AHB2RSTR = 0;
      RCC->AHB3RSTR = 0;
      RCC->APB1RSTR = 0;
      RCC->APB2RSTR = 0;
     
      RCC->AHB1ENR = 0; // peripherial disable clock
      RCC->AHB2ENR = 0;
      RCC->AHB3ENR = 0;
      RCC->APB1ENR = 0;
      RCC->APB2ENR = 0;
     
      SysTick->CTRL = 0; // stop SysTick
      SysTick->VAL = 0;
     
      RCC_DeInit();
 
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
     
      /* Initialize user application's Stack Pointer */
      NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_FIRST_PAGE_ADDRESS);
     
      Jump_To_Application();
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 20 янв 2020, 12:22 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 965
Абсолютно никаких особенностей. Если все сделано правильно то работает.
У меня на F4 все взлетело без проблем.

В стартуемой (не будлоадер!) программе Вы перенесли адрес прерывания??? По признаками очень похоже что нет.
как определен этот дефайн
#define VECT_TAB_OFFSET
в файле system_stm32f4xx.c??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 20 янв 2020, 12:33 
Только пришел

Зарегистрирован: 14 мар 2018, 17:32
Сообщения: 24
В бутлоадере я выствил вектор:

NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_FIRST_PAGE_ADDRESS);


а в загружаемой программе выключил совсем смену адреса так:

// /* Configure the Vector Table location add offset address ------------------*/
//#ifdef VECT_TAB_SRAM
// SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
//#elif RELEASE
// //SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
//#else
// SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
//#endif


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 20 янв 2020, 12:45 
Старожил

Зарегистрирован: 25 сен 2017, 10:57
Сообщения: 246
Откуда: Украина
Я еще перед самим прыжком делаю:
Код:
__set_MSP(*((volatile uint32_t*) FLASH_DISK_START_ADDRESS + FAT_OFFSET )); //stack pointer

full
Код:
void GoToUserApp(void)
{
    uint32_t appJumpAddress;
    void (*GoToApp)(void);

    appJumpAddress = *((volatile uint32_t*)(FLASH_DISK_START_ADDRESS + 4 + FAT_OFFSET ));
    GoToApp = (void (*)(void))appJumpAddress;
    //SCB->VTOR = FLASH_DISK_START_ADDRESS;
    __set_MSP(*((volatile uint32_t*) FLASH_DISK_START_ADDRESS + FAT_OFFSET )); //stack pointer (to RAM) for USER app in this address
    GoToApp();
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 20 янв 2020, 12:55 
Только пришел

Зарегистрирован: 14 мар 2018, 17:32
Сообщения: 24
Проверил - такой же результат:

Код:
__set_MSP(*((volatile uint32_t*) FLASH_DISK_START_ADDRESS + FAT_OFFSET )); //stack pointer


это эквивалентно такому коду:

Код:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_FIRST_PAGE_ADDRESS);


На одном форуме я читал, что нужно отключить прерывания от ETH модуля. Но где это сделать ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 20 янв 2020, 13:24 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 965
Gomer888 писал(а):
Проверил - такой же результат:

Код:
__set_MSP(*((volatile uint32_t*) FLASH_DISK_START_ADDRESS + FAT_OFFSET )); //stack pointer


это эквивалентно такому коду:

Код:
NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_FLASH_FIRST_PAGE_ADDRESS);


На одном форуме я читал, что нужно отключить прерывания от ETH модуля. Но где это сделать ?


Я перед переходом запрещаю ВСЕ прерывания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 20 янв 2020, 13:47 
Только пришел

Зарегистрирован: 14 мар 2018, 17:32
Сообщения: 24
Все заработало!
Большое спасибо kos за помощь! Другие форумы просто сбили с толку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 03 ноя 2020, 19:51 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 409
Откуда: г. Ростов-на-Дону
Немного оживлю тему =)

Исходные данные аналогичны, FreeRTOS и бутлоадер. Из бута в систему переходим нормально, а вот при переходе обратно МК виснет. Соответственно, где происходит зависание непонятно. Причем в прошивке без ртоса этот же бут прекрасно работает. Переход выполняю вот так:
Код:
void Go_To_Bootloader(void)
{
    uint32_t app_jump_address;
   
    typedef void(*pFunction)(void);//объявляем пользовательский тип
    pFunction Jump_To_Application;//и создаём переменную этого типа

      __disable_irq();      //запрещаем прерывания

      /* DeInit All */
      NVIC->ICER[0] = 0xFFFFFFFF; // disable all IRQ in NVIC
      NVIC->ICER[1] = 0xFFFFFFFF;
      NVIC->ICER[2] = 0xFFFFFFFF;
   
      NVIC->ICPR[0] = 0xFFFFFFFF; // clear all pending bits
      NVIC->ICPR[1] = 0xFFFFFFFF;
      NVIC->ICPR[2] = 0xFFFFFFFF;
   
      RCC->AHB1RSTR = 0x22E017FF; // peripherial reset enable
      RCC->AHB2RSTR = 0x000000F1;
      RCC->AHB3RSTR = 0x00000001;
      RCC->APB1RSTR = 0xF6FEC9FF;
      RCC->APB2RSTR = 0x04777933;
   
      RCC->AHB1RSTR = 0; // peripherial reset disable
      RCC->AHB2RSTR = 0;
      RCC->AHB3RSTR = 0;
      RCC->APB1RSTR = 0;
      RCC->APB2RSTR = 0;
   
      RCC->AHB1ENR = 0; // peripherial disable clock
      RCC->AHB2ENR = 0;
      RCC->AHB3ENR = 0;
      RCC->APB1ENR = 0;
      RCC->APB2ENR = 0;

      //вырубаем Systick
      SysTick->CTRL = 0;
      SysTick->VAL = 0;
         

    app_jump_address = *(uint32_t*)(BOOTLOADER_ADDRESS + 4);    //извлекаем адрес перехода из вектора Reset
    Jump_To_Application = (pFunction)app_jump_address;            //приводим его к пользовательскому типу
      
    __set_MSP(*(__IO uint32_t*) BOOTLOADER_ADDRESS);          //устанавливаем SP приложения 

    Jump_To_Application();                              //запускаем приложение   
}


В буте прописано:
Код:
int main(void){
   __set_PRIMASK(1); //запрещаем прерывания

   SCB->VTOR = BOOTLOADER_ADDRESS;//переносим начало вектора прерываний по указанному адресу

   __set_PRIMASK(0);//разрешаем прерывания   


Причем виснет не сразу, а успевает даже прерыванием таймера пошевелить и зависает где-то в районе прерывания от SPI. В чем может быть проблема?

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 03 ноя 2020, 20:13 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 117
Откуда: Омск
Не прыгайте из приложения в загрузчик по вектору. Переходите в него через NVIC_SystemReset() - гарантированно всё будет сброшено.
Плюс, в момент перехода какой-то из периферийных модулей может находиться в состоянии работы и где-то между подготовкой к переходу в загрузчик и запретом прерывания в загрузчике что-то сделает.

ЗЫ: Сам отлаживал такие переходы с помщью GDB. Исключительно муторно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 03 ноя 2020, 23:09 
Заглядывает иногда

Зарегистрирован: 10 сен 2020, 21:37
Сообщения: 148
Тоже поддерживаю решение с NVIC_SystemReset - как нельзя более правильное. В противном случае, дополнительно вы должны будете через регистры RCC->...RST сбрасывать всю запущенную ранее периферию, переключить указатель стека на начало, и только тогда уже...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Не запускается FreeRTOS после bootloader
СообщениеДобавлено: 04 ноя 2020, 14:58 
Старожил
Аватара пользователя

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 409
Откуда: г. Ростов-на-Дону
Спасибо! Все заработало =)

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB