为什么我的STM32程序没有从第一行开始?

时间:2017-01-19 09:17:22

标签: c gdb stm32

我正在使用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

2 个答案:

答案 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函数开始运行之前,初始化全局数据。并且在定义时初始化的全局变量(如您显示的那些)实际上是由编译器初始化而在运行时根本不是。