Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
内核学习营
个人学习内核心得(一)——内核基础
发布于 2019-02-26 11:16:43 浏览:2916
订阅该版
* 本帖最后由 家定不举棋 于 2019-2-27 20:27 编辑 * 第一次系统性的学习RTThread,将个人所学到的东西分享在这里,希望大家多多指点和批评,互相进步,互相提高。主要参考RT-Thread快速入门文档、RT-Thread内核实现与应用开发实战指南——基于野火STM32全系列(M3/4/7)开发板、RT-THREAD编程指南、内核实验手册、网上查询的资料,学习使用的是内核示例代码。![rtthread_simulator_v0.1.0.7z](/uploads/201902/26/114030mip1fjfwrou0vwrs.attach) 首先打开代码后对其进行仿真 打开串口界面;开始运行可看到RT-Thread标志将程序进行复位,对其进行单步处理,可看到程序的起始函数为: ```int $Sub$main(void) { rt_hw_interrupt_disable();//关闭系统中所有的中断 rtthread_startup();//启动线程 return 0; }```说明程序真正的起始函数为$Sub$main(void)。程序第一步为关闭系统中断,这保证了当前线程或代码不会被其他中断事件所打断,保证了系统初始化的安全性和稳定性。rt_hw_interrupt_disable()函数在context_rvds.S文件中进行定义,返回中断前的系统中断状态。 查看rtthread_startup()函数定义,看到系统初始化函数为: ![rtthread_startup.png](/uploads/201902/26/134930ccynmmmc13qyhhdd.png)从函数中可以看到整个系统初始化步骤为: 1. 初始化与系统相关的硬件、系统内存堆:rt_hw_board_init() 2.初始化系统内核对象:定时器、调度器、信号量等:rt_system_timer_init(); rt_system_scheduler_init(); rt_system_signal_init(); 3.创建main线程,在main线程中用户可以自己创建相关应用:rt_application_init(); 4.初始化系统定时器线程、空闲线程,启动调度器:rt_system_timer_thread_init(); rt_thread_idle_init(); rt_system_scheduler_start(); 一般MCU的存储空间=片内Flash(硬盘)+片内RAM(内存)。程序编译完成后会生成一个.map文件,来说明各函数的尺寸和地址,在map文件最后会显示出代码的相关存储信息。RO Size=Code+RO-data:程序所占用Flash空间的大小=代码段(程序代码)+只读数据段(程序定义的常量) RW Size=RW-data+ZI-data:运行时占用的RAM空间大小=读写数据段(非0值的全局变量)+0数据段(未初始化的全局变量+初始化为0的变量) ROM Size=Code+RO Data+RW Data:表示烧写程序所占用的Flash空间的大小 同时还会生成烧录进单片机的可执行映射文件:.bin文件或者.hex文件=RO Size+RW Size 关系图如下所示: ![RT-Thread程序分布Program Size.png](/uploads/201902/26/141840bz3ohpa3o5f5nrw4.png) 单片机上电后:1、默认Flash启动;2、将RW段的RW-data放到RAM中,不搬运RO-data和Code,执行代码时候CPU直接读取Flash;3、根据ZI地址和大小分配ZI段 ,将RAM区域请0。 其中系统最初初始化的动态内存堆为未使用的RAM,应用程序申请和释放的内存块都来自该空间。 自动初始化机制可以让初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,函数即可在系统启动过程中被执行。即在rt_components_board_init()和rt_components_init()中被执行。 自动初始化机制函数如下图所示: ![自动初始化机制.png](/uploads/201902/26/143014e4mpjqk6386j330x.png) ```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;//内核对象管理链表 }; ```对于内核对象又有以下类型分类(系统中最多能容纳的对象类别数目是127个): ![内核对象类型rt_object_class_type.png](/uploads/201902/26/144953fl4lzggllhqdjtqc.png) 对于同一种类型的内核对象通过内核对象容器来进行管理,其具体结构体为rt_object_information: ```struct rt_object_information { enum rt_object_class_type type;//内核对象类型 rt_list_t object_list;//内核对象链表,每一类对象的具体实例通过链表的形式挂接 rt_size_t object_size;//内核对象大小,每一类对象占用的内存块大小都是相同的 }; ``` 与内核相关的部分API总结归纳如下: ![内核基础API.png](/uploads/201902/26/152730p66sz7q5rn1k2dn1.png)```/*查找指定对象的信息类型 *输入相应的对象类型 *在内核对象管理系统中寻找输入的对象类型,判断对象管理系统中是否有输入的对象类型,如果有返回初始化的相应对象容器,否则返回RT_NULL*/ struct rt_object_information *rt_object_get_information(enum rt_object_class_type type) /*静态初始化内核对象 *输入需要初始化的静态内核对象容器、对象类型、对象名称 *1.通过对象类型获得对象的信息,确保对象信息不为RT_NULL *2.设置静态内核对象的类型标志 *3.将对象的名称赋值到内核对象中 *4.使用钩子函数 *5.关闭中断 *6.将初始化的内核对象加入到对应的对象容器中 *7.打开中断*/ void rt_object_init(struct rt_object *object,enum rt_object_class_type type,const char *name) /*脱离静态对象 *输入所要脱离的静态对象句柄 *1.确保所要脱离的对象不为RT_BULL *2.使用钩子函数 *3.重置对象类型,将对象的type赋值为0 *4.关闭中断 *5.将对象从对应的对象容器列表中删除 *6.打开中断*/ void rt_object_detach(rt_object_t object) /*动态申请内核对象 * 输入对象的类型、对象名称 *1.确保函数不在中断历程中 *2.通过对象的类型获取对象信息,确保对象信息不为RT_NULL *3.为对象动态申请一个内存空间,确保申请的对象不为RT_BULL,否则返回RT_BULL *4.清除对象的内存数据 *5.设置对象的类型 *6.将对象标志位设为0 *7.设置对象名称 *8.使用钩子函数 *9.关闭中断 *10.将此对象加入到对应的对象容器中 *11.打开中断并返回刚创建的对象*/ rt_object_t rt_object_allocate(enum rt_object_class_type type, const char *name) /*删除动态内核对象 *输入需要删除的对象句柄 *1.确保所要删除的对象不为RT_BULL,确保对象不是静态内核对象 *2.使用钩子函数 *3.重置对象类型,将对象类型设置为0 *4.关闭中断 *5.将对象从对应的对象容器列表中删除 *6.打开中断 *7.释放动态内存申请的内存空间*/ void rt_object_delete(rt_object_t object) /*判断对象是否是静态系统对象 *输入所要判断的对象句柄 *1.确保所要判断的对象不为RT_NULL *2.判断对象的类型是否为静态对象类型,如果是则返回RT_TRUE,否则返回RT_FALSE*/ rt_bool_t rt_object_is_systemobject(rt_object_t object) /*返回对象的类型 *输入所要获取类型的对象句柄 *1.确保所要获取类型的对象不为RT_NULL *2.返回对象的类型*/ rt_uint8_t rt_object_get_type(rt_object_t object) /*查找内核对象 *输入所要查找的内核对象名称、对象类型 *1.如果对象名称为RT_BULL或者类型不存在那么返回RT_NULL *2.确保函数不在中断历程中 *3.进入临界区,锁定线程调度器 *4.通过输入的对象类型获取对象对象信息,并确保对象信息不为RT_NULL *5.在对象列表中进行搜寻获取内核对象,判断对象名称是否一致,如果是,则退出临界区并返回对象;如果不是则退出临界区并返回RT_BULL*/ rt_object_t rt_object_find(const char *name, rt_uint8_t type)``` 以上所有框图总结如下(以上使用的框图软件为XMind8): ![内核基础.png](/uploads/201902/26/153005ccc3jkzsrjjevpsl.png) ![内核基础.xmind](/uploads/201902/26/153231mn0q3jug4gu34r03.attach)
查看更多
7
个回答
默认排序
按发布时间排序
海阔天kongcyc
2019-02-26
这家伙很懒,什么也没写!
分析的内容在哪呢?:$
家定不举棋
2019-02-26
这家伙很懒,什么也没写!
>分析的内容在哪呢? --- 让您久等了,努力码字ing。
海阔天kongcyc
2019-02-26
这家伙很懒,什么也没写!
>让您久等了,努力码字ing。 --- 厉害了我的哥:lol
家定不举棋
2019-02-27
这家伙很懒,什么也没写!
>厉害了我的哥 --- 没有没有,新手第一次系统性的学习,就相当于一种自我整理吧:loveliness:
shadowliang
2019-03-19
Hello,world!!!
学习了,顶一下:lol
yhb1206
2019-04-08
https://blog.csdn.net/yhb1206
楼主,谢谢,太牛叉了
回到原点
2019-04-11
这家伙很懒,什么也没写!
太优秀了,学习了
撰写答案
登录
注册新账号
关注者
0
被浏览
2.9k
关于作者
家定不举棋
这家伙很懒,什么也没写!
提问
10
回答
6
被采纳
0
关注TA
发私信
相关问题
1
【内核学习】rtthread内核移植记录-STM32F103ZET6-HAL库
2
《内核学习营》+水一方+自用STM32F103VC 板RT-Thread内核移植分享
3
《内核学习营》+水一方+项目中创建标准的 RT-Thread工程
4
内核学习营+坦然+探索者stm32f407板子RT-thread循环点亮led灯
5
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口字符点灯
6
<内核学习营>+坦然+探索者stm32f407板子RT-thread的pwm点灯实验
7
<内核学习营>+坦然+探索者stm32f407板子RT-thread串口实验
8
<内核学习营>+坦然+野火stm32f103板子RT-thread读写SD卡实验
9
<内核学习营>+坦然+探索者stm32f407板子RT-thread的RTC闹钟实验
10
【内核学习营】+王秀峰+led_rgb
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
5
常量数据类型和表达式陷阱分享
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部