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

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

[复制链接]
1209实验室@ujn 发布时间:2019-1-2 10:24
      关于RTOS的启动流程,大的框架来说,一般分为两种模式,如同火哥在书中所描述的,一种叫万事俱备,只欠东风;另一种则叫小心翼翼,十分谨慎。
      万事俱备,只欠东风:main函数中做初始化,硬件初始化OK,RTOS初始化OK,线程创建OK,所有东西都处于ready状态,就等调度器启动开始线程调度。
      小心翼翼,十分谨慎:mian函数中只做硬件和RTOS的初始化,然后创建一个启动线程接着开启调度器,启动线程里面创建各种应用线程,启动线程只会被调度一次,所有线程创建好之后启动线程就会被删除。
      而RT-Thread的启动流程是按照第二种模式来的。
      一个正常的RT-Thread工程,main函数里直接就是创建并启动一些线程,看不到硬件初始化和系统初始化这些代码。因为这些初始化都mian函数之前执行了,具体代码在component.c里面。
      一般Cortex-M启动的流程是这样:
      1. 上电执行启动代码中的汇编复位函数Reset_Handler
      2. Reset_Handler最后会调用C库函数__main,__main函数的主要工作是初始化系统的堆和栈
      3. __main函数最后调用C中的main函数,从而开始执行用户的App应用函数。
     
      但是在RT-Thread里面,会多了一些步骤,即前面所说的执行component.c里面的相关初始化代码。
      首先是说在哪里执行:
      component.c的代码执行位置在__main函数之后,main函数之前。
      然后是说如何实现执行的:
      以MDK平台为例,$Sub$$和$Super$$是MDK自带的用来扩展函数的符号,通常是成对使用。使用$Sub$$main可以在执行main之前先执行$Sub$$main,$Sub$$main函数中我们可以先执行一些系统初始化的预操作,当做完这些预操作之后通过调用$Super$$main来执行main函数。
先执行int $Sub$$main(void)函数,rtthread_startup()函数里面是各种系统和硬件的初始化,以及启动线程
  1. int $Sub$main(void)
  2. {
  3.     rt_hw_interrupt_disable();
  4.     rtthread_startup();
  5.     return 0;
  6. }
复制代码
启动线程里面的main_thread_entry,当其他线程创建完之后 ,调用main_thread_entry线程,回到main函数。
  1. void main_thread_entry(void *parameter)
  2. {
  3. extern int $Super$main(void);

  4. /* RT-Thread components initialization */
  5. rt_components_init();
  6. $Super$main();
  7. }
复制代码


收藏 评论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 手机版