UCOSIII 任务的挂起与解挂

当某个任务在等待一些事情的时候,比如信号量、消息队列(以后会用到的)等,或者调用延时函数,该任务会进入挂起的状态,但是这是系统自动把任务挂起来的,不需要我们手动干预。虽然系统很多时候都可以把任务挂起来,但是有时候我们想手动把任务挂起来了该怎么办呢,其实UCOS已经给我们预留了任务挂起和解挂的API函数,

1、OSTaskSuspend()

2、OSTaskResume()

这两个函数功能很简单,一个是挂起任务,另外一个是解挂任务。这篇总结很短,内容也不多,但还是觉得有必要单独写一份这方面的总结。写的这些总结不会介绍完所有API函数,只是觉得常用的函数和功能会总结下,想要完整的API手册还是买书吧,我的这些总结也是看书后写的,,我看的书籍是《uc/os-iii,the real-time kernel》,是UCOS系统的作者写的。

1、OSTaskSuspend()

任务挂起函数,顾名思义,功能就是挂起某个任务,任务可以把自己挂起来,也可以挂起别的任务。函数原型及参数解释

函数原型

void  OSTaskSuspend(OS_TCB  *p_tcb,

OS_ERR  *p_err)

函数使能开关

OS_CFG_TASK_SUSPEND_EN

OS_TCB  *p_tcb,

要挂起的任务的任务控制块,如果参数为null就是把自己挂起来

OS_ERR  *p_er

返回的错误码

注意事项

用函数OSTaskSuspend()挂起任务只能用OSTaskResume()解挂,所以OSTaskSuspend()和OSTaskResume()应该成对使用。任务的挂起有累加效应,比如一个任务a调用延时函数时被系统挂起来了,然后任务b又调用OSTaskSuspend()把a挂起来,那么a就被挂起来两次。如果a任务想要继续运行,那就要等别的任务调用OSTaskResume()把任务a解挂和延时时间到,注意这两个条件是与的关系,不是或的关系。还有另外一种情况,比如任务b调用5次OSTaskSuspend()把任务a挂起来,此时a任务挂起嵌套是5级,那么非a任务(任务不能给自己解挂)也要给a解挂5次a任务才能继续运行。

  1. OSTaskResume()

任务解挂函数,功能就是给呗OSTaskSuspend()挂起的任务解挂,函数原型及参数说明

函数原型

void  OSTaskResume (OS_TCB  *p_tcb,

OS_ERR  *p_err)

使能开关

OS_CFG_TASK_SUSPEND_EN

OS_TCB  *p_tcb,

要解挂的任务的任务控制块,这个参数不要传null,因为任务不能给自己解挂

OS_ERR  *p_err

返回的错误码

注意事项

任务不能给自己解挂

写了功能,功能很简单;建立4个任务,第一个任务用来创建另外三个任务,任务把自己删除掉,系统里就剩下三个任务在运行了。这三个任务有一个是LED闪烁任务,板子上电后可以看到LED在快速的闪烁。第二个任务是用来挂起LED任务的,在上电第5秒后把LED任务挂起来,然后这个任务把自己给删除了。第三个任务是用来给LED任务解挂的,在上电的第10秒把LED任务解挂,然后这个任务也把自己给删除掉。综上,我们看到板子上LED的闪烁情况是这样的,上电0-5秒LED一直快闪,到第5秒LED就不闪了(被挂起),然后到第10秒LED又开始闪烁了(解挂)。

代码如下;
Main.c文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"#include "task.h"
/************************************************ALIENTEK战舰STM32开发板UCOS实验技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司  作者:正点原子 @ALIENTEK
************************************************///UCOSIII中以下优先级用户程序不能使用,ALIENTEK
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司
//作者:正点原子 @ALIENTEK//*****************************************************************
//开始任务
OS_TCB  starTaskTCB;    //任务控制块
#define STAR_TASK_PRIO      3       //任务优先级
#define STAR_TASK_STK_SIZE  128 //任务堆栈总大小
CPU_STK STAR_TASK_STK[ STAR_TASK_STK_SIZE ];    //任务堆栈数组int main()
{OS_ERR myErr;          //os的错误码CPU_SR_ALLOC(); //使用临街保护就得添加这玩意,不然会报错delay_init();  //时钟初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置uart_init(115200);   //串口初始化LED_Init();             //LED初始化   OSInit(&myErr);              //os初始化//创建任务的时候进入临街保护比较好,但是这个函数非用户的API函数,用户使用是否合适以后再讨论OS_CRITICAL_ENTER(); //创建开始任务,在开始任务里创建其他任务,为每个函数入口参数都强制转换类型吧,以防万一OSTaskCreate (      (OS_TCB       *)&starTaskTCB,                       //任务控制块,(CPU_CHAR     *)"star task",                       //任务名字(OS_TASK_PTR   )starTaskFunc,                     //任务函数(void         *)0,                                            //任务函数入口参数(OS_PRIO       )STAR_TASK_PRIO,                   //任务优先级(CPU_STK      *)&STAR_TASK_STK[0],           //堆栈数组基地址(CPU_STK_SIZE  ) STAR_TASK_STK_SIZE/10,    //堆栈溢出限位(CPU_STK_SIZE  ) STAR_TASK_STK_SIZE,        //堆栈大小(OS_MSG_QTY    ) 0,                                           //本任务消息长度               (OS_TICK       ) 0,                                         //时间片个数(void         *) 0,                                          //任务块补充参数(OS_OPT        ) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,  //选项(OS_ERR       *)&myErr);                                //错误码OS_CRITICAL_EXIT();    //任务创建完了就该退出临界保护了                                   OSStart(&myErr);                //任务创建完成后就该运行了while(1);                     //运行系统后就一直在系统里面跑了,应该运行不到这里
}Task.c文件
#include "task.h"
#include "sys.h"
#include "led.h"
#include "includes.h" //想要使用UCOS系统,得包含这个头文件//LED秒闪任务,提示系统正在运行
OS_TCB  ledTaskTCB;
#define LED_TASK_PRIO 4
#define LED_TASK_STK_SIZE 128
CPU_STK LED_TASK_STK[LED_TASK_STK_SIZE];//串口输出任务1
OS_TCB  uartTask_1_TCB;
#define UART_TASK_1_PRIO 5
#define UART_TASK_1_STK_SIZE 128
CPU_STK UART_TASK_1_STK[ UART_TASK_1_STK_SIZE ];//串口输出任务2
OS_TCB  uartTask_2_TCB;
#define UART_TASK_2_PRIO 6
#define UART_TASK_2_STK_SIZE 128
CPU_STK UART_TASK_2_STK[ UART_TASK_2_STK_SIZE ];//串口输出任务3
OS_TCB  uartTask_3_TCB;
#define UART_TASK_3_PRIO 7
#define UART_TASK_3_STK_SIZE 128
CPU_STK UART_TASK_3_STK[ UART_TASK_3_STK_SIZE ];void starTaskFunc()
{   OS_ERR myErr;//创建LED闪烁任务OSTaskCreate (    (OS_TCB       *)&ledTaskTCB,(CPU_CHAR     *)"led task",(OS_TASK_PTR   )ledTaskFunc,(void         *)0,(OS_PRIO       )LED_TASK_PRIO,(CPU_STK      *)&LED_TASK_STK[0],(CPU_STK_SIZE  ) LED_TASK_STK_SIZE/10,(CPU_STK_SIZE  ) LED_TASK_STK_SIZE,(OS_MSG_QTY    ) 0,(OS_TICK       ) 0,(void         *) 0,(OS_OPT        ) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR       *)&myErr);//创建串口输出任务1                              OSTaskCreate (    (OS_TCB       *)&uartTask_1_TCB,(CPU_CHAR     *)"uart task 1 ",(OS_TASK_PTR   )uartTask_1_Func,(void         *)0,(OS_PRIO       )UART_TASK_1_PRIO,(CPU_STK      *)&UART_TASK_1_STK[0],(CPU_STK_SIZE  ) UART_TASK_1_STK_SIZE/10,(CPU_STK_SIZE  ) UART_TASK_1_STK_SIZE,(OS_MSG_QTY    ) 0,(OS_TICK       ) 0,(void         *) 0,(OS_OPT        ) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR       *)&myErr);//创建串口输出任务2                                  OSTaskCreate (    (OS_TCB       *)&uartTask_2_TCB,(CPU_CHAR     *)"uart task 2 ",(OS_TASK_PTR   )uartTask_2_Func,(void         *)0,(OS_PRIO       )UART_TASK_2_PRIO,(CPU_STK      *)&UART_TASK_2_STK[0],(CPU_STK_SIZE  ) UART_TASK_2_STK_SIZE/10,(CPU_STK_SIZE  ) UART_TASK_2_STK_SIZE,(OS_MSG_QTY    ) 0,(OS_TICK       ) 0,(void         *) 0,(OS_OPT        ) OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR       *)&myErr);//这个任务只是用来创建其他任务的,其他任务创建完成了这个任务也就没用了,删除掉       OSTaskDel((OS_TCB*)0,&myErr);
}   //LED任务的任务函数
//LED每隔500ms翻转一次,提示系统正在运行
void ledTaskFunc()
{OS_ERR myErr;while(1)      //注意,每个任务都是一个死循环{OSTimeDlyHMSM (      (CPU_INT16U  ) 0,      //时(CPU_INT16U  ) 0,        //分(CPU_INT16U  ) 0,        //秒(CPU_INT32U  ) 100,  //毫秒(OS_OPT      ) OS_OPT_TIME_HMSM_STRICT, //选项(OS_ERR      *)&myErr); //错误码LED = !LED;   //LED状态翻转}
}//串口任务1的任务函数
//功能;上电5秒后串口任务1把LED任务挂起来
void uartTask_1_Func()
{OS_ERR myErr;while(1){OSTimeDly(1000, OS_OPT_TIME_MATCH, &myErr );// 绝对模式,1000*5ms=5000msOSTaskSuspend((OS_TCB*)&ledTaskTCB, &myErr);//把LED任务挂起来OSTaskDel((OS_TCB*)0,&myErr);//这个任务只在上电第5秒运行一次,然后就把自己给删除掉}
}//串口任务2的任务函数
//功能;上电10秒后串口任务2把LED任务解挂,让LED任务继续运行
void uartTask_2_Func()
{OS_ERR myErr;while(1){OSTimeDly(2000, OS_OPT_TIME_MATCH, &myErr );// 绝对模式,2000*5ms=10000msOSTaskResume((OS_TCB*)&ledTaskTCB, &myErr);//把LED任务解挂OSTaskDel((OS_TCB*)0,&myErr);//这个任务只在上电第10秒运行一次,然后就把自己给删除掉}
}Task.h文件
#ifndef __TASK_H
#define __TASK_H     void starTaskFunc();
void ledTaskFunc();
void uartTask_1_Func();
void uartTask_2_Func();#endif

4-任务的挂起与解挂相关推荐

  1. linux 下C语言编程(2)——进程的创建,挂起,解挂,进程间通信

    在 linux 下利用C语言实现进程的创建,挂起和解挂操作 #include <stdio.h> #include <sys/stat.h> #include <sys/ ...

  2. UCOSII学习之路1 - 任务创建、删除、挂起、解挂

    前言 今天看到一年前关于UCOSII的相关博文,原计划是发表整个系列的,但是由于各种原因+作者比较懒,一直拉下了,但是一部分已经完成了初稿,就此发表吧!谬误之处敬请原谅.也提醒自己,做事一定要有始有终 ...

  3. FreeRTOS个人笔记-挂起/解挂任务

    根据个人的学习方向,学习FreeRTOS.由于野火小哥把FreeRTOS讲得比较含蓄,打算在本专栏尽量细化一点.作为个人笔记,仅供参考或查阅. 配套资料:FreeRTOS内核实现与应用开发实战指南.野 ...

  4. linux 挂载u盘考试,Linux 挂载U盘,与解挂

    linux下u盘使用 一般情况下: 在root用户中 ,先创建目录,然后挂载就行. mkdir /usb 插入U盘 用/sbin/fdisk -l,应该能看U盘的磁盘名/dev/sdd1 mount ...

  5. linux--挂载,解挂

    挂载:在linux操作系统中, 挂载是指将一个设备(通常是存储设备)挂接到一个已存在的目录上. 我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上, 然后通过访问这个目录来访问存 ...

  6. Umount解挂不了的解决方法

    Umount解挂不了的解决方法 一:出现问题 二:解决方法 一:出现问题 在linux中卸载不了,出现这种报错 [root@dbserver /]# umount /dev/sdb6 umount: ...

  7. Linux磁盘挂载解挂硬盘

    1.模拟添加磁盘   2.查看磁盘情况是否挂载上 df -h 该命令会显示出挂载磁盘和挂载点,下图有2个硬盘挂载 /dev/sda3 和 /dev/sda1 查看磁盘挂载情况 lsblk 上图中, 磁 ...

  8. centos7实现磁盘挂载,解挂,开机自动挂载,解决挂载文件覆盖问题

    [说明]查看磁盘情况 fdisk -l [说明]格式化磁盘 mkfs.ext4 /dev/vdd [说明]挂载磁盘到目录 mount /dev/vdd /home [警告]执行上述命令出现mount: ...

  9. (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记

    1.光盘的挂载与解挂 在Linux操作系统中,所有的存储设备都必须先挂载然后才能使用. 问题:为什么当我们直接访问/run/media/itheima/CentOS 7 x86_64就相当于访问光盘 ...

最新文章

  1. mysql解析运行时间_分析 MySQL 语句运行时间
  2. kafka的简单使用
  3. C++阶段01笔记04【程序流程结构(选择结构、循环结构、跳转语句)】
  4. asp.net core 2.0 web api基于JWT自定义策略授权
  5. 在Spring中了解事务注释
  6. 【转】进阶 JavaScript 必知的 33 个点【进阶必备】
  7. 商业方向的大数据专业_结合当前的人才需求趋势,大数据专业考研时可以选择哪些主攻方向...
  8. 分享朋友圈QQ空间需要哪些参数
  9. 美团搜索推荐多业务商品排序探索与实践
  10. Windows 10如何强制删除多余的语言包
  11. 有关Kill Session问题的讨论(旧文初发)
  12. php 数组任意位置插入值
  13. shell fork 阻塞进程_张三同学没答好「进程间通信」,被面试官挂了....
  14. 用.net动态创建类的实例 (转)
  15. php 处理eml,php读取eml实例、php解析eml、eml解析成网页
  16. Spring Boot Admin 发送监控邮件
  17. oracle数据库闪回详解
  18. Flash速度与加速度公式
  19. 关于加密解密有哪些你需要知道知识?一篇文章告诉你
  20. Android设置drawableRight或drawableLeft后设置图标与文字间距

热门文章

  1. (转)DEDECMS模板原理、模板标签学习 - .Little Hann
  2. 深度学习:GCN(图卷积神经网络)理论学习总结
  3. Q6:QIA一站式测试
  4. 高仿知乎android客户端,仿知乎分享界面
  5. AD16显示所有元件文本注释
  6. 汉堡王什么汉堡好吃_汉堡王什么汉堡好吃?隐藏的点单攻略快来看
  7. 我的世界JAVA会支持光追吗_光线追踪改变了「我的世界」,华硕ROG2060S显卡的光追体验...
  8. 开关电源-半桥LLC控制
  9. 两个苹果手机怎么定位_苹果手机很卡怎么办
  10. Java开发对接招行一网通支付功能的总结