当前位置:网站首页>Rt-thread [二] 系统初始化流程
Rt-thread [二] 系统初始化流程
2022-08-04 21:54:00 【民谣唱给爱人听丶】
Rt-thread [二] 系统初始化流程
前言
开一个专题,记录自己学习Rt-thread的过程。许多资料都是来源于之前的笔记和摘抄,有些文档和知识点具体的出处不记得了。如果有您的心血并未写明出处,请联系我。
邮箱:[email protected]
微信:18852982072
以我自己学习Rt-thread的经历来说,这并不是一个很难的IOT-OS。只要有足够的耐心,是很容易入门的。而且对于一款国产RTOS而言。找资料是相对来说比较容易的。
这里是官网上给出的流程图
MDK 提供了扩展功能 S u b Sub Sub$ 和 S u p e r Super Super$(其它平台也有类似的扩展功能,这里以最常用的MDK为例说明),可以给 main 添加 S u b Sub Sub$ 的前缀符号作为一个新功能函数 S u b Sub Sub$main,这个 S u b Sub Sub$main 可以先调用一些要补充在 main 之前的功能函数(这里添加 RT-Thread 系统初始化功能),再调用 S u p e r Super 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()
资料
边栏推荐
- 遍历await方法的区别:以for和forEach为例
- Named routes, the role of name in components
- mysql基础
- 零基础都能拿捏的七夕浪漫代码,快去表白或去制造惊喜吧
- Altium Designer 19.1.18 - draw polygons copper hollow out, for the cursor just capture solutions
- Webmine Webpage Mining Trojan Analysis and Disposal
- VSCode—常用快捷键(持续记录
- unity2D横版游戏教程8-音效
- UDP通信
- 未知点云结构文件转换需求
猜你喜欢
[larave]关于laravel使用form submit()不能获取值问题
Open source summer | Cloud server ECS installs Mysql, JDK, RocketMQ
数电快速入门(四)(组合逻辑电路的分析以及设计的介绍)
rk3399-9.0 first-level and second-level dormancy
七夕,当爱神丘比特遇上牛郎和织女
【QT】回调函数的实现
Rocketchip RISC-V Debug调试硬件相关(四)hartIsInReset
打卡第 1 天:正则表达式学习总结
七夕特制:《牛郎会织女》
Oracle增加表空间解决ORACLE ORA-01653: unable to extend table报错
随机推荐
开源一夏 | 云服务器ECS安装Mysql、JDK、RocketMQ
Autowired自动装配
七夕,当爱神丘比特遇上牛郎和织女
信创是什么意思?涉及哪些行业?为什么要发展信创?
中大型商业银行堡垒机升级改造方案!必看!
【uiautomation】微信好友列表获取(存储到txt中)
【线性代数02】AX=b的2种解释和矩阵乘法的5种视角
Go----Go 语言基础之标识符、关键字、命名规范、变量、常量
【QT】回调函数的实现
How to solve the problem that the alarm information cannot be transmitted after EasyGBS is connected to the latest version of Hikvision camera?
Why is MySQL query slow?
硬件开发定制全流程解析
ES6高级-async的用法
VSCode - common shortcut keys (continuous recording
Yolov7:Trainable bag-of-freebies sets new state-of-the-art for real-time objectdetectors
unity2D横版游戏教程9-对话框dialog
国际项目管理师PMP证书,值得考嘛?
Cocoa Application-test
Driving point cloud format changes bring efficiency improvement
rk3399-9.0 first-level and second-level dormancy