我将软件分为两部分:Bootloader(不带RTX),带RTX的应用程序图像。 但是引导加载程序无法使用RTX加载应用程序映像。 Flash设置为:
-------------------------------------------------------------------- start address size IROM 1: 0x08000000 0x2800 - Bootloader (without RTX) IROM 2: 0x08002800 0xD000 - Application Image (with RTX)
我测试了3种方法: (1)使用另一个没有RTX的应用程序。引导加载程序可以成功加载应用程序。
(2)使用RTX项目IROM设置更改应用程序。我将应用程序项目IROM起始地址从0x08002800更改为0x08000000。然后我将应用程序映像从地址0x08000000下载到闪存中。我的图像可以成功地从0x08000000运行。
(3)应用程序映像IROM起始地址设置为0x08002800。将bootloader和app image下载到flash后,我逐步调试keil中的app项目。我发现有一个" osTimerthread堆栈溢出"错误。然后主线程堆栈也溢出。我试图增加堆栈大小,但它不起作用。 我发现应用程序在RTX内核切换中很明显。所有线程都处于等待状态,并且没有运行。
Ps,当我在keil中调试时,测试项(2)在内核初始化期间也有堆栈溢出错误。项目(2)到目前为止工作正常。所以我只需要提供所需的任何信息。
答案 0 :(得分:0)
您是否实际上将链接描述文件更改为在使用引导加载程序时从0x08002800
开始链接,或者仅在0x08000000
的偏移处加载应用程序(在0x2800
处链接)?仔细检查(在地图文件中查看)链接的输出,以确保所有符号都未在0x08000000 - 0x08002800
范围内链接。
此外,请确保使用正确的入口点和堆栈指针。应用程序的堆栈指针应位于0x08002800
,重置向量将位于0x08002804
。在跳转到应用程序之前,您的引导加载程序需要使用正确的堆栈指针设置MSP
寄存器。以下是ST& USB DFU引导加载程序的一些示例代码:
typedef void (*pFunction)(void); pFunction JumpToApplication; uint32_t JumpAddress; /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4); JumpToApplication = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD); JumpToApplication();
此外,根据您在跳转到应用程序之前配置的引导加载程序的数量,您可能需要取消配置'某些外围设备。例如,如果在决定跳转到应用程序之前在引导加载程序中设置时钟,则如果它假定时钟已经处于默认配置中,则可能会在应用程序中遇到问题。如果您的引导加载程序在跳转到应用程序之前使用这些内容,NVIC和SysTick会发生类似的事情。
最后,沿着与上一节相同的行,应用程序可能会假设外围设备的状态是默认的,但也可能假设外设默认值是正确的。例如:SCB->VTOR
有一个默认值(我相信它总是0x00000000
),这指向向量表。您的引导加载程序将链接到该位置的向量表。您需要确保在应用程序启动时,它会更新VTOR
寄存器以指向其向量表的实际位置。
希望其中一个部分可以帮助您确定问题。