如何检查在引导加载程序项目中找到的应用程序请求

时间:2018-06-24 13:09:37

标签: c bootloader cortex-m

我正在为基于arm cortex m0的微控制器做一个Bootloader,为此,我经历了github中的一些项目,但我不理解以下代码中的某些内容。以下代码中的*(__IO uint32_t*)APP_ADDRESS) & ~(RAM_SIZE-1)行的含义是什么。如果有人解释这一点将是很棒的。提前致谢。

#define APP_ADDRESS     (uint32_t)0x08008000
#define RAM_SIZE        (uint32_t)0x00040000

uint8_t Bootloader_CheckForApplication(void)
{
    return ( ((*(__IO uint32_t*)APP_ADDRESS) & ~(RAM_SIZE-1)) == 0x20000000 ) ? BL_OK : BL_NO_APP;
}

1 个答案:

答案 0 :(得分:0)

我相信您在https://github.com/akospasztor/stm32-bootloader上引用了这个项目

Bootloader_CheckForApplication()的目的是确定来自APP_ADDRESS还是0x0800 8000的有效应用程序。该应用程序映像的开始实际上是vector table,因此值*(__IO uint32_t*)APP_ADDRESS是堆栈指针(SP)的初始值。 (该链接讨论了Cortex-M3,但所有Cortex-M处理器的向量表的前两个条目都相同)

您可以在https://github.com/akospasztor/stm32-bootloader/blob/master/Src/bootloader.c的同一源文件中的函数Bootloader_JumpToApplication()中看到此初始SP和复位向量的使用

请注意,作者使用的是STM32L4,其RAM的起始地址为0x2000 0000,最后一个地址为0x2003 FFFF,RAM大小为0x0004 0000。在这种情况下,Bootloader_CheckForApplication()正在检查存储的初始SP是否在RAM区域内。

但是,如果初始SP恰好是0x2004 0000(在这种情况下为最高有效值),则此检查将不正确。 (请注意,Cortex-M处理器使用full descending stack