你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

《RT-Thread内核实现与应用开发实战指南》关于启动流程

[复制链接]
1209实验室@ujn 发布时间:2019-1-2 10:24
      关于RTOS的启动流程,大的框架来说,一般分为两种模式,如同火哥在书中所描述的,一种叫万事俱备,只欠东风;另一种则叫小心翼翼,十分谨慎。
  R  H- Z4 u& A6 t7 e; l      万事俱备,只欠东风:main函数中做初始化,硬件初始化OK,RTOS初始化OK,线程创建OK,所有东西都处于ready状态,就等调度器启动开始线程调度。
4 p0 n4 m+ I1 |6 Q      小心翼翼,十分谨慎:mian函数中只做硬件和RTOS的初始化,然后创建一个启动线程接着开启调度器,启动线程里面创建各种应用线程,启动线程只会被调度一次,所有线程创建好之后启动线程就会被删除。
( }% u( {  K+ Q. k+ N' D) g0 W      而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
3 T0 S: Q3 p/ N& C! I      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函数之前。
  g5 `/ G) E: e9 J! a7 a+ h7 p      然后是说如何实现执行的:# n/ V! ^" O, Z6 x4 w" n; Y
      以MDK平台为例,$Sub$$和$Super$$是MDK自带的用来扩展函数的符号,通常是成对使用。使用$Sub$$main可以在执行main之前先执行$Sub$$main,$Sub$$main函数中我们可以先执行一些系统初始化的预操作,当做完这些预操作之后通过调用$Super$$main来执行main函数。
9 L; S3 S7 K  z& c+ g8 F先执行int $Sub$$main(void)函数,rtthread_startup()函数里面是各种系统和硬件的初始化,以及启动线程
) O  o8 r9 q# c1 ^6 V1 t
  1. int $Sub$main(void)" v# \0 I- O( J
  2. {
    # v1 ?+ X% g7 j1 z& ~7 o6 ^
  3.     rt_hw_interrupt_disable();
    * G6 |7 C+ W: e; E' c9 }/ L5 C( W: F
  4.     rtthread_startup();  O. H, e2 X" U. F! V( ?) y" x
  5.     return 0;/ t, n9 ]  c6 z) g4 n9 m1 E
  6. }
复制代码
启动线程里面的main_thread_entry,当其他线程创建完之后 ,调用main_thread_entry线程,回到main函数。$ q& P* I  Q; }/ ?2 I9 M
  1. void main_thread_entry(void *parameter)
    % j" O/ P! o' j9 `$ C' [; N
  2. {
    ! J5 W# B" P0 l! Q2 w
  3. extern int $Super$main(void);8 r7 g* K% V8 q
  4. 1 ~" P; C! p& I
  5. /* RT-Thread components initialization */# H4 d/ E, a* I
  6. rt_components_init();, |- Q3 w, n$ |, J- p0 o
  7. $Super$main();
    8 ]- T$ A' r( U) H3 h+ g
  8. }
复制代码

9 F( P7 M( ?0 ]
8 P% S3 m6 D2 S& R4 Q. L2 ]
收藏 评论1 发布时间:2019-1-2 10:24

举报

1个回答
STMCU-管管 回答时间:2019-1-3 10:26:51
谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版