关闭
搜索
搜索
本版
帖子
用户
热搜:
程序员
简洁模式
高级模式
用户组: 游客
消息
提醒
新听众
我关注的
帖子
道具
勋章
任务
设置
退出
请
登录
后使用快捷导航
没有帐号?
立即注册
设为首页
收藏本站
开启辅助访问
切换到窄版
登录
or
立即注册
快捷导航
搜索
首页
论坛
BBS
MCU单片机技术
程序员交流
UCOSIII系统内部任务
[复制链接]
作者:
丁烨是个大好人
版块:
›
灌水·股票·程序员大本营·工作之余需要点阳光·我们不只是工程师
›
IT业界资讯
发布时间:
2019-2-5 07:26:27
1510
0
返回列表
丁烨是个大好人
当前离线
新手上路
新手上路, 积分 6, 距离下一级还需 44 积分
新手上路
新手上路, 积分 6, 距离下一级还需 44 积分
积分
6
发消息
楼主
电梯直达
丁烨是个大好人
发表于 2019-2-5 07:26:27
|
只看该作者
|
倒序浏览
|
阅读模式
大家,新年快乐哦,哈哈哈,今年第一篇文章。。。。。
先给大家拜年了,祝大家新年健康,学业进步,万事如意哦。
切入正题:
在UCOSII中我们了解到其有两个系统任务:
统计任务
和
空闲任务,
在UCOSIII中系统内部任务拓展到了5个:
空闲任务
,
时钟节拍任务
,
统计任务
,
定时任务
,
中断服务管理任务
。
我们先来看
空闲任务
:OS_IdleTask(),在UCOSIII源码os_core.c中定义,要注意的是任务OS_IdleTask()是必须创建的,但是不需要用户手动创建,因为在调用OS_Init()初始化UCOS的时候空闲任务就会被创建,在os_core.c中的
OS_IdleTaskInit()函数代码如下:
给大家解释一下以上
OS_IdleTaskInit()
代码:
OSIdleTaskCtr参数在文件os.h中定义,查看定义,是一个32为无符号整型变量类型CPU_INT32U,OSIdleTaskCtr=(OS_IDLE_CTR)0将
OSIdleTaskCtr清0,函数
OS_IdleTaskInit()
简单,只是调用了OSTaskCreate()来创建一个任务,这个任务就是空闲任务,任务优先级为OS_CFG_PRIO_MAX-1,
OS_CFG_PRIO_MAX
是一个宏,在文件os_cfg.h定义,OS_CFG_PRIO_MAX 定义了 UCOSIII 可用的任务数。前面我们说过 UCOSIII 的任务数是无数的,但是在实际使用中考虑到硬件资源 (ROM 和 RAM)等因素,不可能真的使用无数的任务,在 UCOSIII 中可以使用宏 OS_CFG_PRIO_MAX来定义可使用的任务数,默认情况下 OS_CFG_PRIO_MAX为64。空闲 任务优先级为 OS_CFG_PRIO_MAX-1,说明空闲任务的优先级为最低的。
空闲任务堆栈大小为OSCfg_IdleTaskStkSize,OSCfg_IdleTaskStkSize 也是一个宏,在 os_cfg_app.c 文件中定义,默认为 128,则空闲任务堆栈默认为 128*4=512字节。空闲任务的任务函数为任务函数为 OS_IdleTask(),OS_IdleTask()函数代码如下:
OSIdleTaskCtr 加一,每进入一次空闲任务,OSIdleTaskCtr 就加一。我们可以通过查 看 OSIdleTaskCtr 变量的递增速度来判断 CPU 执行应用任务的繁忙程度,如果递增的快的话说 明应用任务花费时间少,很快就执行完了。
宏 OS_CFG_STAT_TASK_EN 大于 0 说明开启了统计任务。
OSStatTaskCtr 默认也是一个 32 位的无符号整形变量,在文件 os.h 中定义。这里将 OSStatTaskCtr 加一,统计任务中用到 OSStatTaskCtr,用来统计CPU的使用率,后面讲解统计任务的时候在详细的讲解 OSStatTaskCtr。
时钟节拍任务
另一个必须创建的任务时钟节拍任务:OS_TickTask(),如下是OS_TickTaskInit()函数:
可以看到在函数 OS_TickTaskInit()的最后调用 OSTaskCreate()来创建了一个任务,任务函数为OS_TickTask(),所以说时钟节拍任务是 UCOSIII 必须创建的,同样,不需要我们手工创建。 时钟节拍任务的任务优先级为 OSCfg_TickTaskPrio,时钟节拍任务的优先级尽可能的高一点, 时钟节拍任务的作用是跟踪正在延时的任务,以及在指定时间内等待某个内核对象的任务, OS_TickTask()任务函数代码如下:
OSTaskSemPend()是请求任务内建信号量的,信号量会在 OSTimeTick() 中 POST,这里的信号量是用来做任务同步的。
信号量请求成功的话就调用函数OS_TickListUpdate()函数,在了解 OS_TickListUpdate() 函数之前我们先来了解时钟节拍任务中一个重要的概念:时钟节拍列表。时钟节拍列表是由一个数据表 OSCfg_TickWheel和一个计数器 OSTickCtr 组成,表 OSCfg_TickWheel 是一个数组,数组元素个数由宏OS_CFG_TICK_WHEEL_SIZE定义。表 OSCfg_TickWheel 中的元素为 os_tick_spoke 类型的,os_tick_spoke 是一个结构体。
在使用时钟节拍列表时需要初始化时钟节拍列表,在OS_TickTaskInit()函数中会调用OS_TickListInit来初始化时钟节拍列表,
OS_TickListInit
()如下:
统计任务
在 UCOSIII 中统计任务可用来统计 CPU 的使用率、各个任务的 CPU 使用率和各任务的堆 栈使用情况,默认情况下统计任务是不会创建的,如果要使能统计任务的话需要将宏OS_CFG_STAT_TASK_EN置1,宏 OS_CFG_STAT_TASK_EN 在 os_cfg.h 文件中有定义。当我 们将宏 OS_CFG_STAT_TASK_EN 置 1 以后,OSinit()函数中有关统计任务的代码就可以编译了 。 OS_StatTaskInit() 函 数 用 来 创 建 统 计 任 务 , 统 计 任 务 的 优 先 级 通 过 宏 OS_CFG_STAT_TASK_PRIO 设置,ALIENTEK 将统计任务的优先级设置为 OS_CFG_PRIO_MAX-2,也就是倒数第二。
如果要使用统计任务的话就需要在 main()函数创建的第一个也是唯一一个应用任务中调用 OSStatTaskCPUUsageInit()函数。注意在 OSStart()之前只能创建一个任务。在main()函数中只创建了一个任务,就是 start_task()开始任务。
从上面代码中可以看出最先调用了函数 OSStatTaskCPUUsageInit(),创建其他任务只能在 OSStatTaskCPUUsageInit()函数之后。CPU 的总的使用率会保存在变量 OSStatTaskCPUUsage 中, 我们可以通过读取这个值来获取 CPU 的使用率。
如果将宏 OS_CFG_STAT_TASK_STK_CHK_EN 置 1 的话表示检查任务堆栈使用情况,那么统计任务就会调用OSTaskStkChk()函数来计算所有已创建任务的堆栈使用量,并将检测结果写入到每个任务的OS_TCB中的 StkFree 和 StkUsed 中。
定时任务
UCOSIII提供软件定时器功能,定时任务是可选的,将宏 OS_CFG_TMR_EN 设置为 1 就 会使能定时任务,在 OSInit()中将会调用函数OS_TmrInit()来创建定时任务。定时任务的优先级通过宏 OS_CFG_TMR_TASK_PRIO 定义
中断服务管理任务
当把 os_cfg.h 文件中的宏 OS_CFG_ISR_POST_DEFERRED_EN 置 1 就会使能中断服务管 理任务,UCOSIII 会创建一个名为 OS_IntQTask()的任务,该任务负责“延迟”在 ISR 中调用的 系统 post 服务函数的行为。中断服务管理任务的任务优先级永远是最高的,为 0!
在 UCOS 中可以通过关闭中断和任务调度器上锁两种方式来管理临界段代码,如果采用后一种,即调度器上锁的方式来管理临界段代码的话, 那么在中断服务函数中调用的“post”类函数就不允许操作诸如任务就绪表、等待表等系统内 部数据结构。
当 ISR(中断服务函数)调用 UCOSIII 提供的“post”函数时,要发送的数据和发送的目的地 都会存入一个特别的缓冲队列中,当所有嵌套的 ISR 都执行完成以后 UCOSIII 会做任务切换, 运行中断服务管理任务,该任务会把缓存队列中存放的信息重发给相应的任务。这样做的好处 就是可以减少中断关闭的时间,否则,在 ISR 中还需要把任务从等待列表中删除,并把任务放 入就绪表,以及做一些其他的耗时操作。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
收藏
0
相关帖子
•
在UbuntuLinux中从ISO创建可引导USB媒体的5种简单方法
•
本机Tomcat运行OK,放到linux服务器就不行了.
•
这些Linux的“自动化”技巧,教你轻松完成任务
•
长文|花了两天时间整理了STM32中的一些C语言知识点
•
深入理解高性能网络开发路上的绊脚石-同步阻塞网络IO
•
干货|深度剖析C语言的main函数
•
红帽linux[基础命令]特殊变量列表
•
如何在内核中操作某个文件?
•
利用BATS测试Bash脚本和库|Linux中国
•
《Linux内核编码风格》官方手册最新中译本
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
表情
@朋友
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表