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

《RT-Thread内核实现与应用开发实战指南》读书笔记-RT-thread...

[复制链接]
damiaa 发布时间:2018-12-4 11:59
本帖最后由 damiaa 于 2018-12-4 12:09 编辑

《RT-Thread内核实现与应用开发实战指南》读书笔记-RT-THREAD启动
搞硬件的就是这么不放心,第一点必须要搞清楚CPU怎么开始动起来的,然后操作系统又是怎么开发跑起来的。
于是就跳过了N章,直接到第16章RT-THREAD启动流程 (前面的章节主要讲概念,慢慢理解,不急)。
这里只有书本内容,但我们看书也可以变通一下。调用一个例子对照。
比如官网的rtthread_simulator_v0.1.0例子。或者本书配套的17,线程管理例子。这样就比较好理解,也印象深刻一点。16章的开始就给我们介绍了两种风格的初始硬件和操作系统创建线程的操作系统方法。
一种是万事俱备,只欠东风
  1. int main(void)
  2. {
  3.     /*硬件初始化*/
  4.    HardWare_Init();
  5.     /*RTOS 系统初始化*/
  6.    RT_Init();
  7.    /*创建线程*/
  8.    RTOS_ThreadCreate(Task1);
  9.    RTOS_ThreadCreate(Task1);
  10.    //...
  11.   RTOS_Start();
  12. }
复制代码


第二种是小心翼翼,十分谨慎
  1. int main(void)
  2. {
  3. /*硬件初始化*/
  4. HardWare_Init();
  5. /*RTOS 系统初始化*/
  6. RT_Init();
  7. /*创建线程*/
  8. RTOS_ThreadCreate(AppThreadStart);
  9. //启动RTOS,开始调度
  10. RTOS_Start();
  11. }
  12. //AppThreadStart线程再创建线程,然后删除自己
  13. void AppThreadStart(void *arg)
复制代码


很有意思,还介绍了它们的优缺点,并介绍 UCOS freertos rt-thread是 怎么用的。
然后开始介绍RT-THREAD的启动流程
start-stm32xxxxxx.s:
  1. ; Reset handler
  2. Reset_Handler    PROC
  3.                  EXPORT  Reset_Handler             [WEAK]
  4.         IMPORT  SystemInit
  5.         IMPORT  __main

  6.                  LDR     R0, =SystemInit
  7.                  BLX     R0
  8.                  LDR     R0, =__main
  9.                  BX      R0
  10.                  ENDP
复制代码
书中给我们介绍了这里执行后会跳到commponet.c中的$Sub$$main函数:因为编译器使用$Sub$$或$Super$$扩展main函数。$Sub$$main函数可以在
main函数前面做些事情。那我们就到commponet.c去看一下(记得前面说的还是搞个工程对照好,可以加深印象)。
  1. int $Sub$main(void)
  2. {
  3.     rt_hw_interrupt_disable();
  4.     rtthread_startup();
  5.     return 0;
  6. }
复制代码
关中断,然后启动RT-THREAD!!!
我们也可以跳到rtthread_startup();看看它干了些什么!!!
  1. int rtthread_startup(void)
  2. {
  3.     rt_hw_interrupt_disable();

  4.     /* board level initalization
  5.      * NOTE: please initialize heap inside board initialization.
  6.      */
  7.     rt_hw_board_init();

  8.     /* show RT-Thread version */
  9.     rt_show_version();

  10.     /* timer system initialization */
  11.     rt_system_timer_init();

  12.     /* scheduler system initialization */
  13.     rt_system_scheduler_init();

  14. #ifdef RT_USING_SIGNALS
  15.     /* signal system initialization */
  16.     rt_system_signal_init();
  17. #endif

  18.     /* create init_thread */
  19.     rt_application_init();

  20.     /* timer thread initialization */
  21.     rt_system_timer_thread_init();

  22.     /* idle thread initialization */
  23.     rt_thread_idle_init();

  24.     /* start scheduler */
  25.     rt_system_scheduler_start();

  26.     /* never reach here */
  27.     return 0;
  28. }
复制代码
其实这里我们也可以运行一个例子如:rtthread_simulator_v0.1.0,看看启动的时候有没有和上面一样
最后 我们看看本书配套的17,线程管理例子看看int main()函数

复制代码
  1. int main(void)
  2. {        
  3.     /*
  4.          * 开发板硬件初始化,RTT系统初始化已经在main函数之前完成,
  5.          * 即在component.c文件中的rtthread_startup()函数中完成了。
  6.          * 所以在main函数中,只需要创建线程和启动线程即可。
  7.          */
  8.    rt_kprintf("这是一个[野火]-STM32F767-挑战者RTT线程管理实验!\n\n");
  9.    rt_kprintf("按下K1挂起线程,按下K2恢复线程\n");
  10.         led1_thread =                          /* 线程控制块指针 */
  11.     rt_thread_create( "led1",              /* 线程名字 */
  12.                       led1_thread_entry,   /* 线程入口函数 */
  13.                       RT_NULL,             /* 线程入口函数参数 */
  14.                       512,                 /* 线程栈大小 */
  15.                       3,                   /* 线程的优先级 */
  16.                       20);                 /* 线程时间片 */
  17.                   
  18.     /* 启动线程,开启调度 */
  19.     if (led1_thread != RT_NULL)
  20.         rt_thread_startup(led1_thread);
  21.     else
  22.         return -1;
  23.    
  24.     key_thread =                          /* 线程控制块指针 */
  25.     rt_thread_create( "key",              /* 线程名字 */
  26.                       key_thread_entry,   /* 线程入口函数 */
  27.                       RT_NULL,             /* 线程入口函数参数 */
  28.                       512,                 /* 线程栈大小 */
  29.                       2,                   /* 线程的优先级 */
  30.                       20);                 /* 线程时间片 */
  31.                   
  32.     /* 启动线程,开启调度 */
  33.    if (key_thread != RT_NULL)
  34.         rt_thread_startup(key_thread);
  35.     else
  36.         return -1;
  37. }
复制代码


这样读书&看代码。就熟悉了RT-THREAD的启动流程。先写到这里。谢谢。 火哥的书通俗易懂!!!


评分

参与人数 1 ST金币 +20 收起 理由
STMCU + 20

查看全部评分

收藏 评论3 发布时间:2018-12-4 11:59

举报

3个回答
andey 回答时间:2018-12-4 12:08:24
提示: 作者被禁止或删除 内容自动屏蔽
damiaa 回答时间:2018-12-4 12:10:09

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