当前位置:网站首页>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()
资料
边栏推荐
- 立即升级!WPS Office 出现 0day 高危安全漏洞:可完全接管系统,官方推出紧急更新
- 【社媒营销】WhatsApp Business API:您需要知道的一切
- 开源一夏 | 云服务器ECS安装Mysql、JDK、RocketMQ
- Excel商业智能-Power BI电商数据分析实战
- unity2D横版游戏教程8-音效
- 数电快速入门(二)(复合逻辑运算和逻辑代数的基本定律的介绍)
- In which industries is the PMP certificate useful?
- Altium Designer 19.1.18 - Protecting Locked Objects
- input事件中文触发多次问题研究php DEBUG
- Develop your own text recognition application with Tesseract
猜你喜欢
[Linear Algebra 03] Elimination method display and 4 solutions of AX=b
零基础都能拿捏的七夕浪漫代码,快去表白或去制造惊喜吧
ES6高级-async的用法
第二讲 软件生命周期
【线性代数02】AX=b的2种解释和矩阵乘法的5种视角
2022强网杯web(部分)
unity2D横版游戏教程8-音效
As hot as ever, reborn | ISC2022 HackingClub White Hat Summit was successfully held!
NFT宝典:你需要知道NFT的术语和定义
Why is MySQL query slow?
随机推荐
开源一夏 | 云服务器ECS安装Mysql、JDK、RocketMQ
打卡第 2 天: urllib简记
# #ifndef/#define/#endif使用详解
炽热如初 向新而生|ISC2022 HackingClub白帽峰会圆满举办!
OC-归档(序列化)(了解的不多 没细看)
Exploration and Practice of Database Governance
LocalDate时间日期包的用法
硬件开发定制全流程解析
数电快速入门(二)(复合逻辑运算和逻辑代数的基本定律的介绍)
Qt面试题整理
Several ways for rk3399 to drive screen parameters
Domestic PMP certificate of gold content how
Milvus configuration related
Ramnit感染型病毒分析与处置
buu web
js data type, throttling/anti-shake, click event delegation optimization, transition animation
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd6 in position 120: invalid continuation byte
Codeforces Round #811 (Div. 3)
LocalDateTime的详细使用方法
VSCode - common shortcut keys (continuous recording