RTOS学习记录1:任务调度
RTOS:实时操作系统
实时性:在固定时间内对事件进行响应
操作系统:对任务管理和协调的控制功能
终端:运行于特定的嵌入式硬件,功能可裁剪,代码可移植
- 堆:malloc和free
- 栈:保存返回地址、局部变量
修改官方源码,添加串口打印功能:
- 去掉无关的代码:LCD等
- 增加串口打印功能
- 初始化串口
- 实现fputc
第一个freertos程序及引申
- 两个打印任务
- xTaskCreate()函数
xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);定义了task1function和xhandletask1
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ const configSTACK_DEPTH_TYPE usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask )
-
感觉在并行执行,实际上是交叉执行了task1和task2
- 作业:加入第三个任务led闪烁(完成)
数据类型:每个移植的版本都包括portmacro.h,里面包含了TickType_t(事件中断次数)和BaseType_t(对应架构最高效的数据类型)
创建任务函数详解:
- 动态内存的使用
- 面向对象的编程思想
- struct student
- TCB_T结构体
- 面向对象的编程思想
- 静态创建任务
- 使用静态的createTaskstatic
- 事先分配好任务控制块
- 事先提供栈
- 简单实验
- 删除任务:需要一个handle句柄
- 使用同一个task函数实现不同的任务,通过参数来实现
- 栈的大小
- 使用大量的局部变量会破坏TCB,volatile关键字导致buf不能被优化,然后在task1中将buf数组全部置零,会产生error
- 任务状态:
-
状态转换图:
-
- running
- ready
- blocked:阻塞状态,等待某事
- suspended: 暂停状态,主动休息或被动休息
- 如何管理不同状态的任务:放在不同的链表中
- Task1: vTaskSuspend(Task3)
- Task2: vTaskDelay(10),自身延迟10个时钟
- Task3
- 周期性执行:vTaskDelayUntil()
空闲任务及其钩子函数
任务自杀之后,不能自己完成内存清理,必须由空闲task来进行清理。 可以用空闲任务的钩子函数来进行这些任务
任务调度算法:
事件分为两类:
1.时间相关的事件:
设置超时时间:在指定时间内阻塞,时间到了就进入就绪状态
实现周期性的功能和超时功能
2.同步事件:某个任务在等待某些信息,别的任务或者中断服务程序给它发消息
调度算法:
关键在于三点:
1.是否抢占
2.允许抢占时,是否允许时间片轮转
3.允许抢占、允许时间片轮转时,空闲任务是否让步?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!