ucos-ii学习笔记——信号量集(事件标志组)的原理及使用

2023-05-16



ucos-ii学习笔记——信号量集(事件标志组)的原理及使用

 

Created on: 2012-10-8

      Author: zhang bin

 

学习笔记

for ucos-ii  PC

redesigned by zhang bin

2012-10-8

versionsV-0.1

All Rights Reserved

 

 

 

 

#include "INCLUDES.h"

 

#define  TASK_STK_SIZE        512                    

 

OS_STK        StartTaskStk[TASK_STK_SIZE];  //起始任务  

OS_STK        MyTaskStk[TASK_STK_SIZE];

OS_STK        YouTaskStk[TASK_STK_SIZE];

OS_STK        HerTaskStk[TASK_STK_SIZE];

 

 

char *s1= "Mytask is running";

char *s2= "Youtask is running";

char *s3= "Hertask is running";

 

INT8U  err;  //返回的错误信息

INT8U  y=0;   //字符显示位置  

 

OS_FLAG_GRP  *Sem_F;    //定义一个信号量集指针,是标志组类型,OS_FLAG_GRP类型的指针  用标志组描述信号量集

//事件控制块用来描述信号量,消息邮箱,消息队列

 

void  StartTask(void *data);               

void  MyTask(void *data);                  

void  YouTask(void *data);                  

void  HerTask(void *data);                  

 

 

 

void  main (void)

{

    OSInit();                                              

    PC_DOSSaveReturn();                                    

    PC_VectSet(uCOS, OSCtxSw);                             

    

    Sem_F=OSFlagCreate(0,&err);    //创建信号量集 函数的原型为:OS_FLAG_GRP *OSFlagCreate(OS_FLAGS flags,INT8U *err)

    //其中参数OS_FLAGS flags是信号的初始值,在这里指定为0,即信号初始值为0.参数*err是错误信息,前面已经定义了

    //INT8U  err;  //返回的错误信息,所以此处为&err

    //返回值为OS_FLAG_GRP型的指针,即为创建的信号量集的标志组的指针,

    //前面已经定义了OS_FLAG_GRP  *Sem_F;    //定义一个信号量集指针

    

    OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE 1], 0); //创建起始任务

    

    OSStart();      

}

 

 

 

void  StartTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==     

    OS_CPU_SR  cpu_sr;

#endif

    INT16S        key;             

    pdata = pdata;        

    OS_ENTER_CRITICAL();  //进入临界段

    PC_VectSet(0x08, OSTickISR);                           

    PC_SetTickRate(OS_TICKS_PER_SEC);                      

    OS_EXIT_CRITICAL();   //退出临界段

 

    OSStatInit();     

    

    OSTaskCreate(MyTask, (void *)0, &MyTaskStk[TASK_STK_SIZE 1], 3); //在起始任务中创建三个任务

    OSTaskCreate(YouTask, (void *)0, &YouTaskStk[TASK_STK_SIZE 1], 4);

    OSTaskCreate(HerTask, (void *)0, &HerTaskStk[TASK_STK_SIZE 1], 5);

   

    for (;;) {

     //如果恩下ESC键,则退出UC/OS-II

        if (PC_GetKey(&key) == TRUE) {                     

            if (key == 0x1B) {                             

                PC_DOSReturn();                            

            }

        }

        OSTimeDlyHMSM(0, 0, 3, 0);                         

    }

}

 

 

void MyTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==  

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for)

{

OSFlagPend(   //请求信号量集

Sem_F,   //请求信号量集指针

(OS_FLAGS)3,    //过滤器 请求第0和第1位信号 0011 这里是把数据3强制转化为OS_FLAGS类型的数据,

//因为过滤器和信号量集中的信号都是OS_FLAGS类型的数据

//OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,   //信号全是1表示信号有效 参数OS_FLAG_CONSUME表示当

//任务等待的事件发生后,清除相应的事件标志位

OS_FLAG_WAIT_SET_ALL,   //信号全是1表示信号有效  没有加参数OS_FLAG_CONSUME,所以不会清除标志位

0,    //等待时限,0表示无限等待

&err   //错误信息 

);  

//任务MyTask在这里请求信号量集,如果请求到了信号量集,就继续运行,下面就显示信息,如果请求不到信号量集

//MyTask就挂起,处于等待状态,只到请求到了信号量集才继续往下运行

 

PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);  //显示信息

OSTimeDlyHMSM(0,0,2,0);  //等待2s

}

}

 

 

void YouTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for)

{

PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);  //显示信息

 

OSTimeDlyHMSM(0,0,8,0);  //等待8s

 

OSFlagPost(    //向信号量集发信号

Sem_F,    //发送信号量集的指针

(OS_FLAGS)2,    //选择要发送的信号 给第1位发信号 0010  同样把2强制转化为OS_FLAGS型的数据,

//因为信号为OS_FLAGS型的

OS_FLAG_SET,   //信号有效的选项 信号置 OS_FLAG_SET为置 OS_FLAG_CLR为置 

&err   //错误信息

);

OSTimeDlyHMSM(0,0,2,0);  //等待2s

}

}

 

 

 

void HerTask(void *pdata)

{

#if OS_CRITICAL_METHOD ==                                

    OS_CPU_SR  cpu_sr;

#endif

pdata=pdata;

for)

{

PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);  //显示信息

OSTimeDlyHMSM(0,0,8,0);  //等待8s

OSFlagPost(   //向信号量集发信号

Sem_F, 

(OS_FLAGS)1,    //给第0位发信号  0001,把1强制转化为OS_FLAGS型的

OS_FLAG_SET,   //信号置1

&err 

 );

OSTimeDlyHMSM(0,0,1,0);  //等待1s

}

}

//因为任务MyTask请求信号量集的时候请求的是第一位和第零位,所以下面两个任务分别发送第一位和第零位信号

 

//有一个问题:任务请求信号量集,得到信号后,信号量集中的对应的信号会被清除么??从本例的运行现象来看,好像

//是没有清除,因为当第一次YouTaskHerTask运行后,间隔了8s任务MyTask才运行,因为YouTaskHerTask都等待了8s

//才向信号量集发送信号。这个显现是正常的。但是以后MyTask每间隔2s就运行一次,没有间隔8s,等待信号量集。

 

//查到了:OSFlagPend()函数允许指定在任务等待的事件发生后,重新置起或是清除相应的事件标志位。这是通过在调用

//OSFlagPend()函数时将一个常量OS_FLAG_CONSUME和参数wait_type”(或者相”)来实现的。

//例如希望等待事件标志组的BIT0位置位,而此时事件标志组的BIT0位已经置位了,那么如果在调用OSFlagPend()时,把参数

//wait_type加上OS_FLAG_CONSUME,就能清除这个事件标志位。如下所示:(详细说明,参见P210)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ucos-ii学习笔记——信号量集(事件标志组)的原理及使用 的相关文章

  • Git使用之——冲突解决一(git merge conflict)

    Git冲突是在多用户协同工作下出现 xff0c 在一些情况下Git可以智能自动合并 xff0c 但有时需要用户手动合并 xff08 本文链接 xff1a http blog csdn net u012150179 article detai
  • git fetch 的简单用法:更新远程代码到本地仓库

    Git中从远程的分支获取最新的版本到本地方式如下 xff0c 如何更新下载到代码到本地 xff0c 请参阅ice的博客基于Github参与eoe的开源项目指南 方式一 1 查看远程仓库 1 2 3 4 5 6 git remote v eo
  • 各类数值型数据间如何混合运算?

    整型 包括int xff0c short xff0c long 实型 包括float xff0c double 可以混合运算 前已述及 xff0c 字符型数据可以与整型通用 xff0c 因此 xff0c 整型 实型 字符型数据间可以混合运算
  • 整型与字符型相加

    想通过整型与字符型相加的到正确的整型数值 xff0c xff0c 见下面的程序 xff1a include lt stdio h gt void main int a 61 2 char c 61 39 3 39 int b 61 a 43
  • Scrapy研究探索(五)——自动多网页爬取(抓取某人博客所有文章)

    首先 xff0c 在教程 xff08 二 xff09 xff08 http blog csdn net u012150179 article details 32911511 xff09 中 xff0c 研究的是爬取单个网页的方法 在教程
  • Scrapy研究探索(六)——自动爬取网页之II(CrawlSpider)

    原创 xff0c 转载注明 xff1a http blog csdn net u012150179 article details 34913315 一 目的 在教程 xff08 二 xff09 xff08 http blog csdn n
  • reStructuredText

    此文章转自 xff1a http wstudio web fc2 com others restructuredtext html 还有一篇中文教程也可以 xff1a http jwch sdut edu cn book rst html
  • 智能指针tr1::shared_ptr、boost::shared_ptr使用

    对于tr1 shared ptr在安装vs同时会自带安装 xff0c 但是版本较低的不存在 而boost作为tr1的实现品 xff0c 包含 Algorithms Broken Compiler Workarounds Concurrent
  • 关于CSDN几点用户体验较差的功能(收藏夹和草稿箱)

    1 收藏夹不去重 同一专栏或博客每点一次 收藏 都会增加到收藏夹中 收藏内容一般有两种形式 xff1a xff08 1 xff09 专栏收藏 xff08 2 xff09 博客文章收藏 对于前者 xff0c 虽然专栏的文章数量可能是不断在增加
  • 关于提高效率的几点

    有些时候感觉一直没闲着却没看见多少成果 突然看见这篇文章 xff08 http www cppfans org 1644 html xff09 xff0c 虽然不能全部认同 xff0c 但是的确有些部分还是值得思考的 以下为转载 xff1a
  • PX4应用examples[1]:px4_simple_app解析与自己的功能模块构建

    PX4应用examples 1 px4 simple app解析与自己的应用构建 px4 simple app源代码学习代码分析第一部分 PX4简单打印消息的发布第二部分 传感器信息的获取关于sensor combined的介绍 xff1a
  • 已将GitHub scrapy-redis库升级,使其兼容最新版本Scrapy

    1 代码升级 之前的问题 xff1a 随着Scrapy库的流行 xff0c scrapy redis作为使用redis支持分布式爬取的工具 xff0c 也不断的被大家发现 但是 xff0c 使用过程中你会发现的问题是由于scrapy red
  • CMake应用:交叉编译

    交叉编译指的在一个平台上生成另一个平台上的可执行代码 很多时候 xff0c 开发的代码可能并不只是在开发主机的平台上执行 xff0c 比如在Windows下开发的程序 xff0c 希望能够在Linux 或者MacOS下执行 xff1b 或者
  • 手把手教你在Github上建立自己的个人博客网站

    概述 之前闲着没事 就利用Github建了一个个人博客网站 效果还不错 今天就来分享一下 建立自己个人博客网站的好处 1 面试装逼 这个不必多说 2 把平时积累的知识和项目记录下来 方便日后查看使用 3 不受其他博客平台的限制 准备工作 开
  • Realsense D435保存图像

    你可以走慢一点 xff0c 但脚步不能停下来 Realsense是我使用的第3款深度传感器 xff0c 前两款分别是Orbbec和Kinect v2 xff0c 奥比中光的深度传感器只需要USB接口 xff0c 但深度图的效果并不好 xff
  • Realsense T265简单测试

    为啥才是周三 xff01 xff01 软硬件配置 CPU xff1a Intel Core i7 7820HQ CPU 64 2 90GHz 8 内存 xff1a 16G 系统版本 xff1a Ubuntu16 04 LTS 64位 深度传
  • 生成随机数方法总结

    使用srand time NULL 或srand time 0 设置当前的系统时间值为随机数种子 xff0c 需要在头文件处使用 include lt cstdlib gt 和 include lt ctime gt 要取得 a b 的随机
  • 尚硅谷_JavaScript_学习笔记

    JavaScript简介 JavaScript 简介 xff1a JavaScript 是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言 xff0c 是一种动态 弱类型 基于原型的语言 xff0c 内置支持类 它的解释器被称为 Ja
  • SQL语句拼接常加 where 1=1 的原因

    数据库在进行查询的时候 xff0c 经常看到有的人使用where 1 61 1和1 61 0 1 61 2等的查询 xff0c 这种条件在执行前 xff0c 就会被计算出true 或者false xff0c 1 61 2实际解释为 NULL
  • 如何完全屏蔽Chrome的提示:"请停用以开发者模式运行的扩展程序"

    参考链接 xff1a chrome怎么安装非官方市场的插件 xff1f https www zhihu com question 24027794 屏蔽Google Chrome安装第三方插件之后反复提示 请停用以开发者模式运行的扩展程序

随机推荐

  • Win7中出错:无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll

    安装完 Python 后 xff0c 配置好 Python 目录于 Path xff0c 然后 CMD 命令下输入 python 验证是否配置成功 xff0c 但是竟然出现结果跳出对话框 xff0c 出错 xff1a 无法启动此程序 xff
  • rviz global status显示为error的问题解决

    rviz global status显示为error的问题解决 运行ros官方教程中程序rosrun rviz rviz d rospack find turtle tf rviz turtle rviz rviz 发现出现的结果 xff0
  • Chrome浏览器各个版本区别及离线安装包下载

    chrome现在分为 Stable Beta Dev Canary xff08 金丝雀 xff09 Chromium 五个版本 这五个版本的不同在于功能 稳定性 更新速度等方面 Chromium的更新速度很快 xff0c 每隔数小时即有新的
  • 【总结】浏览器 User-Agent 大全

    一 基础知识 Http Header之User Agent User Agent中文名为用户代理 xff0c 是Http协议中的一部分 xff0c 属于头域的组成部分 xff0c User Agent也简称UA 它是一个特殊字符串头 xff
  • Visual Studio 2017各版本安装包离线下载、安装全教程

    微软最近发布了正式版Visual Studio 2017并公开了其下载方式 xff0c 不过由于VS2017采用了新的模块化安装方案 xff0c 所以微软官方并未提供ISO镜像 xff0c 但是官方提供了如何进行离线下载的方案给需要进行离线
  • Python基础入门笔记(一)

    前言 xff08 认识Python xff09 既然学习 Python xff0c 那么至少得了解下这门语言 xff0c 知道 Python 代码执行过程吧 Python 的历史有兴趣的百度百科下就有 xff0c 这个不多说了 1 我们先来
  • Spring学习笔记1

    前言 Spring框架的学习路线 xff1a Spring第一天 xff1a Spring的IOC容器之XML的方式 xff0c Spring框架与Web项目整合Spring第二天 xff1a Spring的IOC容器之注解的方式 xff0
  • GitHub学生包的介绍与申请

    1 Github学生包介绍 1 Github学生包是什么 xff1f GitHub 学生包是一个由 GitHub 免费提供给学生的福利 xff0c 里面包括了计算机专业可能用到的很多付费资源 xff0c 其中包含一系列网站服务的打折 代金券
  • (二)GitHub的使用随记

    一 Git及GitHub的使用 1 突破GitHub单个大文件上传限制 GitHub 上新建的仓库容量大小限制在 1G xff0c 单个文件不能超过 100M xff0c 有 50M 的文件 xff0c 就会警告了 可通过以下命令查找超过
  • 总结一个月以来调试STM32底盘踩过的坑

    深坑1 xff1a 基本配置方法 xff1b 配置PWM输出 xff0c TIM4有四路PWM输出 xff0c 依葫芦画瓢开始配置 xff0c 配置完后 xff0c 开始测试 xff0c 啥都没有啊 xff0c 很是伤心 xff0c 开始查
  • Android开发60条技术经验总结

    1 全部Activity可继承自BaseActivity xff0c 便于统一风格与处理公共事件 xff0c 构建对话框统一构建器的建立 xff0c 万一需要整体变动 xff0c 一处修改到处有效 2 数据库表段字段常量和SQL逻辑分离 x
  • 无人机利用视觉slam实现位置估计

    无人机利用视觉slam实现室内位置估计 自己近期所做的以及思考的东西 我们实验室买了阿木的p200 带t265 无人机用于无人机的控制研究 xff0c 通过阿木实验室的ros功能包px4 command可以 无脑的实现飞机的悬停功能 xff
  • 学习api的使用方式

    网上有很多API教程 xff0c 但是都是针对单个API的使用来讲解 xff0c 但是如果遇到网上没有教程的API呢 xff1f 这篇教程的目的就是这样 xff1a 当遇到一个不会的API的时候 xff0c 懂得如何利用资料学会使用这个AP
  • 解决favicon.ico无法显示的问题

    今天在做站的时候发现网站favicon ico图标不显示 xff0c favicon是什么 xff1f 其实我们在浏览器看网页的时候 xff0c 在地址栏的左边 xff0c 你就可以看到一个小的图标 xff08 每个网站都不一样 xff09
  • RTK和GPS定位

    GPS定位的基本原理是 xff0c 测量出已知位置的卫星到地面GPS接收器之间的距离 xff0c 然后接收器通过与至少4颗卫星通讯 xff0c 计算与这些卫星间的距离 xff0c 就能确定其在地球上的具体位置 普通GPS的定位精度 1米 x
  • ESP8266EX 串口WIFI无线模块

    介绍 内部跑LWIP协议 xff0c 支持三种模式 xff1a AP STA AP 43 STA共存模式 简洁高效的AT指令 特点 支持无线802 11 b g n标准 支持STA AP STA 43 AP 三种工作模式 内置CTP IP协
  • Cesium球心坐标与本地坐标系经纬转换的数学原理—矩阵变换

    之前整理过 xff1a 透析矩阵 xff0c 由浅入深娓娓道来 高数 线性代数 矩阵 三维旋转笔记 欧拉角 四元数 旋转矩阵 轴角 记忆点整理 xff0c 这次转载 FuckGIS的 Cesium之球心坐标与本地坐标 xff0c 算是线性代
  • 怎么在keil官网上下载芯片固件包(*.pack)

    第一步 xff1a 登录keil官网 www keil com 第二步 xff1a 点击 Product 第三步 xff1a 点击 ARM development tools 第四步 xff1a Public software Packs
  • UCOS开发手册中关于OSQPend()函数讲

    转自 xff1a http www openedv com thread 44168 1 1 html UCOS开发手册中 第十章 UCOSIII消息传递 章节中关于等待消息队列的函数OSQPend 讲解有误 xff0c OSQPend 函
  • ucos-ii学习笔记——信号量集(事件标志组)的原理及使用

    xfeff xfeff ucos ii学习笔记 信号量集 事件标志组 的原理及使用 Created on 2012 10 8 Author zhang bin 学习笔记 for ucos ii PC redesigned by zhang