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

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

[复制链接]
1209实验室@ujn 发布时间:2019-1-2 10:24
      关于RTOS的启动流程,大的框架来说,一般分为两种模式,如同火哥在书中所描述的,一种叫万事俱备,只欠东风;另一种则叫小心翼翼,十分谨慎。+ D8 L& F# R3 l
      万事俱备,只欠东风:main函数中做初始化,硬件初始化OK,RTOS初始化OK,线程创建OK,所有东西都处于ready状态,就等调度器启动开始线程调度。# `  @& s3 a  r( I
      小心翼翼,十分谨慎:mian函数中只做硬件和RTOS的初始化,然后创建一个启动线程接着开启调度器,启动线程里面创建各种应用线程,启动线程只会被调度一次,所有线程创建好之后启动线程就会被删除。* k- a+ z' V# {) N+ c" r
      而RT-Thread的启动流程是按照第二种模式来的。
1 [. w7 f) x8 G      一个正常的RT-Thread工程,main函数里直接就是创建并启动一些线程,看不到硬件初始化和系统初始化这些代码。因为这些初始化都mian函数之前执行了,具体代码在component.c里面。$ S$ R& A/ S  T" @! E9 W- j1 b' t
      一般Cortex-M启动的流程是这样:
" i% c# i) j& c. n      1. 上电执行启动代码中的汇编复位函数Reset_Handler
& `; J/ B+ V' t! k+ N& N      2. Reset_Handler最后会调用C库函数__main,__main函数的主要工作是初始化系统的堆和栈
# n. Q/ p& x6 @: v1 z% `      3. __main函数最后调用C中的main函数,从而开始执行用户的App应用函数。
* J7 J. D1 Z- N- n      . _3 R7 `) }% _4 ?7 r$ U
      但是在RT-Thread里面,会多了一些步骤,即前面所说的执行component.c里面的相关初始化代码。3 i5 y" |8 `2 X: n5 f  t1 y. f
      首先是说在哪里执行:: Z- @  [# `# r0 Z1 f/ r
      component.c的代码执行位置在__main函数之后,main函数之前。  r1 U, G1 W+ B+ B$ m$ g3 J
      然后是说如何实现执行的:
: v- d1 f4 W1 Z3 b4 O- p! \      以MDK平台为例,$Sub$$和$Super$$是MDK自带的用来扩展函数的符号,通常是成对使用。使用$Sub$$main可以在执行main之前先执行$Sub$$main,$Sub$$main函数中我们可以先执行一些系统初始化的预操作,当做完这些预操作之后通过调用$Super$$main来执行main函数。  F- C, ^- N6 L1 m" `( m$ q
先执行int $Sub$$main(void)函数,rtthread_startup()函数里面是各种系统和硬件的初始化,以及启动线程
! d. H# N3 F* C  Y  e
  1. int $Sub$main(void)
    % p! F. b1 X1 I$ ~  m0 E1 Z; B
  2. {
    ' ~! p9 M" }7 t5 g
  3.     rt_hw_interrupt_disable();
    - X8 L) ^* j5 W0 x+ `7 `3 B
  4.     rtthread_startup();) N# E) _, d6 o, H: b3 t- s# B6 y3 _
  5.     return 0;8 _/ X. t$ r2 _$ W9 [
  6. }
复制代码
启动线程里面的main_thread_entry,当其他线程创建完之后 ,调用main_thread_entry线程,回到main函数。0 c: @0 ]- f2 j5 @+ K
  1. void main_thread_entry(void *parameter)' `- U" j- }  C! Y/ ?! Q
  2. {
    : i0 r0 J8 C; J# K: w
  3. extern int $Super$main(void);/ s9 H) B5 h/ x; f1 d# f) f5 O
  4. 3 |+ B( l8 D/ h" X& q, Y
  5. /* RT-Thread components initialization */& M, B0 P* a2 D( C
  6. rt_components_init();4 [- l$ W+ e3 E& t- O* j3 B
  7. $Super$main();
    0 f3 P  z4 t8 {/ A" r% I6 t% N
  8. }
复制代码

* F6 w2 r- x- Z4 W8 n9 R% l0 w. n( w, S( b0 s; b) d
赞 收藏 评论1 发布时间:2019-1-2 10:24

举报

1个回答
STMCU-管管 回答时间:2019-1-3 10:26:51
谢谢分享

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版