我正在使用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
答案 0 :(得分:2)
裸机嵌入式程序的执行从复位向量指向的地址开始,或者可能在固定的复位地址处开始,该地址取决于平台。
在Cortex-M系列上,复位向量位于地址4,即闪存中的第二个4字节字(或RAM,具体取决于引导引脚)。读取此位置会为您提供重置地址,该地址指向重置后执行的第一个功能。此函数通常称为Reset_Handler
,它负责初始化全局变量,调用main()
之前需要调用的任何内容(包括SystemInit()
),最后将控制转移到{ {1}}。汇编源代码通常位于名为main()
或类似的文件中,具体取决于您的工具链。
您可以在startup_stm32f2xx.s
上设置断点,并查看全局变量的初始化方式。你不会看到相应的变量定义;它只是一个从flash复制到RAM的固定表(数据部分,初始值不是0的变量),其余部分用0填充(BSS部分)。要找出哪个变量属于哪个内存地址,可以参考链接器生成的Reset_Handler
文件。
答案 1 :(得分:0)
在main
函数开始运行之前,初始化全局数据。并且在定义时初始化的全局变量(如您显示的那些)实际上是由编译器初始化而在运行时根本不是。