UCOSIII任务管理
2016-09-19 09:27:32 0 举报
AI智能生成
UCOSIII是一种实时操作系统,它提供了任务管理的功能。在UCOSIII中,任务是由函数组成的代码块,这些函数按照预定的顺序执行。UCOSIII使用优先级来管理任务,高优先级的任务会先执行。此外,UCOSIII还提供了任务调度器,用于控制任务的执行顺序和时间。 UCOSIII的任务管理功能非常强大,它支持多任务并发运行,每个任务都可以独立运行,互不干扰。此外,UCOSIII还提供了任务堆栈,用于存储任务运行时所需的数据和变量。当任务被创建时,系统会自动为其分配一个堆栈空间。
作者其他创作
大纲/内容
任务相关API函数
创建和删除 OSTaskCreate(), OSTaskDel()
挂起和恢复 OSTaskSuspend(), OSTaskResume()
时间片轮转调度 OSSchedRoundRobinCfg() 搭配开关宏
系统内部任务
1、空闲任务
OS_IdleTask 不需要手动创建,在调用 OSInit() 时会自动创建
2、时钟节拍任务
3、统计任务
4、定时任务
5、中断服务管理任务
6、钩子函数
中断和时间管理
时间管理
OSTimeDly() 延时函数
OSTimeDlyHMSM()
解除一个任务的延时 OSTimeDlyResume()
获取时钟节拍计数器的值 OSTimeGet(), OSTimeSet()
中断管理
系统时钟节拍的中断服务程序中必须调用 OSTimeTick()
临界区代码保护 OS_CRITICAL_ENTER(), OS_CRITICAL_EXIT()
中断发布消息有两种
直接发布
延迟发布
如何编写中断服务函数?
软件定时器
定时器的时间分辨率由 OS_CFG_TMR_TASK_RATE_HZ 来确定
创建定时器 OSTmrCreate(),传入定时器回调函数和参数
启动定时器 OSTmrStart()
停止定时器 OSTmrStop()
启动定时器,初始化延迟开始倒计数,倒计数到0则开始定时任务;如果定时器是周期的,则下一轮倒计数由周期延迟决定
信号量和互斥信号量
信号量
信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行
信号量有2种:二进制信号量、计数型信号量
二进制信号量
信号量为1的时候才可以使用资源
计数型信号量
信号量初始值为N,则可以同时有N个任务访问共享资源
信号量相关的API
OSSemCreate() 创建
创建时指定计数值为1则为二进制信号量;如果计数值大于1则为计数型信号量
OSSemDel() 删除
OSSemPend() 等待
OSSemPendAbort() 取消等待
OSSemPost() 释放
OSSemSet() 强制设置一个信号量的值
互斥信号量
只有任务才能使用互斥信号量mutex,中断服务程序则不可以
任务H在运行,且等待由任务L占用的互斥信号量,则OS暂时提升任务L的优先级到H同级,当L运行结束后恢复它的优先级
互斥信号量API
OSMutexCreate() 创建
OSMutexDel() 删除
OSMutexPend() 等待
OSMutexPendAbort() 取消等待
OSMutexPost() 释放
任务内嵌信号量
在UCOSIII中每个任务都有自己内嵌的信号量,简化代码,比独立的信号量更有效
任务内嵌信号量API
OSTaskSemPend() 等待
OSTaskSemPendAbort() 取消等待
OSTaskSemPost() 释放
可以指定发送信号量到某个具体的任务 OS_TCB
OSTaskSemSet() 强行设置任务信号量计数
消息传递
消息队列
3个特点
发布消息采用的是引用传递而不是值传递
消息队列是由用户创建的内核对象,数量不受限制
读取消息可以FIFO也可以LIFO
消息队列API
OSQCreate() 创建
OSQDel() 删除
OSQFlush() 清空
OSQPend() 等待
OSQPendAbort() 取消等待
OSQPost() 向消息队列发送一条消息
任务内建消息队列
注意事项:必须将 OS_CFG_TASK_Q_EN 置为1
相关API
OSTaskQPend() 等待消息
OSTaskQPendAbort() 取消等待
OSTaskQPost() 向任务发送一条消息
指定OS_TCB,发送消息到特点的任务
OSTaskQFlush() 清空任务的消息队列
事件标志组
应用情形:一个任务可能需要和多个事件同步,这个时候就需要使用事件标志组
2种同步机制:(或)同步,(与)同步
变量类型 OS_FLAG_GRP
相关API
OSFlagCreate() 创建
OSFlagDel() 删除
OSFlagPend() 等待
OSFlagPendAbort() 取消等待
OSFlagPendGetFlagsRdy() 获取使任务就绪的事件标志
OSFlagPost() 向事件标志组发布标志
UCOSIII启动和初始化
初始化函数 OSInit() 必须最先调用
通常在 main() 函数中只建立一个 start_task任务,其他任务在 start_task 任务中创建
然后最后调用 OSStart() 函数启动 UCOSIII
任务控制块 OS_TCB
任务就绪表
1、优先级位映射表--标记哪个级别的任务有在就绪任务表中
2、就绪任务表--记录每个优先级下所有就绪的任务
任务调度和切换
任务调度器有2种
1、任务级调度器
OSSched()
2、中断级调度器
OSIntExit()
任务状态共5种
休眠态--只是存储区中的一段代码,并未使用 OSTaskCreate() 函数创建这个人物,不受 UCOSIII 管理
就绪态--在就绪列表中,等待CPU使用权
运行态--正在运行的任务
等待态--正在运行的任务需要等待某个事件发生,就会暂时让出CPU使用权,进入等待事件状态
中断服务态--任务被中断打断,CPU转而去执行中断服务程序
任务堆栈 CPU_STK
同时等待多个内核对象
支持同时等待多个信号量和消息队列
不支持同时等待多个事件标志组和互斥信号量

收藏

收藏
0 条评论
下一页