IAP Bootloader无法加载RTX应用程序映像

时间:2016-09-02 07:32:58

标签: arm rtos keil cortex-m3 rtx

我将软件分为两部分: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)到目前为止工作正常。所以我只需要提供所需的任何信息。

这是第(3)项的调试图片。 enter image description here

1 个答案:

答案 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寄存器以指向其向量表的实际位置。

希望其中一个部分可以帮助您确定问题。