Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
内核对象
链表组件
RT-Thread 内核学习笔记 - 内核对象初始化链表组织方式
发布于 2021-01-29 09:29:45 浏览:1578
订阅该版
[tocm] [RT-Thread 入门学习笔记 - 目录](https://club.rt-thread.org/ask/article/3420.html) [RT-Thread 内核学习笔记 - 内核对象rt_object](https://club.rt-thread.org/ask/article/2493.html) [RT-Thread 内核学习笔记 - 内核对象管理](https://club.rt-thread.org/ask/article/2494.html) [RT-Thread 内核学习笔记 - 内核对象操作API](https://club.rt-thread.org/ask/article/2513.html) [RT-Thread 内核学习笔记 - 内核对象初始化链表组织方式](https://club.rt-thread.org/ask/article/2522.html) [RT-Thread 内核学习笔记 - 内核对象链表结构深入理解](https://club.rt-thread.org/ask/article/2549.html) [RT-Thread 内核学习笔记 - 设备模型rt_device的理解](https://club.rt-thread.org/ask/article/2570.html) [RT-Thread 内核学习笔记 - 理解defunct僵尸线程](https://club.rt-thread.org/ask/article/2580.html) ## 背景 * RT-Thread内核对象使用链表进行管理与组织。 * RT-Thread有完整的【双向链表】与【单向链表】的操作API * 内核派生的如线程、定时器、设备等内核对象,由链表链起来管理的。 ## 链表介绍 ```c++ /** * Double List structure */ struct rt_list_node { struct rt_list_node *next; /**< point to next node. */ struct rt_list_node *prev; /**< point to prev node. */ }; typedef struct rt_list_node rt_list_t; /**< Type for lists. */ ``` * 链表是一种数据结构,跟其他的结构体类似,初始化后本身占用内存空间,自身有内存地址。 * 一般双向链表,内部的成员是链表本身结构体的指针,注意成员指针的指向,初始化后并没有确定。 * RT-Thread 的双向链表,初始化时,内部的指针指向自己本身的地址,也就是给链表的成员,赋好了初值(指针内容,一般是地址)。 * 链表节点一般都是【全局结构体变量】,全局静态初始化,或动态内存申请(全局)。 * 不用全局的链表节点,注意不要链入链表结构,否则节点地址因为【生命周期】结束内存释放了,地址就不对了,就无法管理各个链表的节点了。 ## 双向链表API * 这里注要提一下链表节点的插入【次序】,因为遇到了一点小困惑,所以深入的研究了下。 * 理解:【最新节点】【前一个节点】【最早节点】 * 链表的头的问题:内核对象使用【对象容器】,全局的,对象初始化后,用了 rt_list_insert_after ```c++ /* 来自:object.c :rt_object_init */ /* insert object into information object list */ rt_list_insert_after(&(information->object_list), &(object->list)); ``` * 注意,rt_list_insert_after,插入的位置,【不是链表的尾部插入,是第一个链表节点【第一个参数】的后面。】 * 也就是说,如果创建了3个内核对象,默认的排序如下: ``` 不是:【容器head】 --- [obj1] --- [obj2] --- [obj2] 而是:【容器head】 --- [obj3] --- [obj2] --- [obj1] ``` * 如果把链表插入到【尾部】后面,就要先把链表指针移到尾部,再执行:rt_list_insert_after. ## 查看内核对象 * thread,device等对象,都是内核对象【派生】出来的。 * RT-Thread 提供list_thread、list_device等,查看内核的对象。 * 查看线程初始化【次序】,看看最后打印的线程,就是【最先】首个创建的线程。 * 一般从链表【头部】开始遍历各个链表节点。如下:最后一个节点是:main线程. * 其实,main线程,是第一个创建的。 ```c++ msh />list_thread thread pri status sp stack size max used left tick error -------- --- ------- ---------- ---------- ------ ---------- --- persim 16 suspend 0x000001ec 0x0000c000 08% 0x00000003 000 sens 28 suspend 0x000000d8 0x00001000 13% 0x00000019 000 hws 28 suspend 0x000000d8 0x00000800 10% 0x00000032 000 dcm_tpo 10 suspend 0x00000090 0x00000800 14% 0x00000004 000 dcm_tpo 10 suspend 0x00000090 0x00000800 14% 0x00000002 000 dcm_tpo 10 suspend 0x00000090 0x00000800 15% 0x00000004 000 tshell 20 running 0x000001fc 0x00001000 26% 0x0000000a 000 touch 16 suspend 0x00000098 0x00000800 18% 0x00000013 000 usbd 8 suspend 0x000000ac 0x00001000 04% 0x00000014 000 at_clnt 9 suspend 0x000000c0 0x00000600 12% 0x00000002 000 ulog_asy 30 suspend 0x00000084 0x00000c00 09% 0x00000006 000 mmcsd_de 22 suspend 0x000000a0 0x00000400 48% 0x00000014 000 alarmsvc 10 suspend 0x000000a8 0x00000800 27% 0x00000003 000 rils 12 suspend 0x000000b0 0x00000800 08% 0x0000001e 000 tidle0 31 ready 0x00000058 0x00000800 04% 0x0000001d 000 timer 4 suspend 0x00000074 0x00000800 08% 0x00000009 000 main 10 suspend 0x00000120 0x00000800 41% 0x00000012 000 /* 最先创建的线程,最后打印 */ ``` * 内核对象初始化的链表【次序】: ![2021-01-29_085157.png](https://oss-club.rt-thread.org/uploads/20210129/72330310ac8ce665f863ed16387033c8.png) ## 总结 * 使用链表时,注意插入的次序,尤其是FIFO的缓冲区的读写处理 * 熟悉RT-Thread 内核对象,对象管理方法。 * 深入研究基本数据结构的使用:链表
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
804
被采纳
174
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
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组件
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部