我正在为基于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;
}
答案 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)