笔记内容参考RT-Thread内核入门指南教程视频:https://www.bilibili.com/video/av79513262?p=3
线程是什么?RT-Thread名为实时线程RTOS,那么什么叫线程?
人们在实际生活遇到复杂问题时,往往采用“分而治之”方法,即把一个很复杂问题分解为若干个相对容易解决小问题,逐一击破。则,复杂问题就迎刃而解。因此,在设计一个复杂应用程序时,引入“分而治之”方法则可把一个大型任务分解为若干小任务,最终较为轻松解决好大任务。
在RT-Thread中,与上述小任务对应程序实体称为“线程”或“任务”。RT-Thread就是一个能对这些小“线程”进行管理及调度的多“线程”操作系统。
线程是实体任务载体,其描述一个任务执行运行环境,也描述这个任务所处优先等级。同时,它是RT-Thread中最基本调度单位。
线程组成
RT-Thread中,线程由三部分组成:线程代码(入口函数)、线程控制块、线程堆栈。
线程代码
无限循环结构 void thread_entry(void *parameter) { while(1) { /*等待事件的发生*/ … … /*处理事件*/ } } |
顺序执行结构 void thread_entry(void *parameter) { /*事务1处理*/ /*事务2处理*/ … … /*事务N处理*/ } |
线程控制块
线程控制块是操作系统用于管理线程的一个数据结构[1],他会存放线程的一些信息,例如优先级、线程名称、线程状态等,也包括线程与线程之间连接用的链表结构,线程等待事件集合等。
注:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
线程栈
RT-Thread每个线程都具有独立的栈空间,当进行线程切换时,系统会将当前线程的上下文保存在线程中,当线程要回复运行时,再从线程栈中读取上下文信息,回复线程运行。
线程上下文是指线程执行时的环境,即各个变量和数据。包括所有寄存器变量、堆栈信息、内存信息等。
线程栈在形式上是一段连续内存空间,设计者可以通过定义一个数组或申请一段动态内存作为线程的栈。
线程的创建
创建线程
静态线程 rt_errt rt_thread_init(struct rt_thread *thread, //定义线程控制块地址 const char *name, //起一个线程名字 void (*entry)(void *parameter), //函数指针—指向入口代码 void *parameter, //向线程代码带入相关参数 void *stack_start, //线程栈空间起始地址 rt_uint32_t stack_size, //线程栈大小 rt_uint8_t priority, //线程优先顺序 rt_uint32_t tick) //线程时间片参数(后文会详细介绍) |
动态线程 rt_errt rt_thread_init(const char *name, //起一个线程名字 void (*entry)(void *parameter), //函数指针—指向入口代码 void *parameter, //向线程代码带入相关参数 rt_uint32_t stack_size, //线程栈大小 rt_uint8_t priority, //线程优先顺序 rt_uint32_t tick) //线程时间片参数(后文会详细介绍) |
启动线程
rt_err_t rt_thread_startup(rt_thread_t thread)
调用此函数后创建的线程会被加入到现成的就绪队列,执行调度。
静态线程与动态线程区别
(1)相关资源分配形式
动态线程与静态线程相比,少了控制块地址及栈空间起始地址。静态线程需要提前定义才能使用,后者是动态分配。
(2)运行效率
动态线程与静态线程均运行在片内RAM,则运行效率无太大区别。若,运行在外扩RAM,即片外RAM。则,运行效率比片内ROM低。
文章评论(0条评论)
登录后参与讨论