STM32
登录
直播中
费加罗
9年用户
886经验值
私信
关注
[问答]
如何对RT-Thread系统进行初始化呢
开启该帖子的消息推送
MDK
GCC
RT-Thread是如何启动的?
如何对RT-Thread系统进行初始化呢?
回帖
(1)
潘千
2021-11-30 14:45:57
前言
开一个专题,记录自己学习Rt-thread的过程。许多资料都是来源于之前的笔记和摘抄,有些文档和知识点具体的出处不记得了。如果有您的心血并未写明出处,请联系我。
以我自己学习Rt-thread的经历来说,这并不是一个很难的IOT-OS。只要有足够的耐心,是很容易入门的。而且对于一款国产RTOS而言。找资料是相对来说比较容易的。
这里是官网上给出的流程图
MDK 提供了扩展功能 Sub$ 和 Super$(其它平台也有类似的扩展功能,这里以最常用的MDK为例说明),可以给 main 添加 Sub$ 的前缀符号作为一个新功能函数 Sub$main,这个 Sub$main 可以先调用一些要补充在 main 之前的功能函数(这里添加 RT-Thread 系统初始化功能),再调Super$main 转到 main() 函数执行,这样可以让用户不用去管 main() 之前的系统初始化操作(详见ARM® Compiler v5.06 for µVision® armlink User Guide)。下面看RT-Thread启动过程如下图所示:
但是这里是给出的MDK环境下的流程 我使用的是RT-STUDIO IDE 直接使用GCC 编译的因此这里的起始过程有些不太一样。
我们直接打开工程的 startup_stm32f407xx.S 文件 去查看下我们的主函数入口在哪。
启动文件startup_stm32f407xx.S
startup_stm32f407xx.S 如下
截取startup_stm32f407xx.S 前半段 这里是汇编语言 学过微机原理 或者自己感兴趣的话 可以去研究一下 。不过这里的注释已经写清楚了一部分内容了。
首先我们 设置栈指针 sp 接着我们把flash中的data段和bss段搬运到 sram 中 注意这个bss段的值 全部被赋值为0了。 紧接着 开始 跳转到SystemInit 初始化 在接着跳转到entry (这个也就是我们应用程序的入口函数)。
我们来看下这个SystemInit 初始化
这里最重要的一句话是 配置矢量表位置添加偏移地址 具体的含义可以去查一下SCB寄存器。
entry: 程序入口函数
接下来就是我们最为关系的程序入口函数了
接下来的流程和官网上的就一样了了 这里在放一遍
我们最为关心的 就是这里的两个函数 一个是跟底层硬件相关的rt_hw_board_init,这也是我们移植时要重点实现的函数;另一个是跟应用程序相关的rt_application_init。
rt_hw_board_init:底层硬件相关
hw_board_init(BSP_CLOCK_SOURCE, BSP_CLOCK_SOURCE_FREQ_MHZ, BSP_CLOCK_SYSTEM_FREQ_MHZ);
这一句是时钟的初始化。 F427XX 是180MHz 自己去设置一下。
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
设置控制台设备 这是就是shell 运行时的控制台。
rt_components_board_init();
RT-Thread 自动初始化机制
如果有这方面的需求可以去了解下这里做了些什么动作。
从上面的代码可以看出rt_components_init函数依次调用执行RT-Thread自定义RTI符号段SECTION(".rti_fn."level)内从__rt_init_desc_rti_board_start到__rt_init_desc_rti_board_end的命令或函数,用户可以通过调用宏定义INIT_EXPORT(fn, level)将需要在启动时进行初始化的函数指针放到该RTI符号段中,形成一张初始化函数表(可以类比STM32的中断向量表)。
rt_application_init:应用程序相关
不论开没开heap 支持 应用程序入口都是一个线程
void main_thread_entry(void *parameter)
rt_application_init创建了一个主线程main_thread_entry,在该线程内部调用了组件初始化函数rt_components_init,然后进入main函数,开始执行用户代码,用户可以在main函数内添加自己的应用。
从上面的代码可以看出rt_components_init函数依次调用执行RT-Thread自定义RTI符号段SECTION(".rti_fn."level)内从__rt_init_desc_rti_board_end到__rt_init_desc_rti_end的命令或函数,用户可以通过调用宏定义INIT_EXPORT(fn, level)将需要在启动时进行初始化的函数指针放到该RTI符号段中,形成一张初始化函数表(可以类比STM32的中断向量表)。
RT-Thread还针对不同的level给出了相应的宏定义,代码如下:
main()
前言
开一个专题,记录自己学习Rt-thread的过程。许多资料都是来源于之前的笔记和摘抄,有些文档和知识点具体的出处不记得了。如果有您的心血并未写明出处,请联系我。
以我自己学习Rt-thread的经历来说,这并不是一个很难的IOT-OS。只要有足够的耐心,是很容易入门的。而且对于一款国产RTOS而言。找资料是相对来说比较容易的。
这里是官网上给出的流程图
MDK 提供了扩展功能 Sub$ 和 Super$(其它平台也有类似的扩展功能,这里以最常用的MDK为例说明),可以给 main 添加 Sub$ 的前缀符号作为一个新功能函数 Sub$main,这个 Sub$main 可以先调用一些要补充在 main 之前的功能函数(这里添加 RT-Thread 系统初始化功能),再调Super$main 转到 main() 函数执行,这样可以让用户不用去管 main() 之前的系统初始化操作(详见ARM® Compiler v5.06 for µVision® armlink User Guide)。下面看RT-Thread启动过程如下图所示:
但是这里是给出的MDK环境下的流程 我使用的是RT-STUDIO IDE 直接使用GCC 编译的因此这里的起始过程有些不太一样。
我们直接打开工程的 startup_stm32f407xx.S 文件 去查看下我们的主函数入口在哪。
启动文件startup_stm32f407xx.S
startup_stm32f407xx.S 如下
截取startup_stm32f407xx.S 前半段 这里是汇编语言 学过微机原理 或者自己感兴趣的话 可以去研究一下 。不过这里的注释已经写清楚了一部分内容了。
首先我们 设置栈指针 sp 接着我们把flash中的data段和bss段搬运到 sram 中 注意这个bss段的值 全部被赋值为0了。 紧接着 开始 跳转到SystemInit 初始化 在接着跳转到entry (这个也就是我们应用程序的入口函数)。
我们来看下这个SystemInit 初始化
这里最重要的一句话是 配置矢量表位置添加偏移地址 具体的含义可以去查一下SCB寄存器。
entry: 程序入口函数
接下来就是我们最为关系的程序入口函数了
接下来的流程和官网上的就一样了了 这里在放一遍
我们最为关心的 就是这里的两个函数 一个是跟底层硬件相关的rt_hw_board_init,这也是我们移植时要重点实现的函数;另一个是跟应用程序相关的rt_application_init。
rt_hw_board_init:底层硬件相关
hw_board_init(BSP_CLOCK_SOURCE, BSP_CLOCK_SOURCE_FREQ_MHZ, BSP_CLOCK_SYSTEM_FREQ_MHZ);
这一句是时钟的初始化。 F427XX 是180MHz 自己去设置一下。
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
设置控制台设备 这是就是shell 运行时的控制台。
rt_components_board_init();
RT-Thread 自动初始化机制
如果有这方面的需求可以去了解下这里做了些什么动作。
从上面的代码可以看出rt_components_init函数依次调用执行RT-Thread自定义RTI符号段SECTION(".rti_fn."level)内从__rt_init_desc_rti_board_start到__rt_init_desc_rti_board_end的命令或函数,用户可以通过调用宏定义INIT_EXPORT(fn, level)将需要在启动时进行初始化的函数指针放到该RTI符号段中,形成一张初始化函数表(可以类比STM32的中断向量表)。
rt_application_init:应用程序相关
不论开没开heap 支持 应用程序入口都是一个线程
void main_thread_entry(void *parameter)
rt_application_init创建了一个主线程main_thread_entry,在该线程内部调用了组件初始化函数rt_components_init,然后进入main函数,开始执行用户代码,用户可以在main函数内添加自己的应用。
从上面的代码可以看出rt_components_init函数依次调用执行RT-Thread自定义RTI符号段SECTION(".rti_fn."level)内从__rt_init_desc_rti_board_end到__rt_init_desc_rti_end的命令或函数,用户可以通过调用宏定义INIT_EXPORT(fn, level)将需要在启动时进行初始化的函数指针放到该RTI符号段中,形成一张初始化函数表(可以类比STM32的中断向量表)。
RT-Thread还针对不同的level给出了相应的宏定义,代码如下:
main()
举报
更多回帖
rotate(-90deg);
回复
相关问答
MDK
GCC
RT-thread
的
初始化
过程是怎样
进行
的
2021-11-29
1767
对
rt-thread
嵌入式
系统
中的串口
初始化
过程梳理
2021-12-15
1550
RT-Thread
在BSS段清零后就
初始化
C++构造有什么作用
呢
2022-03-21
2795
如何对RTOS
系统
时钟(滴答定时器)
进行
初始化
呢
2021-11-30
2719
怎样去移植基于STM32F767的
RT-Thread
操作
系统
呢
2021-11-26
2031
如何基于CubeMX移植
RT-Thread
Nano?
2021-03-29
2456
RT-Thread
从stop2模式被rtc唤醒后需要重新
初始化
吗
2022-07-05
3168
RT-Thread
Studio潘多拉使用EasyFlash
初始化
失败咋办?
2023-01-30
1252
rt-thread
是否有类似ucosii的OSRunning标志或措施来保护
rt
_tick_increase()函数的调用
呢
2022-09-01
2518
想在
RT-Thread
系统
启动前调用延时函数怎么处理
呢
2022-09-01
1245
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分