
关于RTOS的启动流程,大的框架来说,一般分为两种模式,如同火哥在书中所描述的,一种叫万事俱备,只欠东风;另一种则叫小心翼翼,十分谨慎。 万事俱备,只欠东风:main函数中做初始化,硬件初始化OK,RTOS初始化OK,线程创建OK,所有东西都处于ready状态,就等调度器启动开始线程调度。 小心翼翼,十分谨慎:mian函数中只做硬件和RTOS的初始化,然后创建一个启动线程接着开启调度器,启动线程里面创建各种应用线程,启动线程只会被调度一次,所有线程创建好之后启动线程就会被删除。 而RT-Thread的启动流程是按照第二种模式来的。4 B6 b4 }6 ]7 ~' {2 {( }1 M. n 一个正常的RT-Thread工程,main函数里直接就是创建并启动一些线程,看不到硬件初始化和系统初始化这些代码。因为这些初始化都mian函数之前执行了,具体代码在component.c里面。9 t7 y, m+ {/ U r) E5 K6 ? 一般Cortex-M启动的流程是这样:* G% W5 m% D; f9 ?6 ~7 m 1. 上电执行启动代码中的汇编复位函数Reset_Handler 2. Reset_Handler最后会调用C库函数__main,__main函数的主要工作是初始化系统的堆和栈' C0 V& B* q% E/ \ 3. __main函数最后调用C中的main函数,从而开始执行用户的App应用函数。& {* W' x& x0 w3 h, d, F 9 X! k; z& v+ `- R/ @ 但是在RT-Thread里面,会多了一些步骤,即前面所说的执行component.c里面的相关初始化代码。4 t. Q, q6 I; g# e$ `3 k4 K 首先是说在哪里执行:% G& v$ J: F. R9 X7 B" G component.c的代码执行位置在__main函数之后,main函数之前。 然后是说如何实现执行的:# n/ V! ^" O, Z6 x4 w" n; Y 以MDK平台为例,$Sub$$和$Super$$是MDK自带的用来扩展函数的符号,通常是成对使用。使用$Sub$$main可以在执行main之前先执行$Sub$$main,$Sub$$main函数中我们可以先执行一些系统初始化的预操作,当做完这些预操作之后通过调用$Super$$main来执行main函数。 先执行int $Sub$$main(void)函数,rtthread_startup()函数里面是各种系统和硬件的初始化,以及启动线程
|
谢谢分享 |
STM32F10xxx 正交编码器接口应用笔记 及源代码
基于STM32定时器ETR信号的应用示例
STM32 生态系统|基于STM32WB的低功耗蓝牙应用(一)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM32定时器触发SPI逐字收发之应用示例
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
【STM32图书分享之九】—《STM32F 32位ARM微控制器应用设计与实践》
无刷直流电机控制应用+基于STM8S系列单片机---电子书
STM32 USB的程序,包含固件、驱动和测试用的应用程序