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

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

[复制链接]
1209实验室@ujn 发布时间:2019-1-2 10:24
      关于RTOS的启动流程,大的框架来说,一般分为两种模式,如同火哥在书中所描述的,一种叫万事俱备,只欠东风;另一种则叫小心翼翼,十分谨慎。
9 W& D2 Q+ h5 C+ E+ \. ~7 \( Z7 K* Z      万事俱备,只欠东风:main函数中做初始化,硬件初始化OK,RTOS初始化OK,线程创建OK,所有东西都处于ready状态,就等调度器启动开始线程调度。
  a, ~. G6 ]* `# ^0 E      小心翼翼,十分谨慎:mian函数中只做硬件和RTOS的初始化,然后创建一个启动线程接着开启调度器,启动线程里面创建各种应用线程,启动线程只会被调度一次,所有线程创建好之后启动线程就会被删除。6 l1 @9 K. |' r3 B- w( T' @6 P
      而RT-Thread的启动流程是按照第二种模式来的。
& S9 M' [5 n/ O* x4 _- l+ Y      一个正常的RT-Thread工程,main函数里直接就是创建并启动一些线程,看不到硬件初始化和系统初始化这些代码。因为这些初始化都mian函数之前执行了,具体代码在component.c里面。
5 d# m/ L2 F4 @# J9 d8 b/ g% K      一般Cortex-M启动的流程是这样:6 E% Q$ F2 n% o# ^- H# _& \) q
      1. 上电执行启动代码中的汇编复位函数Reset_Handler
3 i4 F( ]0 A1 O6 ~      2. Reset_Handler最后会调用C库函数__main,__main函数的主要工作是初始化系统的堆和栈
  {) T; h, N% g% [1 i9 ~, h; k. F      3. __main函数最后调用C中的main函数,从而开始执行用户的App应用函数。
5 S, \: D7 h1 M- d      4 `* ~: @+ n3 \+ H# [1 g! g9 v
      但是在RT-Thread里面,会多了一些步骤,即前面所说的执行component.c里面的相关初始化代码。
* g, Z: x: z# d6 W; u$ n      首先是说在哪里执行:* f6 c) l" |: u. d3 l
      component.c的代码执行位置在__main函数之后,main函数之前。# \8 o" t, Y. Q' |5 t8 K
      然后是说如何实现执行的:
; C% P2 P8 l& \) B: L+ O      以MDK平台为例,$Sub$$和$Super$$是MDK自带的用来扩展函数的符号,通常是成对使用。使用$Sub$$main可以在执行main之前先执行$Sub$$main,$Sub$$main函数中我们可以先执行一些系统初始化的预操作,当做完这些预操作之后通过调用$Super$$main来执行main函数。
+ g% c6 i+ Z9 P( c- j% t: p; J7 B先执行int $Sub$$main(void)函数,rtthread_startup()函数里面是各种系统和硬件的初始化,以及启动线程
/ h3 m. ]2 s& W6 ^
  1. int $Sub$main(void)  u  A8 Z: o, f) m$ D- L  G
  2. {
    # Z3 |/ C1 m6 r3 \* B
  3.     rt_hw_interrupt_disable();
    " M& m. P; L/ R0 N* E( R
  4.     rtthread_startup();
    / D+ ]6 K- ~4 n) ^  y4 u" x. X
  5.     return 0;
    ; p9 D4 W1 E- f/ k$ s* s) I+ E
  6. }
复制代码
启动线程里面的main_thread_entry,当其他线程创建完之后 ,调用main_thread_entry线程,回到main函数。
: y8 ^3 @/ D4 a" l/ t9 K
  1. void main_thread_entry(void *parameter)
    4 j$ g; \9 R% x. o6 h
  2. {
    % K, ^) s' D; U% N8 K
  3. extern int $Super$main(void);
    ( N3 \- f& \, H8 M" H, `

  4. 4 m  `( u2 g3 Q
  5. /* RT-Thread components initialization */
    ; u2 }/ `! v* p8 F0 I/ Z/ J9 _" I
  6. rt_components_init();( y$ a" c! z8 u
  7. $Super$main();$ {( R  V- }; G
  8. }
复制代码

& n9 y6 J- Y' f) f& |; M4 A  r+ h. o
收藏 评论1 发布时间:2019-1-2 10:24

举报

1个回答
STMCU-管管 回答时间:2019-1-3 10:26:51
谢谢分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版