注:本章接着上一章节书写

六、任务的挂起和恢复

(1)挂起一个任务,就是暂停这个任务的调度。
(2)挂起任务的 TCB 还存在系统中,只是该任务的状态是 “挂起” ,对挂起态的任务uC/OS-II不再调度运行。
(3)挂起的任务恢复后即可参与uC/OS-II的任务调度。
(4)uC/OS-II中,可挂起除 “空闲任务”(OSTaskIdel( )) 外的任何任务。
(5)挂起/恢复使用系统函数OSTaskSuspend( ) / OSTaskResume( ) 实现。

1、挂起任务的函数原型

INT8U OSTaskSuspend( INT8U  prio );
本函数的参数、返回值及含义:
用优先级指定目标,挂起自身时使用OS_PRIO_SELF
OS_NO_ERR --- 完成指定任务的挂起。
OS_TASK_SUSPEND_IDEL --- 不能挂起空闲任务。
OS_PRIO_INVALID --- 无效的任务(优先级)指定。
OS_TASK_SUSPEND_PRIO ---指定的任务不存在。

2、恢复任务函数原型

INT8U OSTaskResume( INT8U  prio );
本函数的参数、返回值及含义:
用优先级指定目标。
OS_NO_ERR --- 完成指定任务的恢复。
OS_TASK_RESUME_PRIO --- 优先级指定的任务不存在。
OS_PRIO_INVALID --- 无效的任务(优先级)指定。
OS_TASK_NO_SUSPEND --- 指定的任务不是挂起态。

七、其他任务管理函数

1、修改任务优先级别函数原型

INT8U OSTaskChangePrio(INT8U  oldprio,   INT8U newprio );
函数说明:
在任务运行时,修改任务的优先级。
功能正确完成,函数返回 OS_NO_ERR。
OS_PRIO_INVALID ---- 指定的 prio 越界。
OS_PRIO_EXIST ---- newprio 已在用。
OS_PRIO_ERR ---- oldprio 不存在。

2、任务的删除函数原型

INT8U OSTaskDel( INT8U  prio );
函数说明:
使用 OS_PRIO_SELF 参数删除任务时是删除自身。
功能正确完成,函数返回 OS_NO_ERR。
删除一个任务实质上是删除该任务的TCB并归还到“空任务控制块链表” ,释放堆栈空间,并不删除任务代码。

(1)关于任务的删除
》“任务A” 在删除 “任务B” 时,A不能知道B的详细情况,可能会造成A已申请的资源从系统中永久的丢失 — 这不合理!
》正确的方法 — Task_A 欲删除 Task_B 时,A 提出删除申请,B根据自身的情况处理后,删除自身。
》uC/OS-II 中的 TCB 含有一个成员 OSTCBDelReq 用于标示有其他任务申请删除它。
》使用系统函数 OSTaskDelReq( ) 提出任务删除申请。
》ISR 中不允许删除任务。

3、系统函数原型

INT8U  OSTaskDelReq( INT8U  prio ) ;
优先级指定其他任务时的函数返回值说明:
OS_TASK_IDEL_PRIO --- 申请删除空闲任务出错。
OS_PRIO_INVALID --- 优先级指定出错。
OS_TASK_NOT_EXIST --- 优先级指定的任务已不存在。
OS_NO_ERR --- 删除申请成功。特别说明:此函数的参数可以是 “优先级” 指定的其他任务,也可以是OS_PRIO_SELF        指定自身,后者用于查阅是否有其他任务申请删除本任务。
代码如下:
举例:Task_A (prio = 10) 删除 Task_B (prio = 9) ,直到删除成功,Task_A才继续。Void  Task_A ( void *pdata )     // Task_A prio = 10
{    … …while ( OSTaskDelReq(9) != OS_TASK_NOT_EXIST )  // 申请删除Task_B{    OS_TimeDly( 10 );    }               // 直到删除成功… …
}Void  Task_B ( void *pdata )       // Task_B prio = 9
{    … …if ( OSTaskDelReq( OS_PRIO_SELF ) == OS_TASK_DEL_REQ )  // 有删除申请{   … …               // 释放私有资源OSTaskDel ( OS_PRIO_SELF );        // 删除自身}else{… … ;       // 任务B的其他代码}
}

八、uc/OS-II的初始化和任务的启动

1、uc/OS-II的初始化

在使用uC/OS-II之前,必须对其运行环境初始化:
void  OSInit( viod ) ;
用法举例:
void main (void)
{......OSInit();     /* Initialize uC/OS-II */......         /* Craete Task */OSStart();     /* Start Multitasking */
}
OSInit( ) 的主要工作:
(1)对 uC/OS-II 的所有全局变量和数据结构初始化。
(2)创建空间任务( OSTaskIdel() )
(3)根据系统设置( OS_TASK_STAT_EN = 1 / 0 ) 启动统计任务。

2、uc/OS-II的启动

void  OSStart( viod ) ;
用法举例:
void main (void)
{......OSInit();     /* Initialize uC/OS-II */......         /* Craete Task */OSStart();     /* Start Multitasking */
}
主函数 main( ) 调用了OSStart( ) 之后,uC/OS-II 才开始任务调度管理。

九、关于任务的总结

(1)Task 由 TCB、Task_Stack、Task_Code 三部分组成。
(2)uC/OS-II使用 TCB 对任务进行控制。
(3)Task_Stack 用于任务切换时私有现场保护。
(4)uC/OS-II 按任务优先级对任务进行调度。
(5)uC/OS-II 每调用一次API函数和中断返回都会进行一次任务调度。
(6)任务调度的周期和任务调度器自身的运行事件无关。
(7)任务的优先级(prio)也是任务的句柄。
(8)uC/OS-II 的初始化和启动。

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

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

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

  2. 【 uC/OS II 】uC/OS II 源代码阅读(os_task.c)任务管理

    前言 这个任务管理源代码,是整个系统最核心的部分,也是最难的部分,多看几遍吧.其中的核心结构体是: typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Poi ...

  3. 【 uC/OS II 】uC/OS II 源代码阅读(os_mbox.c)消息邮箱

    前言 关于消息邮箱,是一个消息邮箱里面,只能存储一条消息.核心结构体如下: #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u) typedef s ...

  4. python批量修改文件名为excel中指定名称_在Python脚本的帮助下,使用excelsh中的名称映射重命名文件夹中的文件名...

    在一个文件夹中有许多CSV文件我想重命名.有一个excel工作表,其中包含要重命名为文件夹的文件名.在 文件夹中的文件名为 测试数据?30四月.csv在 测试数据?20四月.csv在 测试数据18四月 ...

  5. 【学习编程】献给迷茫中的你,教你如何快速入门编程,如何从编程小百到 IT 巨佬?零基础自学请收下这份学习指南(经验分享)

    导语 编程初学者可能都思考过这个问题: "我该怎么学编程?我要选择哪门编程语言比较适合我呢?......" 今天小编教大家认识编程语言,了解编程语言. 我们已经迈进了崭新的2023 ...

  6. JAVA中useDrlimiter方法_今天来讲讲分布式环境下,怎么达到对象共享,以及实现原子性(atomic),以Redis中的Redisson为例(实现分布式锁、分布式限流等)...

    相信各位对redis肯定是不陌生的,一个高吞吐量的内存型结构存储数据库.可用用于很多业务场景,能够有效的解决很多复杂的并发问题,分布式问题. 下面粘一下中文官网介绍: 关于解决对象共享问题,很多方式, ...

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

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

  8. Lab 6:uC/OS II

    为什么80%的码农都做不了架构师?>>>    目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...

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

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

最新文章

  1. LLVM数据流分析的理论
  2. Python基础知识(第五天)
  3. 推荐一款文件搜索神器Everything!
  4. WSDM Cup 2020 引用意图识别赛道冠军解决方案(附答辩视频、PPT和代码)
  5. Mac终端建立替身 并置于桌面或Finder中
  6. Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为
  7. 作为开发人员,你都听产品经理的,做的累不累?
  8. 产品管理职位的级别都有哪些
  9. 洛谷P3006 [USACO11JAN]瓶颈Bottleneck(堆模拟)
  10. MATLAB元胞自动机报告,元胞自动机概述与MATLAB实现
  11. 开发中常见的@NotNull,@NotBlank,@NotEmpty注解的区别
  12. # 生成单色位二维码图_如何2个小时内学会ps抠图-纯干货
  13. Webpack实战(四):教教你如何轻松搞定-预处理器(loader)
  14. 特斯拉回应Model 3新车无USB接口:芯片短缺
  15. php 查询和redis,php如何查询redis
  16. 利用HTML+CSS,写出一个正方体并实现透视效果
  17. 高性能web 架构之 mysql 读写分离
  18. 软路由Linux7,CentOS 7 NAT软路由
  19. 教你怎样无需微云会员满速下载文件
  20. 怎么登录163vip邮箱,登录方式有哪些?

热门文章

  1. matlab编jacobi方法,jacobi迭代法matlab
  2. Docker(六)镜像安装
  3. 【iOS开发】国内首款轨迹记录App的开发(机器学习)
  4. 使用Elasticsearch第三方包Bboss批量提交新增、修改、删除请求
  5. NBA球衣号码的意义
  6. 贪心算法|柠檬水找零
  7. 云加速——主机安全软件
  8. 罗技无线键鼠套装更换鼠标的配对方法
  9. 【个人博客 hexo】一个小时就搭好属于自己的博客
  10. 进行信息系统审计的流程及计算机技术要求