UCOSIII 任务管理(中)
导读: 本文涉及三部分: 1. 第一部分:任务堆栈的创建和使用 2. 第二部分:任务控制块 3. 第三部分:优先级以及就绪表 希望能通过讲解对UCOSIII的任务管理有进一步的理解. |
一、任务堆栈 |
ucos中的堆栈是遵循“FIFO”原则,也就是先进先出。和一般系统都是一样的。
任务堆栈是用于存放数据,保存现场等等。
任务堆栈的创建 |
define START_STK_SIZE 512 //堆栈大小
CPU_STK START_TASK_STK[START_STK_SIZE]; //定义一个数组来作为任务堆栈//CPU_STK实际类型为CPU_INT32U,也就是unsigned int类型
//那么实际上堆栈大小即为 512*4byte = 2048字节
任务堆栈初始化:
本质是将初始的值赋值给任务堆栈
CPU_STK *OSTaskStkInit (OS_TASK_PTR p_task,void *p_arg,CPU_STK *p_stk_base, //任务堆栈的基址CPU_STK *p_stk_limit,//任务堆栈的栈深CPU_STK_SIZE stk_size, //任务堆栈的大小OS_OPT opt)
//特别说明:任务堆栈的栈深一般为START_STK_SIZE/10,它的作用是当栈仅剩这些容量的时候,就已经到极限了。
一般是在OSTaskCreate直接调用,不需要用户调用。
在移植的时候:需要用户根据CPU修改 OSTaskStkInit 的内容
二、任务控制块 |
每个任务都会有相应的TCB,TCB本质上是一种结构体
一般绝对不要访问OS_TCB中的成员变量
OS_TCB StartTaskTCB; //创建一个任务控制块
TCB结构体(ucosIII) |
成员变量在UCOSIII中远多于UCOSII
struct os_tcb
{CPU_STK *StkPtr; void *ExtPtr; CPU_STK *StkLimitPtrOS_TCB *NextPtr; OS_TCB *Prev…… //此处省略N个成员变量#if OS_CFG_DBG_EN > 0uOS_TCB *DbgPrevPtr;OS_TCB *DbgNextPtr;CPU_CHAR *DbgNamePtr;#endif
}
任务控制块的初始化 |
在OSTaskCreate中由系统调用OS_TaskInitPCB(),不需要用户去调用
三、优先级 |
UCOSIII中任务优先级数由宏OS_CFG_PRIO_MAX来配置,UCOSIII中数值越小,优先级越高,最低可用优先级就是OS_CFG_PRIO_MAX-1。
就绪表:优先级位映射表OSPrioTbl[]:用来记录哪个优先级下有任务就绪。 |
OSPrioTbl为32bit
例如:64个优先级则为OSPrioTbl[2]
OS_PRIO OS_PrioGetHighest (void)
{CPU_DATA *p_tbl;OS_PRIO prio;prio = (OS_PRIO)0;p_tbl = &OSPrioTbl[0];while (*p_tbl == (CPU_DATA)0) { //先找到OSPrioTbl[i]不为0prio += DEF_INT_CPU_NBR_BITS; p_tbl++;}prio += (OS_PRIO)CPU_CntLeadZeros(*p_tbl); //得到OSPrioTbl[i]前导0的个数return (prio);
}
最终找到哪个最高的优先级中有就绪任务
就绪表:就绪任务列表OSRdyList[]:用来记录每一个优先级下所有就绪的任务。 |
* 总是从head’指向的任务开始执行,执行之后就放到尾部
UCOSIII 任务管理(中)相关推荐
- ucosiii系统中的任务管理
前言: 多任务操作系统最重要的就是对任务进行管理,包括任务的创建,挂起,删除和调度等,因此对于ucosiii操作系统中任务管理的理解就显得尤为重要了. 分几个部分介绍: 1:任务状态 ...
- UCOSIII任务管理
对UCOSIII系统的任务管理包括了任务的创建.任务挂起.任务的删除以及任务的调度等. UCOSIII的启动和初始化 最先肯定是调用OSInit()初始化UCOSIII. 创建任务,一般我们在main ...
- 2.uCOSIII任务管理
任务简介: 任务即由系统管理的程序实体,由三部分组成: 任务堆栈:本质是一个数组,不同的任务在创建前可以自己定义相关数组的大小: 任务控制块:本质上是一个结构体,用于保存任务当前的各种状态信息,其成员 ...
- 进程与计划任务管理中的top、pgrep、pstree、jobs、at、crontab命令
目录 一.top命令 1.up time 2.user 3.系统任务(Tasks) 信息 4.CPU占用信息 二.进程信息 1.PID 2.USER 3.PR 4.NI 5.VIRT(virtual ...
- VC对话框禁止关闭按钮和禁止任务管理中关闭进程
1.BOOL C***Dlg::OnInitDialog() { //禁止关闭对话框 CMenu* pMenu = this->GetSystemMenu(FALSE); pMenu-> ...
- 解决win10下,安装某驱动后,任务管理中仍不存在问题
问题描述: 新电脑使用,使用摄像头的应用均无法检测到摄像头. 解决尝试: 常规解决思路,一般来说,硬件损坏的可能性较小,大概率是相应驱动出现问题. 首先在官网上下载相应驱动安装,安装后仍不能检测到摄像 ...
- STM32工作笔记0074---UCOSIII 任务管理(中)
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这个堆栈先进先出,类似于一个两端都有出口的桶. 先进去的,先出去.
- 【UCOSIII操作系统】任务篇(1)创建任务
UCOSIII操作系统 UCOSIII操作系统--任务篇(1)创建任务 一.UCOSIII--任务 简介 二.创建任务流程 1.定义任务栈 2.定义任务控制块TCB 3.定义任务主体函数 4.创建任务 ...
- 如何在HHDI中进行数据质量探查并获取数据剖析报告
通过执行多种数据剖析规则,对目标表(或一段SQL语句)进行数据质量探查,从而得到其数据质量情况.目前支持以下几种数据剖析类型,分别是:数字值分析.值匹配检查.字符值分析.日期值分析.布尔值分析.重复值 ...
最新文章
- 实现AGI,强化学习就够了?Sutton:奖励机制足够实现各种目标
- linux触摸屏两指缩放_自定义TextView实现单指拖动,双指缩放旋转
- 十年,我的计算机生涯
- 《看聊天记录都学不会C语言?太菜了吧》(5)打了一把游戏我学会了一个编程知识?
- 前端开始学java_[Java教程]开启前端学习之路
- vim中如何设置多行注释和删除注释
- 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
- Watchman 的安装
- Google登陆集成笔记-含坑
- 企业为什么需要EDI?
- 腾讯汤道生:产业互联网时代,安全成为CEO的一把手工程
- JavaScript防抖(王者荣耀回城)、节流(王者荣耀技能读条)
- JAVA练习97-网格照明
- 思科模拟器CISCO/华为模拟器ENSP配置一个完整的校园网(网络安全、数据冗余)
- javascript时间差插件
- python数据去重_python 大数据去重
- 潜入维基解密机房:探访维基总部
- 新型场板提高阻断电压
- Android4.4以后第三方应用无法删除短信的解决方案
- 蓄电池内阻、电压及温度在线监测系统应用方案