UCOSIII信号量
信号量通常分为两种
二进制信号量
计数型信号量
二进制信号量 
二进制信号量只能取0和1两个值
计数型信号量 
计数型信号量的范围由OS_SEM_CTR决定。OS_SEM_CTR可以为8位,16位和32位
API函数
//创建
void OSSemCreate (OS_SEM *p_sem,
                  CPU_CHAR *p_name,
                  OS_SEM_CTR cnt,
                  OS_ERR *p_err);
//删除
OS_OBJ_QTY OSSemDel (OS_SEM *p_sem,
                     OS_OPT opt,
                     OS_ERR *p_err);
//等待-1
OS_SEM_CTR OSSemPend (OS_SEM *p_sem,
                      OS_TICK timeout,
                      OS_OPT opt,
                      CPU_TS *p_ts,
                      OS_ERR *p_err);
//取消等待
OS_OBJ_QTY OSSemPendAbort (OS_SEM *p_sem,
                           OS_OPT opt,
                           OS_ERR *p_err);
//释放+1
OS_SEM_CTR OSSemPost (OS_SEM *p_sem,
                      OS_OPT opt,
                      OS_ERR *p_err);
//设置值
void OSSemSet (OS_SEM *p_sem,
               OS_SEM_CTR cnt,
               OS_ERR *p_err);应用举例
void start_task(void *p_arg)
{
    OS_CRITICAL_ENTER();    //进入临界区
    //创建一个信号量
    OSSemCreate ((OS_SEM*   )&MY_SEM,
                 (CPU_CHAR* )"MY_SEM",
                 (OS_SEM_CTR)1,
                 (OS_ERR*   )&err);
    //创建TASK1任务
    OSTaskCreate((OS_TCB    * )&Task1_TaskTCB,
                 (CPU_CHAR  * )"Task1 task",
                 (OS_TASK_PTR )task1_task,
                 (void      * )0,
                 (OS_PRIO     )TASK1_TASK_PRIO,
                 (CPU_STK   * )&TASK1_TASK_STK[0],
                 (CPU_STK_SIZE)TASK1_STK_SIZE/10,
                 (CPU_STK_SIZE)TASK1_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    * )&err);           
    //创建TASK2任务
    OSTaskCreate((OS_TCB    * )&Task2_TaskTCB,
                 (CPU_CHAR  * )"Task2 task",
                 (OS_TASK_PTR )task2_task,
                 (void      * )0,
                 (OS_PRIO     )TASK2_TASK_PRIO,
                 (CPU_STK   * )&TASK2_TASK_STK[0],
                 (CPU_STK_SIZE)TASK2_STK_SIZE/10,
                 (CPU_STK_SIZE)TASK2_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    * )&err);                
    OS_CRITICAL_EXIT(); //退出临界区
}
//任务1的任务函数
void task1_task(void *p_arg)
{
    OS_ERR err;
    u8 task1_str[]="First task Running!";
    while(1)
    {
        printf("\r\n任务1:\r\n");
        OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);   //请求信号量
        memcpy(share_resource,task1_str,sizeof(task1_str)); //向共享资源区拷贝数据
        printf("%s\r\n",share_resource);    //串口输出共享资源区数据
        OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);             //发送信号量
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
    }
}
//任务2的任务函数
void task2_task(void *p_arg)
{
    OS_ERR err;
    u8 task2_str[]="Second task Running!";
    while(1)
    {
        printf("\r\n任务2:\r\n");
        OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);   //请求信号量
        memcpy(share_resource,task2_str,sizeof(task2_str)); //向共享资源区拷贝数据
        printf("%s\r\n",share_resource);    //串口输出共享资源区数据
        OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);             //发送信号量
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
    }
}实验现象 
UCOSIII优先级反转:http://blog.csdn.net/zhangxuechao_/article/details/78912393
UCOSIII信号量的更多相关文章
- ETH—Lwip以太网通信
		第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ... 
- 第39章     ETH—Lwip以太网通信
		第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ... 
- 第39章 	ETH—Lwip以太网通信—零死角玩转STM32-F429系列
		第39章 ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ... 
- ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收
		串口发送部分代码: //通过信号量的方法发送数据 void usart1SendData(CPU_INT08U ch) { OS_ERR err; CPU_INT08U isTheFirstCh; O ... 
- UCOSIII内嵌信号量
		不仅能够简化代码,而且比使用独立的信号量更有效 API函数 //等待-1 OS_SEM_CTR OSTaskSemPend (OS_TICK timeout, OS_OPT opt, CPU_TS * ... 
- UCOSIII互斥信号量
		互斥信号量可以解决优先级反转问题 优化后现象 优化方法:L和H等待同一个信号量的时候,将L任务优先级提至H相同优先级 实验举例 void start_task(void *p_arg) { OS_CR ... 
- 【RL-TCPnet网络教程】第9章    RL-TCPnet网络协议栈移植(uCOS-III)
		第9章 RL-TCPnet网络协议栈移植(uCOS-III) 本章教程为大家讲解RL-TCPnet网络协议栈的uCOS-III操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移 ... 
- 【二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
		第14章 uCOS-III操作系统版本二代示波器实现 本章教程为大家讲解uCOS-III操作系统版本的二代示波器实现.主要讲解RTOS设计框架,即各个任务实现的功能,任务间的通信方案选择,任 ... 
- 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告
		<基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ... 
随机推荐
- FFMPEG Tips 如何提取码流的基本信息
			原文连接: https://zhuanlan.zhihu.com/p/23448271 1. 码流中的哪些信息值得关注 ? [ ] 是否包含:音频.视频 [ ] 码流的封装格式 [ ] 视频的编码格式 ... 
- 关于Objective-C新增的__kindof关键字
			Objective-C随着Xcode 7的升级带来了许多新特性,当然此次更新最最大的就是引入了Objective-C的轻量级泛型,确切地说是Objective-C类的轻量级泛型.除此之外,还有一个小特 ... 
- 常见的 35 个 Python 面试题及答案
			1. Python 面试问题及答案 作为一个 Python 新手,你必须熟悉基础知识.在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案,以帮助你完成面试.包括 Python 开发 ... 
- LeetCode 993. Cousins in Binary Tree(判断结点是否为Cousin)
			993. Cousins in Binary Tree In a binary tree, the root node is at depth 0, and children of each dept ... 
- oracle plsql 异常
			set serveroutput on DECLARE pename emp.ename%type; begin '; exception when no_data_found then dbms ... 
- c-lodop回调函数简短问答及相关博文
			回调函数相关博文:C-Lodop回调函数的触发.LODOP.FORMAT格式转换[回调和直接返回值].Lodop导出excel及提示成功[回调和直接返回值].c-lodop获取任务页数-回调里给全局变 ... 
- [LeetCode] 119. Pascal's Triangle II 杨辉三角 II
			Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ... 
- C# .NET 支付宝IOT小程序AES密钥解密
			实际测试 KEY 是 16个 byte,byte[] byteKEY = System.Convert.FromBase64String(key); 注意:是Convert.FromBase6 ... 
- 九、Spring中使用@Value和@PropertySource为属性赋值
			首先回顾下在xml中我们是如何为spring的bean进行属性赋值呢? 大体是这样的 <bean id="person" class="com.atguigu.be ... 
- linux中安装python3.7
			linux中安装python3.7 1. 安装依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite- ... 
