[英]Why is my STM32 program not starting at the first line?
我正在使用 arm-none-eabi-gdb,并且我正在研究 STM32F2xx。 它应该从第一行开始,但是我发现它跳过了一些行。
uint32_t SystemCoreClock = 12000000;
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
void SystemInit(void)
{
/* Reset the RCC clock configuration to the default reset state ------------ */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset CFGR register */
RCC->CFGR = 0x00000000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset PLLCFGR register */
RCC->PLLCFGR = 0x24003010;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
在我的 gdb 调试中,它开始如下:
(gdb) tar ext:4242
Remote debugging using :4242
0x08000354 in SystemInit () at system_stm32f2xx.c:154
154 RCC->CR &= (uint32_t)0xFFFBFFFF;
(gdb)
哪个不是从 uint32_t SystemCoreClock = 12000000; 开始的?
在这里编辑:我的后续问题是,即使变量在运行过程中被忽略,为什么它没有启动@ RCC->CR |= (uint32_t)0x00000001;? 谢谢
而我的 CFLAGS 作为
CFLAGS += -fno-common -Wall -O0 -g -mcpu=cortex-m3 -mthumb
CFLAGS += -ffunction-sections -fdata-sections
裸机嵌入式程序的执行从复位向量指向的地址开始,或者可能在固定的复位地址处开始,这取决于平台。
在 Cortex-M 系列上,复位向量位于地址 4,即闪存(或 RAM,取决于引导引脚)中的第二个 4 字节字。 读取此位置为您提供重置地址,该地址指向重置后执行的第一个函数。 该函数通常称为Reset_Handler
,它负责初始化全局变量,调用main()
之前需要调用的任何内容(包括SystemInit()
),最后将控制权交给main()
。 汇编源代码通常位于名为startup_stm32f2xx.s
或类似的文件中,具体取决于您的工具链。
您可以在Reset_Handler
上设置断点,并查看全局变量是如何初始化的。 但是,您不会看到相应的变量定义; 它只是一个从闪存复制到 RAM 的固定表(数据部分,初始值不是 0 的变量),并用 0 填充其余部分(BSS 部分)。 要找出哪个变量属于哪个内存地址,可以查阅链接器生成的.map
文件。
全局数据在main
函数开始运行之前被初始化。 在定义时初始化的全局变量(如你展示的那些)实际上是由编译器初始化的,而不是在运行时初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.