关于RTOS的启动流程,大的框架来说,一般分为两种模式,如同火哥在书中所描述的,一种叫万事俱备,只欠东风;另一种则叫小心翼翼,十分谨慎。 万事俱备,只欠东风:main函数中做初始化,硬件初始化OK,RTOS初始化OK,线程创建OK,所有东西都处于ready状态,就等调度器启动开始线程调度。 小心翼翼,十分谨慎:mian函数中只做硬件和RTOS的初始化,然后创建一个启动线程接着开启调度器,启动线程里面创建各种应用线程,启动线程只会被调度一次,所有线程创建好之后启动线程就会被删除。6 l1 @9 K. |' r3 B- w( T' @6 P 而RT-Thread的启动流程是按照第二种模式来的。 一个正常的RT-Thread工程,main函数里直接就是创建并启动一些线程,看不到硬件初始化和系统初始化这些代码。因为这些初始化都mian函数之前执行了,具体代码在component.c里面。 一般Cortex-M启动的流程是这样:6 E% Q$ F2 n% o# ^- H# _& \) q 1. 上电执行启动代码中的汇编复位函数Reset_Handler 2. Reset_Handler最后会调用C库函数__main,__main函数的主要工作是初始化系统的堆和栈 3. __main函数最后调用C中的main函数,从而开始执行用户的App应用函数。 4 `* ~: @+ n3 \+ H# [1 g! g9 v 但是在RT-Thread里面,会多了一些步骤,即前面所说的执行component.c里面的相关初始化代码。 首先是说在哪里执行:* f6 c) l" |: u. d3 l component.c的代码执行位置在__main函数之后,main函数之前。# \8 o" t, Y. Q' |5 t8 K 然后是说如何实现执行的: 以MDK平台为例,$Sub$$和$Super$$是MDK自带的用来扩展函数的符号,通常是成对使用。使用$Sub$$main可以在执行main之前先执行$Sub$$main,$Sub$$main函数中我们可以先执行一些系统初始化的预操作,当做完这些预操作之后通过调用$Super$$main来执行main函数。 先执行int $Sub$$main(void)函数,rtthread_startup()函数里面是各种系统和硬件的初始化,以及启动线程
& |; M4 A r+ h. o |
谢谢分享 |
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
【STM32图书分享之九】—《STM32F 32位ARM微控制器应用设计与实践》
无刷直流电机控制应用+基于STM8S系列单片机---电子书
STM32 USB的程序,包含固件、驱动和测试用的应用程序
工业以太网总线ETHERCAT驱动程序设计及应用(扫描版)
【实战经验】STM32 DFSDM测量温度应用
【实战经验】基于STM32 I2S的音频应用开发介绍
【中文文档】AN4112_使用STM32F05xx模拟比较器的六个应用案例
[连载]STM32F103ZET6 uCGUI3.90a控件应用教程(第五节 复选框和单选按钮)