原文:点击打开链接

一. 任务的基本概念

1. 任务分三个部分 :任务控制块,任务堆栈,任务程序代码。


任务控制块:关联了任务代码的程序控制块,它记录了任务的各个属性;
任务堆栈:用来保存任务的工作环境。
任务程序代码:就是任务的执行部分。

2. 任务的状态


睡眠状态:任务在没有配备任务控制块或被剥夺了作务控制块时的状态。
就绪状态:配备了任务控制块并在任务就绪表中进行了就绪登记。
运行状态:处于就绪状态的任务如果经调试器判断获得了CPU的使用权。
等待状态:正在运行的任务,需要等待一段时间,会把CPU让出来,从而进入等待状态。
中断服务状态:正在运行的任务响应中断申请就会中止运行而去执行中断服务程序,这时的状态叫做中断服务状态。

3. 任务的优先级
最多64个任务,也就是最多有64个优先级。0~63
在配置文件OS_CFG.H中定义了一个用来表示最低优先级别的常数OS_LOWEST_PRIO,所以系统可用的优先级别为0~OS_LOWEST_PRIO。
但是一般OS_LOWEST_PRIO会自动赋给空闲任务,OS_LOWEST_PRIO - 1会自动赋给统计任务。

二. 任务的堆栈

为了满足任务切换和响就中断时保存CPU寄存器中的内容及任务调用其他函数时的需要。

注意处理器所支持的堆栈增长的方向:

[cpp] view plain copy
  1. //向下的堆栈
  2. OSTaskCreate(Task1, (void *) 0, &Task1_Stk[TASK_STK_SIZE - 1], TASK1_PRIO);
  3. //向上的堆栈
  4. OSTaskCreate(Task1, (void *) 0, &Task1_Stk[0], TASK1_PRIO);

三. 任务控制块及其链表

数据结构如下:

[cpp] view plain copy
  1. typedef struct os_tcb {
  2. OS_STK        *OSTCBStkPtr;        /* Pointer to current top of stack                              */
  3. #if OS_TASK_CREATE_EXT_EN > 0
  4. void          *OSTCBExtPtr;        /* Pointer to user definable data for TCB extension             */
  5. OS_STK        *OSTCBStkBottom;     /* Pointer to bottom of stack                                   */
  6. INT32U         OSTCBStkSize;       /* Size of task stack (in number of stack elements)             */
  7. INT16U         OSTCBOpt;           /* Task options as passed by OSTaskCreateExt()                  */
  8. INT16U         OSTCBId;            /* Task ID (0..65535)                                           */
  9. #endif
  10. struct os_tcb *OSTCBNext;          /* Pointer to next     TCB in the TCB list                      */
  11. struct os_tcb *OSTCBPrev;          /* Pointer to previous TCB in the TCB list                      */
  12. #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
  13. OS_EVENT      *OSTCBEventPtr;      /* Pointer to event control block                               */
  14. #endif
  15. #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
  16. void          *OSTCBMsg;           /* Message received from OSMboxPost() or OSQPost()              */
  17. #endif
  18. #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
  19. #if OS_TASK_DEL_EN > 0
  20. OS_FLAG_NODE  *OSTCBFlagNode;      /* Pointer to event flag node                                   */
  21. #endif
  22. OS_FLAGS       OSTCBFlagsRdy;      /* Event flags that made task ready to run                      */
  23. #endif
  24. INT16U         OSTCBDly;           /* Nbr ticks to delay task or, timeout waiting for event        */
  25. INT8U          OSTCBStat;          /* Task status                                                  */
  26. INT8U          OSTCBPrio;          /* Task priority (0 == highest, 63 == lowest)                   */
  27. INT8U          OSTCBX;             /* Bit position in group  corresponding to task priority (0..7) */
  28. INT8U          OSTCBY;             /* Index into ready table corresponding to task priority        */
  29. INT8U          OSTCBBitX;          /* Bit mask to access bit position in ready table               */
  30. INT8U          OSTCBBitY;          /* Bit mask to access bit position in ready group               */
  31. #if OS_TASK_DEL_EN > 0
  32. BOOLEAN        OSTCBDelReq;        /* Indicates whether a task needs to delete itself              */
  33. #endif
  34. } OS_TCB;

ucos需要两个链表:

一条空任务块链表,其中所有任务控制块还未分配给任务。由OSInit()创建。

一个任务块链表,其中所有任务控制块已分配给任务。由OSTaskCreate()创建。

创建时,系统会将空任务控制块链表头指针OSTCBFreeList指向的任务控制块分配给该任务。
图3-6是在图3-5所示的空任务控制块链表甚而上,应用程序创建了两个用户任务并使用了两个系统任务的情况。

四. 任务就绪表及任务调度

1. 任务就绪表的结构
是一个位图,每一位代表一个任务,1表示就绪,0表示非就绪。

可以看出一个元素可以表达8个任务的就绪状态。

还有一个变量表示哪个组个元素就绪了:

优先级也就绪表的位置关系:


2. 对任务就绪表的操作
登记:指的是当某个任务处于就绪状态时,把就绪表中对应的位置置1。
注销:把就绪表中对应的位置清0。
最高优先级任务的查找:从表中查找出最高优先级

3. 任务调度
调度的思想 是:近似地每时每刻让优先级最高的就绪任务处于运行状态。
具体做法是:在系统或用户任务调用系统函数及执行中断服务程序结束时来调用调度器(OS_Sched())。
调度器先在任务就绪表中查找具有最高优先级别就绪任务的代码,然后进行任务切换。

任务切换的工作分成两步:第一步是获得待运行任务的TCB指针;第二步是进行断点数据的切换。

任务切换的工作是靠OSCtxSw()来完成的。

五. 任务的创建

OSTaskCreate()
OSTaskCreateExt()

六. 任务的挂起和恢复


挂起任务:
INT8U OSTaskSuspend(INT8U prio);
恢复任务:
INT8U  OSTaskResume (INT8U prio);
任务的删除:
INT8U  OSTaskDel (INT8U prio);
也就是把该任务置于睡眠状态,把任务控制块链表中删除,并归还给空任务控制链表。

uc/os中对任务的总体理解相关推荐

  1. uc/OS-II操作系统:uc/OS中的任务_上(如不懂——>请收下我的膝盖)

    uc/OS中任务的学习目录 注:本章未写完的在后面章节会继续书写 (1)任务的基本概念 (2)任务堆栈 (3)任务控制块及任务控制块链表 (4)任务就绪表及任务调度 (5)任务的创建 (6)任务的挂起 ...

  2. 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理

    1 LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! 2 MOV ES:[BX+2], SS ;将当前SS(栈的基 ...

  3. uc/OS-II操作系统:uc/OS中的任务_下(如不懂——>请收下我的膝盖)

    注:本章接着上一章节书写 六.任务的挂起和恢复 (1)挂起一个任务,就是暂停这个任务的调度. (2)挂起任务的 TCB 还存在系统中,只是该任务的状态是 "挂起" ,对挂起态的任务 ...

  4. uC/OS和uClinux的比较

    摘    要: 嵌入式操作系统是嵌入式系统应用的核心.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结了嵌入式操作系统应用中的若干问题,归纳了嵌入式操作系统的选型依据. 引言     随着现代 ...

  5. UC/OS和UCLinux比较

    随着现代计算机技术的飞速发展和互联网技术的广泛应用,从pc时代过渡到了以个人数字助理.手持个人电脑和信息家电为代表的3c(计算机.通信.消费电子)一体的后pc时代.后pc时代里,嵌入式系统扮演了越来越 ...

  6. 嵌入式系统 操作系统 uC/OS uClinux

    摘要:嵌入式操作系统是嵌入式系统应用的核心软件.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结嵌入式操作系统应用中的若干问题,归纳嵌入式操作系统的选型依据. 关键词:嵌入式系统 操作系统 u ...

  7. uc/os学习之路(一) —— 初识uc/os

    初识实时操作系统 实时操作系统是指当外界事件或数据产生时,能在规定的时间内进行处理并作出相应.实时操作系统有一下基本特征: 多任务操作系统 多级中断机制 优先调度机制 现广泛使用的实时操作系统有很多种 ...

  8. UC 国际信息流推荐中的多语言内容理解

    导读:本次分享的题目是 UC 国际信息流推荐中的多语言内容理解,讲一下我们在国际信流推荐场景下的多语言内容理解方面的一些工作和思考,主要分为: 多语言内容理解的需求和挑战 多语言内容结构化信号建设方法 ...

  9. UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

    UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...

最新文章

  1. Python迁移MySQL数据到MongoDB脚本
  2. 福利一波,赠票:2018杭州云栖大会 - 单日票(9月22日)
  3. 步步为营-68-asp.net简单练习(get set)
  4. 创建对象的序列化文件 - SoapFormatter,binaryFormatter以及XmlSerializer序列化文件的比较...
  5. 如何开始学习编程?这 3 步很重要
  6. 修复 Xcode 错误 “The identity used to sign the executable is no longer valid”
  7. 【转】刨根究底字符编码【2.0版】(3):字符编码的由来、演变与ASCII码
  8. 春节直播大战搜狐另辟蹊径 40余场直播引领牛年直播综艺新风尚
  9. 值得借鉴的促销海报模板素材,卖不出去都难
  10. 数据库第二节 sql表格创建及内容插入和查询
  11. 浪潮gs开发平台学习---平台快速开发入门
  12. VS2010:外部依赖目录错误,怎么办
  13. html+js实现分页功能
  14. 2010年会考计算机试题,2010年浙江省信息技术会考试题 选择题 - 多媒体 - 图文
  15. 微信小程序开发坑背景图之微博图床
  16. 外贸里面 LC TT DP DA BG 是什么
  17. python画xy轴_python画双y轴图像的示例代码
  18. 关于如何在word中使用EndNote引用知网的文献
  19. 微信测试号中token和url的设置
  20. 不用网的cmd小游戏来啦

热门文章

  1. Hopfield神经网络和TSP问题
  2. oracle间隔分区
  3. 配置数据库引擎BDE(Borland DataBase Engine)
  4. python判断操作系统类型
  5. Java 中的注解是如何工作的?
  6. Java 中几种常用的 RPC 框架介绍
  7. 这些让人抓狂的烂代码,你碰到几种?
  8. 对 Session 的深入探讨
  9. 磁盘满了,为啥du却显示还有很大空间?
  10. 【随笔】JVM核心:JVM运行和类加载