本帖最后由 ifree 于 2024-2-18 20:25 编辑
调试一天,发现一个Bootloader无法跳转掉带有RTX系统的App中的问题。
1、Bootloader代码
BootTest.zip
(13.15 MB, 下载次数: 1)
[C] 纯文本查看 复制代码 #define AppAddr 0x08100000
void DirectJumpToApp(void)
{
void (*AppJump)(void); /* 声明一个函数指针 */
/* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */
AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));
/* 设置主堆栈指针 */
__set_MSP(*(uint32_t *)AppAddr);
__set_CONTROL(0);
/* 跳转到系统App */
AppJump();
}
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参: 无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
DirectJumpToApp();
bsp_Init(); /* 硬件初始化 */
DemoFatFS(); /* SD卡测试 */
}
作为测试,main一加载就直接跳转到App中,这样的话应该算“干净”的Bootloader了。
2、裸机工程
BootAppTest.zip
(9.1 MB, 下载次数: 4)
直接改工程ROM到0x08100000,测试中,Bootloader可以正常跳转到该测试工程中运行。
3、用RTE创建的测试工程
RTX_AppTest.zip
(2.37 MB, 下载次数: 1)
(1)软件版本
MDK 5.38
ARM CMSIS 5.8.0
ARM_Compiler 1.7.2
MDK_Middleware 7.16.0
STM32H7xx DFP 2.8.0
(2) 测试1
该工程闪烁一个LED,通过串口每秒输出字符串"test app"。
将代码ROM设置为 0x0800 0000,下载到开发板,可以正常运行,实现功能。
(3) 测试2
将代码ROM设置为 0x0810 0000,下载到开发板,通过调试代码,发现最终直接停到这个main里面的while(1), 并不跳转到AppTaskStart任务当中去运行。
[C] 纯文本查看 复制代码 int main (void)
{
/* HAL库,MPU,Cache,时钟等系统初始化 */
System_Init();
/* 内核开启前关闭HAL的时间基准 */
HAL_SuspendTick();
/* 内核初始化 */
osKernelInitialize();
/* 创建启动任务 */
ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);
/* 开启多任务 */
osKernelStart();
while(1);
}
这里看上去是osKernelStart直接返回了,然后就卡到后面的while(1)里面了。
大佬们,可以帮忙看看到底是什么问题吗?
|