OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3383|回复: 2

个人学习RT-Thread内核心得(一)——内核基础

[复制链接]

55

主题

134

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2018-8-7
在线时间
55 小时
发表于 2019-3-8 18:10:33 | 显示全部楼层 |阅读模式
本帖最后由 Fillmore 于 2019-3-8 18:17 编辑

第一次系统性的学习RTThread,将个人所学到的东西分享在这里,希望大家多多指点和批评,互相进步,互相提高。主要参考RT-Thread快速入门文档、RT-Thread内核实现与应用开发实战指南——基于*火STM32全系列(M3/4/7)开发板、RT-THREAD编程指南、内核实验手册、网上查询的资料,学习使用的是内核示例代码。

内核示例代码(官网文档中也有下载链接:https://www.rt-thread.org/document/site/) 附件传不上来QAQ

首先打开代码后对其进行仿真
1 R4 w9 C; F" d; M+ o打开串口界面;开始运行可看到RT-Thread标志将程序进行复位,对其进行单步处理,可看到程序的起始函数为:: |$ }8 r0 z, ?; h2 G
  • int $Sub$main(void)
  • {
  •     rt_hw_interrupt_disable();//关闭系统中所有的中断
  •     rtthread_startup();//启动线程
  •     return 0;
  • }

说明程序真正的起始函数为$Sub$main(void)。程序第一步为关闭系统中断,这保证了当前线程或代码不会被其他中断事件所打断,保证了系统初始化的安全性和稳定性。rt_hw_interrupt_disable()函数在context_rvds.S文件中进行定义,返回中断前的系统中断状态。3 W- E) N& d3 e; g* Y
查看rtthread_startup()函数定义,看到系统初始化函数为:+ h: R) E# ?7 U( |


个系统初始化步骤为:0 Z2 h2 M4 J+ ^* b$ \9 D: D' R
1. 初始化与系统相关的硬件、系统内存堆:rt_hw_board_init()
) A- A( ^1 l& x# `8 J0 X2.初始化系统内核对象:定时器、调度器、信号量等:rt_system_timer_init();     rt_system_scheduler_init();     rt_system_signal_init();
0 B' g5 J) ^, B  x; l3.创建main线程,在main线程中用户可以自己创建相关应用:rt_application_init();- G2 v" C, n; K/ c+ i
4.初始化系统定时器线程、空闲线程,启动调度器:rt_system_timer_thread_init();     rt_thread_idle_init();     rt_system_scheduler_start();! |1 d& {' c  m' {
7 S3 S+ |" Z  F3 t7 S5 P
一般MCU的存储空间=片内Flash(硬盘)+片内RAM(内存)。程序编译完成后会生成一个.map文件,来说明各函数的尺寸和地址,在map文件最后会显示出代码的相关存储信息。RO Size=Code+RO-data:程序所占用Flash空间的大小=代码段(程序代码)+只读数据段(程序定义的常量)$ i; T& i6 l; N; J
RW Size=RW-data+ZI-data:运行时占用的RAM空间大小=读写数据段(非0值的全局变量)+0数据段(未初始化的全局变量+初始化为0的变量)
9 }) ?  t; S' n; q" ~$ tROM Size=Code+RO Data+RW Data:表示烧写程序所占用的Flash空间的大小0 V' h  ^  Q! i# X& E, O
同时还会生成烧录进单片机的可执行映射文件:.bin文件或者.hex文件=RO Size+RW Size% P/ a7 @2 P: d& u' k' T" D
关系图如下所示:8 R) m, z; B1 _6 O



单片机上电后:1、默认Flash启动;2、将RW段的RW-data放到RAM中,不搬运RO-data和Code,执行代码时候CPU直接读取Flash;3、根据ZI地址和大小分配ZI段 ,将RAM区域请0。# j' O6 D, T& Z
其中系统最初初始化的动态内存堆为未使用的RAM,应用程序申请和释放的内存块都来自该空间。
$ \) Z4 _; H# }/ e
8 X: h- Y8 v. b8 O( S+ ^. X! a自动初始化机制可以让初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,函数即可在系统启动过程中被执行。即在rt_components_board_init()和rt_components_init()中被执行。; V' u& Z$ F# |
自动初始化机制函数如下图所示:6 M5 H# S; x- B% A





  • INIT_BOARD_EXPORT(fn)//初始化最基础的板级硬件
  • INIT_PREV_EXPORT(fn)//初始化纯软件,不依赖太多的函数
  • INIT_DEVICE_EXPORT(fn)//初始化外设驱动设备
  • INIT_COMPONENT_EXPORT(fn)//初始化组件
  • INIT_ENV_EXPORT(fn)//初始化系统环境
  • INIT_APP_EXPORT(fn)//初始化应用


内核对象是内核中绝大部分的设施,内核对象包括:线程、信号量、互斥量、事件、邮箱、消息队列、定时器、内存池、设备驱动等。对于内核对象有相应的结构体来定义每个内核对象的信息,内核对象结构的基本信息如下所示:

  • struct rt_object
  • {
  •     char             name[RT_NAME_MAX];//内核对象的名称
  •     rt_uint8_t     type;                               //内核对象的类型
  •     rt_uint8_t     flag;                                //内核对象的参数
  • #ifdef RT_USING_MODULE
  •     void      *module_id;//应用模块的ID
  • #endif
  •     rt_list_t  list;//内核对象管理链表
  • };











正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

55

主题

134

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2018-8-7
在线时间
55 小时
 楼主| 发表于 2019-3-8 18:18:24 | 显示全部楼层
更新中 不知道为啥数字和字母乱码了...
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10528
金钱
10528
注册时间
2017-2-18
在线时间
1906 小时
发表于 2019-3-9 12:40:25 | 显示全部楼层
Fillmore 发表于 2019-3-8 18:18
更新中 不知道为啥数字和字母乱码了...

选择这里试试
123.JPG
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 10:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表