uc/OS-II操作系统:uc/OS中的任务_下(如不懂——>请收下我的膝盖)
注:本章接着上一章节书写
六、任务的挂起和恢复
(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中的任务_下(如不懂——>请收下我的膝盖)相关推荐
- uc/OS-II操作系统:uc/OS中的任务_上(如不懂——>请收下我的膝盖)
uc/OS中任务的学习目录 注:本章未写完的在后面章节会继续书写 (1)任务的基本概念 (2)任务堆栈 (3)任务控制块及任务控制块链表 (4)任务就绪表及任务调度 (5)任务的创建 (6)任务的挂起 ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_task.c)任务管理
前言 这个任务管理源代码,是整个系统最核心的部分,也是最难的部分,多看几遍吧.其中的核心结构体是: typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Poi ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_mbox.c)消息邮箱
前言 关于消息邮箱,是一个消息邮箱里面,只能存储一条消息.核心结构体如下: #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u) typedef s ...
- python批量修改文件名为excel中指定名称_在Python脚本的帮助下,使用excelsh中的名称映射重命名文件夹中的文件名...
在一个文件夹中有许多CSV文件我想重命名.有一个excel工作表,其中包含要重命名为文件夹的文件名.在 文件夹中的文件名为 测试数据?30四月.csv在 测试数据?20四月.csv在 测试数据18四月 ...
- 【学习编程】献给迷茫中的你,教你如何快速入门编程,如何从编程小百到 IT 巨佬?零基础自学请收下这份学习指南(经验分享)
导语 编程初学者可能都思考过这个问题: "我该怎么学编程?我要选择哪门编程语言比较适合我呢?......" 今天小编教大家认识编程语言,了解编程语言. 我们已经迈进了崭新的2023 ...
- JAVA中useDrlimiter方法_今天来讲讲分布式环境下,怎么达到对象共享,以及实现原子性(atomic),以Redis中的Redisson为例(实现分布式锁、分布式限流等)...
相信各位对redis肯定是不陌生的,一个高吞吐量的内存型结构存储数据库.可用用于很多业务场景,能够有效的解决很多复杂的并发问题,分布式问题. 下面粘一下中文官网介绍: 关于解决对象共享问题,很多方式, ...
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- Lab 6:uC/OS II
为什么80%的码农都做不了架构师?>>> 目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...
- 嵌入式系统 操作系统 uC/OS uClinux
摘要:嵌入式操作系统是嵌入式系统应用的核心软件.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结嵌入式操作系统应用中的若干问题,归纳嵌入式操作系统的选型依据. 关键词:嵌入式系统 操作系统 u ...
最新文章
- LLVM数据流分析的理论
- Python基础知识(第五天)
- 推荐一款文件搜索神器Everything!
- WSDM Cup 2020 引用意图识别赛道冠军解决方案(附答辩视频、PPT和代码)
- Mac终端建立替身 并置于桌面或Finder中
- Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为
- 作为开发人员,你都听产品经理的,做的累不累?
- 产品管理职位的级别都有哪些
- 洛谷P3006 [USACO11JAN]瓶颈Bottleneck(堆模拟)
- MATLAB元胞自动机报告,元胞自动机概述与MATLAB实现
- 开发中常见的@NotNull,@NotBlank,@NotEmpty注解的区别
- # 生成单色位二维码图_如何2个小时内学会ps抠图-纯干货
- Webpack实战(四):教教你如何轻松搞定-预处理器(loader)
- 特斯拉回应Model 3新车无USB接口:芯片短缺
- php 查询和redis,php如何查询redis
- 利用HTML+CSS,写出一个正方体并实现透视效果
- 高性能web 架构之 mysql 读写分离
- 软路由Linux7,CentOS 7 NAT软路由
- 教你怎样无需微云会员满速下载文件
- 怎么登录163vip邮箱,登录方式有哪些?