Aleksandr Baranov 1 10 ноября, 2010 Опубликовано 10 ноября, 2010 (изменено) · Жалоба Здравствуйте. У меня evaluation kit с процессором STM32F103 с FreeRtos. Среда - IAR541. FreeRtos устойчиво работает, если ее загрузить с адреса 0x8003000 и запустить. Если с адреса 0x8000000 загрузить лоудер, который ничего не делает кроме перехода на FreeRtos - FreeRtos доходит до vTaskStartScheduler(); и попадает в HardFaultException. Если вместо FreeRtos записать простую программу мигания светодиодом - все прекрасно работает. Вот код функции перехода: static bool jump_to( unsigned char* dest ) { void (*prog_start)(void); if (( *(unsigned long*)dest & 0x3FFF8000 ) == 0x20000000 ) // looks like a stack pointer? { __disable_interrupt(); SysTick->CTRL &= 0; prog_start = (void(*)(void))*(unsigned long*)(dest + 4); // load program start address __MSR_MSP( *(unsigned long*)dest ); // load user stack prog_start(); // now jump } return ( false ); } Значение dest - 0x8003000. Функцию я е написал на основе примера из библиотеки STM32. Что я упустил? Изменено 10 ноября, 2010 пользователем Aleksandr Baranov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 10 ноября, 2010 Опубликовано 10 ноября, 2010 (изменено) · Жалоба Уже получилось. __disable_interrupt() не надо было делать. Изменено 11 ноября, 2010 пользователем IgorKossak Бездумнейшее самоцитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 27 ноября, 2010 Опубликовано 27 ноября, 2010 · Жалоба Уже получилось. __disable_interrupt() не надо было делать. Да это не должно влиять вообще - у вас же происходит переход на адрес старта кода, в котором все собственно заново инициализируется. У меня предположение, что не были переназначены местоположения векторов NVIC... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться