首页 > 其他分享 >RT-THREAD启动解析

RT-THREAD启动解析

时间:2022-10-19 20:12:09浏览次数:78  
标签:RT main THREAD init INIT EXPORT 解析 fn

疑问

RT-THREAD的DEMO工程在添加所有文件编译之后,完全没有用户自己去调用HAL库的代码,甚至连main函数里面都是空的,竟然可以正常运行。
当然是RT-THREAD做了其他操作来达到运行的效果。

启动解析

RESET之后第一时间的运行的是main函数虽然main函数里面是空,但是并不代表RT-THREAD没有运行代码

main函数重定向

先运行\$Sub$$main,来进行初始化,这样做的目的是为了适应不同的编译器,有些编译器的入口并不是main函数
在app初始化时再重新回调我们自己定义的main函数。

#ifdef __ARMCC_VERSION
extern int $Super$$main(void);
/* re-define main function */
int $Sub$$main(void)
{
    rtthread_startup();
    return 0;
}

\$Sub$$功能使用

板级初始化

在重定向main函数之后,会调用rt_hw_board_init来初始化board的功能,不同的板子实现方式不一样,现在我们这个函数是在drv_common.c这个文件里面实现,当然有些人在board.c里面实现也是没有问题,而且这个函数定义用的是RT_WEAK的类型,可重新定义。从源码中我们可以看出这个函数也是真正调用了相应的初始化代码。

RT_WEAK void rt_hw_board_init()
{
#ifdef BSP_SCB_ENABLE_I_CACHE
    /* Enable I-Cache---------------------------------------------------------*/
    SCB_EnableICache();
#endif

#ifdef BSP_SCB_ENABLE_D_CACHE
    /* Enable D-Cache---------------------------------------------------------*/
    SCB_EnableDCache();
#endif

    /* HAL_Init() function is called at the beginning of the program */
    HAL_Init();

    /* System clock initialization */
    SystemClock_Config();

    /* Heap initialization */
#if defined(RT_USING_HEAP)
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif

    /* Pin driver initialization is open by default */
#ifdef RT_USING_PIN
    rt_hw_pin_init();
#endif

    /* USART driver initialization is open by default */
#ifdef RT_USING_SERIAL
    rt_hw_usart_init();
#endif

    /* Set the shell console output device */
#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

    /* Board underlying hardware initialization */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
}

宏添加初始化操作

rt_components_board_init这个函数调用了用户独有的板级初始化代码,而调用的方式不是显示地调用,而是使用section定义的方式,将初始化函数定在相近的代码区,然后用函数指针的方式去调用相应的初始化函数。
具体的section操作可参考其他教程。
RT-Thread定义了很多相近的宏用于初始化以及添加新的线程(INIT_APP_EXPORT)来进行直接加任务,而不需要显示调用。

/* board init routines will be called in board_init() function */
#define INIT_BOARD_EXPORT(fn)           INIT_EXPORT(fn, "1")

/* pre/device/component/env/app init routines will be called in init_thread */
/* components pre-initialization (pure software initialization) */
#define INIT_PREV_EXPORT(fn)            INIT_EXPORT(fn, "2")
/* device initialization */
#define INIT_DEVICE_EXPORT(fn)          INIT_EXPORT(fn, "3")
/* components initialization (dfs, lwip, ...) */
#define INIT_COMPONENT_EXPORT(fn)       INIT_EXPORT(fn, "4")
/* environment initialization (mount disk, ...) */
#define INIT_ENV_EXPORT(fn)             INIT_EXPORT(fn, "5")
/* application initialization (rtgui application etc ...) */
#define INIT_APP_EXPORT(fn)             INIT_EXPORT(fn, "6")

通过以上的方式,完成板级初始化,同时创建主任务及空闲任务,开始系统的运行与调度。

总结

RT-THREAD通过重定向及宏的定义进行初始化,使代码本身更新的清晰可扩展性极好。理解之后还是一个很好的设计。

标签:RT,main,THREAD,init,INIT,EXPORT,解析,fn
From: https://www.cnblogs.com/stupidpeng/p/16799520.html

相关文章

  • ClickHouse 使用Primary Key原因以及为什么与 Sorting Key 不同
    官方地址首先选择主键原因SelectingthePrimaryKey​Thenumberofcolumnsintheprimarykeyisnotexplicitlylimited.Dependingonthedatastructure,you......
  • RestTemplate请求参数有MultipartFile[] 附件数组
    一、RestTemplate请求参数有MultiplateFile[]附件数组的情况,该如何处理二、代码示例@PostMapping("/testSendEmail")@ResponseBodypublicbooleantestSendEma......
  • 解决谷歌浏览器 Added non-passive event listener to a scroll-blocking 'touchsta
    1.问题描述:vue项目中使用ElementUI的表单form校验单的时候,出现以下警告:虽然他不会直接影响项目出现报错或者无法正常运行,但是这系列警告的存在就会为以后项目运行出现未......
  • osiThreadCallback 什么用途
    看下实现,就是给一个任务发送了一个事件。event有3个参数,第一个参数是回调,第2个参数是回调函数的实现,第3个参数是回调函数的参数。boolosiThreadCallback(osiThread_t*......
  • Tomcat startup.bat启动 控制台中文乱码问题
    一.问题背景以双击运行tomcat目录下startup.bat的方式启动tomcat程序。 控制台输出的中文提示信息都是乱码  二、问题原因windows默认编码集为GBK,由于使用s......
  • DNS域名解析及实验配置
    一,域名服务1,何为DNSDNS域名系统是因特网的一项核心服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用记住能够被机器直接读取的IP数......
  • EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT
    导读预训练语言模型在NLP的各个应用中都有及其广泛的应用;然而,经典的预训练语言模型(例如BERT)缺乏对知识的理解,例如知识图谱中的关系三元组。知识增强预训练模型使用外部知识(......
  • echarts图表y轴数据设置为固定值,等间距
    如图将Y轴设置为固定的0%20%----100%yAxis:{type:'value',max:100,//最大值mi......
  • python编程中的circular import问题
    循环引入,circularimport是编程语言中常见的问题,在C语言中我们可以使用宏定义来处理,在c++语言中我们可以使用宏定义和类的预定义等方式来解决,那么在python编程中呢? 其实在p......
  • 递归是会更秀strtok
    前几天发的字符串反转题目,后面有一个新同学用了递归的方法来实现,看了下,真的是很秀。之前字符串反转的题目代码如下#include"stdio.h"#include"string.h"charinput[]={"......