Eclipse-Debug
Eclipse-Debug+启动分析
编译生成eclipse工程
在app目录下
west build -b stm32f429i_disc1 -- -G"Eclipse CDT4 - Ninja"
导入eclipse工程并Debug
这里不再记录,百度即可
分析程序入口地址
打开build – zephyr目录 找到zephyr.lst
在前面可以看到:
Disassembly of section rom_start:
08000000 <_vector_table>:
8000000: 20 08 00 20 81 14 00 08 65 2c 00 08 ad 14 00 08 .. ....e,......
8000010: ad 14 00 08 ad 14 00 08 ad 14 00 08 00 00 00 00 ................
...
800002c: dd 12 00 08 ad 14 00 08 00 00 00 00 89 12 00 08 ................
800003c: d9 10 00 08 ....
08000040 <_irq_vector_table>:
8000040: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000050: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000060: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000070: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000080: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000090: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
80000a0: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
80000b0: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
80000c0: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
80000d0: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
80000e0: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
80000f0: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000100: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000110: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000120: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000130: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000140: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000150: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000160: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000170: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000180: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
8000190: 59 14 00 08 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...Y...
80001a0: 59 14 00 08 59 14 00 08 59 14 00 08 Y...Y...Y...
从这里可以看出当前的向量表地址在0x08000000处,根据ARMv7M的架构手册可以知道:
向量表偏移(4个字节) | 内容 | 说明 |
---|---|---|
0 | 0x20000820 | 复位后的MSP的值 |
1 | 0x08001481 | Reset异常的入口地址LSB=1表示当前地址处的指令为Thumb指令集 |
2 | 0x08002c65 | NMI异常的入口地址 |
3 – 6 | 0x080014ad | HardFault MemManage BusFault UsageFault |
7–10 | 0 | 保留 |
11 | 0x080012dd | SVCall |
12 | 0x080014ad | Debug Monitor |
13 | 0 | 保留 |
14 | 0x08001289 | PendSV |
15 | 0x080010d9 | SysTick |
16 – … | 0x08001459 | 芯片外设中断 |
从上面整理的异常向量表中可以知道:
1. 程序的入口地址在0x08001480处
2. 系统级别的外设中断都有其自己的处理函数
3. 外设级别的中断入口是统一的入口地址
reset.S 分析
从程序的reset的入口地址处分析程序第一个执行的代码为zephyr/arc/arm/core/aarch32/cortex_m/reset.S
- 屏蔽所有外设中断-- basepri 为0x10
- 设置PSP并使用PSP为boot的栈指针
- 执行z_arm_prep_c函数-- zeyphr/arc/arm/core/aarch32/prep_c.c
prep_c.c c环境的准备
- 重定向向量表,这里仍然定位为0x08000000
- 初始化bss段
- 初始化数据段
- 中断初始化,初始化所有中断优先级
- 执行z_cstart函数 – zephyr/kernel/init.c
init.c
- 内核初始化–架构相关
- 硬件初始化–_SYS_INIT_LEVEL_PRE_KERNEL_1级别
- soc.c里的init
- clock_stm32_ll_common.c中的 stm32_clock_control_init()
- intc_exti_stm32.c中的stm32_exti_init() 初始化exti中断
- uart_stm32.c中的uart_stm32_init() 初始化uart外设
- uart_console.c中的uart_console_init() 初始化uart_console
- 硬件初始化 _SYS_INIT_LEVEL_PRE_KERNEL_2级别
- cortex_m_systick.c中的z_clock_driver_init() 初始化systick
- gpio_stm32.c中的gpio_stm32_afio_init()
- prepare_multithreading()
- switch_to_main_thread()
![drawing](https://img-blog.csdnimg.cn/f837a7dcfd1a4318aaca64f5adb5eb05.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAQmVydGVfWXU=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center#pic_center)