UCOSII 信号量和信号量集实例

2023-05-16

代码来自于书本光盘 《嵌入式操作系统UCOSII原理及应用》

实例1信号量

#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];


INT16S   key; //用于退出uCOS_II的键
char * s1="MyTask";
char * s2="YouTask";


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


OS_EVENT *Fun_Semp;    //定义信号量


void  StartTask(void *data);
void  MyTask(void *data);
void  YouTask(void *data);
void  Fun(INT8U x,INT8U y);
void  Quitkey(void);


/************************主函数*********************************************/
void  main (void)
{
    OSInit(); //初始化uCOS_II
    PC_DOSSaveReturn(); //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断


    Fun_Semp=OSSemCreate(1);  //创建信号量
    OSTaskCreate(StartTask,0,&StartTaskStk[TASK_STK_SIZE - 1],0);
    OSStart();
}


//*****************************StartTask********************************************
void  StartTask(void *pdata)
{
    pdata=pdata;
    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);
    PC_SetTickRate(OS_TICKS_PER_SEC);
    OS_EXIT_CRITICAL();
//    OSStatInit();


    OSTaskCreate(MyTask,0,&MyTaskStk[TASK_STK_SIZE - 1],1);
    OSTaskCreate(YouTask,0,&YouTaskStk[TASK_STK_SIZE - 1],2);
OSTaskSuspend(OS_PRIO_SELF);


}
//*****************************MyTask********************************************
void  MyTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
// OSSemPend(Fun_Semp,0,&err);  //请求信号量
PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(9,y);
// OSSemPost(Fun_Semp);   //发送信号量
        Quitkey();
OSTimeDlyHMSM(0,0,1,0);
        }
}


//*****************************YouTask********************************************
void  YouTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
// OSSemPend(Fun_Semp,0,&err);
PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(10,y);
// OSSemPost(Fun_Semp);
        Quitkey();
OSTimeDlyHMSM(0,0,2,0);
        }
}


//*****************************Fun()********************************************
void  Fun(INT8U x,INT8U y)
{
PC_DispStr(x,y,"call Fun()",DISP_BGND_BLACK+DISP_FGND_YELLOW);
}


//*****************************Quitkey()********************************************
void Quitkey(void)
{
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{PC_DOSReturn();}
}
}






实例2信号量



#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];


INT16S   key; //用于退出uCOS_II的键
char * s1="MyTask is running";
char * s2="YouTask is running";
char * s3="HerTask is running";
char * ss="MyTask pend a sem";


INT8U   err;
INT8U x=0,y=0;//字符显示位置
INT32U   Times=0;


OS_EVENT *Semp;


void  StartTask(void *data);
void  MyTask(void *data);
void  YouTask(void *data);
void  HerTask(void *data);


void  Quitkey(void);


/************************主函数*********************************************/
void  main (void)
{
    OSInit(); //初始化uCOS_II
    PC_DOSSaveReturn(); //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断


    Semp=OSSemCreate(1);
    OSTaskCreate(StartTask,0,&StartTaskStk[TASK_STK_SIZE - 1],5);
    OSStart();
}


//*****************************StartTask********************************************
void  StartTask(void *pdata)
{
    pdata=pdata;
    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);
    PC_SetTickRate(OS_TICKS_PER_SEC);
    OS_EXIT_CRITICAL();
    OSStatInit();


    OSTaskCreate(MyTask,0,&MyTaskStk[TASK_STK_SIZE - 1],6);
    OSTaskCreate(YouTask,0,&YouTaskStk[TASK_STK_SIZE - 1],7);
    OSTaskCreate(HerTask,0,&HerTaskStk[TASK_STK_SIZE - 1],8);
    OSTaskSuspend(OS_PRIO_SELF);
}
//*****************************MyTask********************************************
void  MyTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
OSTimeDlyHMSM(0,0,1,200);
{
PC_DispStr(10,++y,ss,DISP_BGND_BLACK+DISP_FGND_YELLOW);
OSSemPend(Semp,0,&err);
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_YELLOW);
OSSemPost(Semp);
        Quitkey();
}
OSTimeDlyHMSM(0,0,0,200);
        }
}


//*****************************YouTask********************************************
void  YouTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
        PC_DispStr(7,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
Quitkey();
OSTimeDlyHMSM(0,0,0,300);
        }
}


//*****************************HerTask********************************************


void  HerTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
OSSemPend(Semp,0,&err);
        PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);
for(Times;Times<30000000;Times++)
{OS_Sched();}
OSSemPost(Semp);
Quitkey();
OSTimeDlyHMSM(0,0,1,0);
        }
}






//*****************************Quitkey()********************************************
void Quitkey(void)
{
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{PC_DOSReturn();}
}
}

实例三信号量集

只有后两个任务执行后,第一个任务才执行



#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];


INT16S   key; //用于退出uCOS_II的键
char    *s1="MyTask  is running";
char    *s2="YouTask is running";
char    *s3="HerTask is running";


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


OS_FLAG_GRP *WFlag; /*事件标志组指针*/


void  StartTask(void *data);
void  MyTask(void *data);
void  YouTask(void *data);
void  HerTask(void *data);


void  Quitkey(void);


/************************主函数*********************************************/
void  main (void)
{
    OSInit(); //初始化uCOS_II
    PC_DOSSaveReturn(); //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断


WFlag=OSFlagCreate(0,&err); /*创建事件标志组*/
if(err==OS_NO_ERR) /*检测是否创建成功*/
PC_DispStr(0,23,"No error",DISP_BGND_BLACK+DISP_FGND_WHITE);
    OSTaskCreate(StartTask,0,&StartTaskStk[TASK_STK_SIZE - 1],5);
    OSStart();
}


//*****************************StartTask********************************************
void  StartTask(void *pdata)
{
    pdata=pdata;


    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);
    PC_SetTickRate(OS_TICKS_PER_SEC);
    OS_EXIT_CRITICAL();
//  OSStatInit();




    OSTaskCreate(MyTask,0,&MyTaskStk[TASK_STK_SIZE - 1],6);
    OSTaskCreate(YouTask,0,&YouTaskStk[TASK_STK_SIZE - 1],7);
    OSTaskCreate(HerTask,0,&HerTaskStk[TASK_STK_SIZE - 1],8);


OSTaskSuspend(OS_PRIO_SELF);


}
//*****************************MyTask********************************************
void  MyTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
OSFlagPend(WFlag,(OS_FLAGS)3,OS_FLAG_WAIT_SET_ALL,0,&err);
PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
        Quitkey();
OSTimeDlyHMSM(0,0,2,0);
        }
}


//*****************************YouTask********************************************
void  YouTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
        PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSTimeDlyHMSM(0,0,8,0);
OSFlagPost(WFlag,(OS_FLAGS)2,OS_FLAG_SET,&err);
Quitkey();
OSTimeDlyHMSM(0,0,2,0);
        }
}


//*****************************HerTask********************************************
void  HerTask (void *pdata)
{
    pdata = pdata; 


    for (;;) 
{
        PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);
OSFlagPost(WFlag,(OS_FLAGS)1,OS_FLAG_SET,&err);
Quitkey();
OSTimeDlyHMSM(0,0,1,0);
        }
}
//*****************************Quitkey()********************************************
void Quitkey(void)
{
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{PC_DOSReturn();}
}
}

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

UCOSII 信号量和信号量集实例 的相关文章

  • UCOSII学习---五、任务通信之信号量

    一 xff1a 信号量的理解 xff1a 信号量的本质是数据操作锁 xff0c 它本身不具有数据交换的功能 xff0c 而是通过控制其他的通信资源 xff08 文件 xff0c 外部设备 xff09 来实现进程间通信 xff0c 它本身只是
  • ucosii使用

    当需要同时跑多个任务的时候裸机显然不能很好的完成使命 xff0c 这个时候我们可以给单片机上系统 xff0c 创建多任务 xff0c 完成复杂逻辑 一 首先移植uocii在我们的板上 xff0c 根据mcu型号移植ucosii xff0c
  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四
  • ucosii中消息队列、消息邮箱、信号量的区别

    1 用信号量进行行为同步时 xff0c 只能提供同步的时刻信息 xff0c 不能提供内容信息 若被控制方要求得到控制方的内容信息时 xff0c 可以使用消息邮箱或消息队列 2 但由于消息邮箱里只能存放一条消息 xff0c 所以使用消息邮箱进
  • ucosii消息队列学习

    近期在学习ucosii的内容使用的平台为STM32F103C8T6最小系统板 今日关于消息队列的使用遇到了一些问题 基本情况 xff1a 移植代码为正点原子ucosiii消息队列 信号量集和软件定时器例程 主要新建两个任务post task
  • Ucosii消息邮箱使用

    设置任务优先级 define LED TASK Prio 6 define LED1 TASK Prio 5 用到的UCOSII函数 消息邮箱创建函数 xff1a OS EVENT OSMboxCreate void msg 请求消息邮箱函
  • 学习ucosii要用到的几本书和软件

    原帖地址 xff1a http bbs ednchina com BLOG ARTICLE 2020186 HTM 打算学习一个嵌入式操作系统 xff0c 研究了一下决定还是先研究一下ucosii xff0c 一方面权当学习C语言 xff0
  • ucosii消息队列使用

    ucosii消息队列简介 ucosii的消息队列源码定义在os q c文件 xff1b 接口全部声明在ucos ii h xff0c 总共有如下接口 xff1a span class token keyword void span span
  • rtthrea-ucosii-freertos三系统学习总结

    三系统基本功能对比 RT thread ucosii freertos 任务调度 抢占式 时间片式 xff08 多级队列位图调度 xff09 抢占式 xff08 纯位图调度 xff09 抢占式 时间片式 xff08 遍历列表调度 xff09
  • UCOSii中的信号量

    任务间简单通个信 xff0c A告诉B你LED亮一下 这种问题可以用信号量来处理 xff0c UCOSii中关于信号量的函数也就八个 xff0c 今天简单总结下 函数列表 CREATE A SEMAPHORE Description Thi
  • 从零开始学习UCOSII操作系统4--任务管理

    从零开始学习UCOSII操作系统4 任务管理 1 重讲任务 1 任务可以是一个无限的循环 xff0c 也可以在一次执行完毕后被删除 这里需要注意的是 xff0c 任务的代码并不是真正的删除了 xff0c 而是UCOSII不再理会该任务代码
  • 从零开始学习UCOSII操作系统7--信号量

    从零开始学习UCOSII操作系统7 信号量 参考博客 xff1a 64 http blog csdn net gatiemehttps blog csdn net gatieme article details 21071379 前言 xf
  • 从零开始学习UCOSII操作系统15--总结篇

    从零开始学习UCOSII操作系统15 总结篇 前言 xff1a 在大学的时候 xff0c 我们班级上面都有很多人觉得学习UCOSII 包括UCOSIII 是没什么厉害的 xff0c 因为很多人都喜欢去学习Linux操作系统 xff0c 但是
  • ucosII 信号量使用总结(举例讲解)

    概述 信号量用于 xff1a 1 控制共享资源的使用权 xff08 满足互斥条件 xff09 2 标志某时间的发生 3 使2个任务的行为同步 OSSemCreate 赋初值 OSSemCreate INT16U cnt xff0c cnt为
  • UCOSII之项目实战总结

    电子IT行业博大精深 xff0c 没有人能够用笔记本天天记录自己所学的知识 xff0c 于是乎 xff0c 撰写博客就成了每个 IT民工 的专长 再者 xff0c 写一篇博客 xff0c 其意义与不但记录了自己所需的知识 xff0c 更提高
  • 再读 ucosII源码(邵贝贝):任务之间的通讯与同步--邮箱

    邮箱简介 xff1a 邮箱是 C OS II中另一种通讯机制 xff0c 它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量 该指针指向一个包含了特定 消息 的数据结构 为了在 C OS II中使用邮箱 xff0c 必须将O
  • UCOSII里面为什么调用OS_ENTER_CRITICAL()或OS_EXIT_CRITICAL()会出错,出错信息为:undeclared identifier `cpu_sr‘

    可以观察到OSTickISR Init 函数内部调用了OS ENTER CRITICAL 和OS EXIT CRITICAL 并且 1 该OSTickISR Init 函数所在的 C文件包含了includes h文件 include inc
  • os_mutex.c(全)

    无等待地获取互斥型信号量 OSMutexAccept OS EVENT pevent INT8U perr 创建互斥型信号量OS EVENT OSMutexCreate INT8U prio INT8U perr 删除信号量OS EVENT
  • uCOSii中的互斥信号量

    uCOSii中的互斥信号量 一 互斥型信号量项管理 MUTUAL EXCLUSION SEMAPHORE MANAGEMENT OSMutexAccept 无条件等待地获取互斥型信号量 OSMutexCreate 建立并初始化一个互斥型信号

随机推荐

  • 安装kalibr踩坑2:fatal error: ceres/rotation.h: No such file or directory #include “ceres/rotation.h“

    fatal error ceres rotation h No such file or directory include 34 ceres rotation h 34 ceres没有装好 xff0c 需要重装 xff0c 安装方法如下
  • 嵌入式数据结构以及算法(数据结构篇)

    数据结构可以说是嵌入式开发学习中比较重要的一个部分了 xff0c 而沉迷于基础硬件控制的我到现在才意识到这个东西的重要性可以说是比较迟钝了 xff0c 但是迟钝总比知道也不学来的好 xff08 自我安慰请忽略 xff09 下面总结一下经过几
  • ubuntu18.04安装kalibr疯狂踩坑记录

    1 安装ubuntu18 04对应的ros 我用的是镜像Docker Hub xff0c 该镜像包含vnc和ros docker pull tiryoh ros desktop vnc melodic 2 安装kalibr 1 安装依赖环境
  • CMakeList.txt写法

    ROS 创建并运行一个c 43 43 的demo xyzxyz576的博客 CSDN博客 目录 样例 解释如下 1 确定cmake最低版本需求 2 确定工程名 3 添加需要的库 4 添加需要的头文件 5 确定编译语言 6 设定变量 7 添加
  • 解决WSL2中Vmmem内存占用过大问题

    Vmmem介绍 Vmmem 进程是系统合成的一个虚拟进程 xff0c 用于表示虚拟机消耗的内存和 CPU 资源 换句话说 xff0c 如果您看到 Vmmem 消耗大量内存和 CPU 资源 xff0c 那么这意味着您的虚拟机正在消耗大量内存和
  • gnss、gps、imu、rtk、ins区分及含义

    gnss和gps区别 1 GPS xff08 全球卫星定位系统 xff09 是由美国国防部研制建立的一种具有全方位 全天候 全时段 高精度的卫星导航系统 xff1b 能为全球用户提供低成本 高精度的三维位置 速度和精确定时等导航信息 2 G
  • Windows下启动Docker容器遇到Error invoking remote method ‘docker-start-container‘: Error解决办法

    报错 xff1a Error invoking remote method 39 docker start container 39 Error HTTP code 500 server error Ports are not availa
  • java变量的定义

    JAVA数据类型 对于整型数据 xff0c 通常情况下使用int类型 但是如果表示极大的数据 xff0c 就需要long类型了 xff0c byte和short类型主要用于特定的应用场合 xff0c 例如 xff1a 底层的文件处理或者需要
  • java数据类型转换(强制转换)

    数据类型的转换 xff0c 分为自动转换和强制转换 自动转换是程序在执行过程中 无声 进行的转换 xff0c 不需要提前声明 xff0c 一般是从位数低的类型向位数高的类型转换 xff1b 强制转换则必须在代码中声明 xff0c 转换顺序不
  • 斗鱼直播与熊猫直播竞品分析

    引言 xff1a 目前国内直播平台虽然十分火爆 xff0c 但是直播的市场尚未成熟 xff0c 斗鱼等其他直播平台在利用自己用户的基础一直处在直播平台的主流市场 xff0c 而新晋直播平台开始大肆的宣传和吸引用户 xff0c 最终直播这块市
  • 知乎产品分析|知识社区何去何从

    一 引言 2017 年 2 月 xff0c 知乎月独立用户设备数再次回升 xff0c 相比 1 月上涨了 11 2 xff0c 达到了 1109 万台 1 1 目的 通过对知乎这款产品的分析 xff0c 锻炼自己的思维能力 xff0c 深化
  • 以CSDN为例解释尼尔森十大交互原则

    一 状态可见原则 用户在网页上的任何操作 xff0c 不论是单击 滚动还是按下键盘 xff0c 页面应即时给出反馈 即时 是指 xff0c 页面响应时间小于用户能忍受的等待时间 举例 xff1a CSDN上文章底部都会有一个 喜欢 按钮 x
  • Chapter007-FPGA学习之IIC总线EEPROM读取

    IIC总线是嵌入式领域较为重要的器件间通信总线 xff0c 同样 xff0c FPGA也能通过模块的形式实现IIC的功能 xff0c 其原理和STM32的模拟IIC总线一致 xff0c 就是控制每个时间点的SCL SDA总线电平 IIC总线
  • 游戏化思维——核心驱动力

    游戏是一个令人着迷 xff0c 并且能够让人沉迷于此的东西 xff0c 而游戏之所以如此迷人 xff0c 不但是游戏的制作精良和剧情引人入胜 除此之外还有些其他原因 xff0c 激励人民玩游戏的原因是 xff1a 游戏能够触及到人性的核心驱
  • 从产品设计到用户设计

    从产品设计到用户设计 一说起产品设计 xff0c 人们往往想到两个方面 感官方面 功能方面 感官方面 xff1a 精心设计的产品能够给用户带来赏心悦目的感觉 xff0c 当然极大部分是属于触感方面 xff08 嗅觉和味觉因为局限问题无法在产
  • 十年寒窗,从高考到海盗,人的梦想是不会结束的

    其实这是讲述我是如何想要成为一名海盗的 又是一年高考时 我翻看着手机 xff0c 看着朋友圈里面各种高考热文一篇篇的出现 xff0c 心里难免有些感慨和一些自己的回忆 当年高考时也像现在一样 xff0c 看到了许多这样的文章 xff0c 看
  • 为体验设计——使用第一

    产品设计和用户体验设计有什么不同呢 xff1f 每个产品都是以用户是人类为前提而设计出来的 xff0c 而产品的每一次使用 xff0c 都会产生相应的体验 用户体验设计并完全不等同于产品设计 但是对于一个简单的情况下 xff0c 创建一个良
  • 用户体验和网站

    用户体验对于所有的产品和服务来讲 xff0c 都是至关重要的 现在讨论一种特殊产品的用户体验 xff1a 网站 xff08 这里的 网站 一词包括以内容为主的网站产品和以交互为主的网站应用 xff09 在网站上 xff0c 用户体验比任何一
  • UCOS II两个任务的模板

    芯片lm3s9b92 include lt includes h gt include 34 utils uartstdio h 34 Application tasks 优先级 define TASK2 PRIO 11 define ta
  • UCOSII 信号量和信号量集实例

    代码来自于书本光盘 嵌入式操作系统UCOSII原理及应用 实例1信号量 include 34 includes h 34 define TASK STK SIZE 512 任务堆栈长度 OS STK StartTaskStk TASK ST