潮声隔雨深 · 2020年03月08日

Mbed OS启动问题

本人最近在学习Mbed OS设备上电后如何运行至main函数的过程,遇到了些问题,望了解知道的人多多指教,谢谢。

我使用的是gcc编译器,参考了mbed_boot.c文件中启动流程说明。

问题如下:

(1)_start中执行了什么操作,以及如何跳转mbed_boot.c文件下的software_init_hook函数。

(2)__libc_init_array函数干了什么操作。

上电:
1.执行复位中断函数Reset_Handler
-->SystemInit函数:设置内核系统时钟和总线时钟
-->_start
2.跳转mbed_boot.c文件下的software_init_hook函数
-->mbed_set_stack_heap函数:设置mbed操作系统的堆栈空间
-->mbed_cpy_nvic函数:复制向量中断表至RAM
-->mbed_sdk_init函数:
-->osKernelInitialize函数:初始化RTOS内核

  -->__svcKernelInitialize函数: 
  -->初始化osRtxInfo
  -->初始化内存池
  -->SVC_Initialize函数:初始化SVC和PendSV系统服务调用

-->mbed_start_main函数:

  -->新建pre_main线程
  -->osKernelStart函数:启动RTOS内核调度程序
        -->__svcKernelStart函数:
        -->创建空闲线程osRtxIdleThread
        -->创建定时器线程osRtxTimerThread
        -->OS_Tick_Setup函数:设置RTOS时间滴答
        -->OS_Tick_Enable函数:使能RTOS时间滴答
        -->osRtxInfo切换到ready状态,优先级最高

3.pre_main线程

  -->__libc_init_array函数
  -->转到main函数

4.main

1 个回答 得票排序 · 时间排序
一知半解 · 2020年03月08日

(1)_start 是属于GCC编译器中标准库的函数, 存在于crt0.o 里面,可以查看该库的符号表,它自己会执行一系列的初始化操作。在该库函数里面,会调用到software_init_hook,把执行权交回mbed_boot
11111.png
在编译的过程中,也可以指定"-nostdlib", 这样就不会链接标准库,但是_start 就必须自己来实现,否则链接阶段会报错。

(2)__libc_init_array , 主要是用来定义C/C++ 中的对象的 创建和销毁相关的动作,可以参考文章: https://stackoverflow.com/que...

如果想要更详细的深入了解,就得去看编译器标准库的实现了。

你的回答