实时操作系统 rtos nuttx 7.1 stm32 源代码分析

标签:
it |
分类: uCOS、NuttX、ROS、SYS/BIOS |
转载:嵌入式 实时操作系统 rtos nuttx 7.1 stm32 源代码分析)
(嵌入式 实时操作系统 rtos nuttx 7.1 stm32 源代码分析)
在《NuttX 启动流程》一文中提到, __start 是处理器执行的第一条指令。那么,为什么在 NuttX 中 __start 是处理器执行的第一条指令?为什么我要把 __start 称为“处理器执行的第一条指令”,而不是称为“程序入口点”?
nuttx/configs/shenzhou/scripts/ld.script:
这里的 ENTRY(_stext) 定义的程序入口点是 _stext。
nuttx/arch/arm/src/Makefile:
这里的 --entry=__start 在链接时重新指定了程序入口点为 __start。
在编译生成的 elf 文件 nuttx 的文件头中可以找到这个程序入口点的地址0x80003d1。
但是,这个程序入口点只对 elf 格式的文件有用,在非 elf 格式的祼机程序中,这个程序入口点不起作用,我们烧写到芯片 flash 中的格式为 .bin 或 .hex 的文件中没有这个程序入口点的定义。把这里的 __start 改成其它函数一样可以正常运行。
根据 cortex-m3 的定义,系统从 flash 启动时,0x08000004中的值就是 PC(程序计数器)的初始值,这才是真正起作用的,它决定了处理器执行的第一条指令。
nuttx.S:
使用《NuttX 安装脚本》一文中的方法安装 NuttX 后,反汇编文件 nuttx.S 位于 Linux 当前用户的主目录。这里的 PC 初始值是0x080003d1,指向 __start 函数的起始地址。
顺便说一下,向量表中的跳转地址都是奇数,这是因为 cortex-m3 是在Thumb状态下执行的。在向量表以外的地方,32位指令的跳转地址是奇数,16位指令的跳转地址是偶数。但指令的实际地址都是偶数,如0x080003d0。
nuttx/arch/arm/src/stm32/stm32_vectors.S:
这里的 .word __start
定义了 PC 的初始值。
__start 函数的声明与定义如下:
nuttx/arch/arm/src/stm32/stm32_vectors.S:
在汇编代码中声明了全局符号 __start,相当于声明了函数。
nuttx/arch/arm/src/stm32/stm32_start.c:
在 C 语言代码中定义了 __start 函数。
为什么 __start 是处理器执行的第一条指令?
转载请注明出处:http://blog.csdn.net/zhumaill/article/details/23426605在《NuttX 启动流程》一文中提到, __start 是处理器执行的第一条指令。那么,为什么在 NuttX 中 __start 是处理器执行的第一条指令?为什么我要把 __start 称为“处理器执行的第一条指令”,而不是称为“程序入口点”?
nuttx/configs/shenzhou/scripts/ld.script:
这里的 ENTRY(_stext) 定义的程序入口点是 _stext。
nuttx/arch/arm/src/Makefile:
这里的 --entry=__start 在链接时重新指定了程序入口点为 __start。
在编译生成的 elf 文件 nuttx 的文件头中可以找到这个程序入口点的地址0x80003d1。
但是,这个程序入口点只对 elf 格式的文件有用,在非 elf 格式的祼机程序中,这个程序入口点不起作用,我们烧写到芯片 flash 中的格式为 .bin 或 .hex 的文件中没有这个程序入口点的定义。把这里的 __start 改成其它函数一样可以正常运行。
根据 cortex-m3 的定义,系统从 flash 启动时,0x08000004中的值就是 PC(程序计数器)的初始值,这才是真正起作用的,它决定了处理器执行的第一条指令。
nuttx.S:
使用《NuttX 安装脚本》一文中的方法安装 NuttX 后,反汇编文件 nuttx.S 位于 Linux 当前用户的主目录。这里的 PC 初始值是0x080003d1,指向 __start 函数的起始地址。
顺便说一下,向量表中的跳转地址都是奇数,这是因为 cortex-m3 是在Thumb状态下执行的。在向量表以外的地方,32位指令的跳转地址是奇数,16位指令的跳转地址是偶数。但指令的实际地址都是偶数,如0x080003d0。
nuttx/arch/arm/src/stm32/stm32_vectors.S:
这里的 .word
__start 函数的声明与定义如下:
nuttx/arch/arm/src/stm32/stm32_vectors.S:
在汇编代码中声明了全局符号 __start,相当于声明了函数。
nuttx/arch/arm/src/stm32/stm32_start.c:
在 C 语言代码中定义了 __start 函数。