信号量——计数信号量

计数信号量

计数信号量简介

计数信号量又称为数值信号量,二值信号量相当于长度为1的队列,计数信号量相当于长度大于1的队列。

计数信号量函数

计数信号量创建函数



计数信号量释放和获取函数

计数信号量同二值信号量和互斥信号量函数一样。

实验

要求

程序

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "beep.h"
#include "string.h"
#include "malloc.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"//任务优先级
#define START_TASK_PRIO         1
//任务堆栈大小
#define START_STK_SIZE          256
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//ÈÎÎñÓÅÏȼ¶
#define SEMAPGIVE_TASK_PRIO     2
//ÈÎÎñ¶ÑÕ»´óС
#define SEMAPGIVE_STK_SIZE      256
//ÈÎÎñ¾ä±ú
TaskHandle_t SemapGiveTask_Handler;
//ÈÎÎñº¯Êý
void SemapGive_task(void *pvParameters);//ÈÎÎñÓÅÏȼ¶
#define SEMAPTAKE_TASK_PRIO     3
//ÈÎÎñ¶ÑÕ»´óС
#define SEMAPTAKE_STK_SIZE      256
//ÈÎÎñ¾ä±ú
TaskHandle_t SemapTakeTask_Handler;
//ÈÎÎñº¯Êý
void SemapTake_task(void *pvParameters);//计数信号量句柄
SemaphoreHandle_t CountSemaphore;//LCDË刷频颜色
int lcd_discolor[14]={ WHITE, BLACK, BLUE,  BRED,      GRED,  GBLUE, RED,   MAGENTA,            GREEN, CYAN,  YELLOW,BROWN,            BRRED, GRAY };int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);delay_init(168);                   uart_init(115200);                  LED_Init();                         KEY_Init();                     BEEP_Init();                        LCD_Init();                         my_mem_init(SRAMIN);                //初始化内部内存池POINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"STM32F407"); LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 14-2");LCD_ShowString(30,50,200,16,16,"Count Semaphore");LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,90,200,16,16,"2016/11/25");POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,234,314);    LCD_DrawLine(5,130,234,130);POINT_COLOR = RED;LCD_ShowString(30,111,200,16,16,"COUNT_SEM Value: 0");POINT_COLOR = BLUE;//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //ÈÎÎñº¯Êý(const char*    )"start_task",          //ÈÎÎñÃû³Æ(uint16_t       )START_STK_SIZE,        //ÈÎÎñ¶ÑÕ»´óС(void*          )NULL,                  //´«µÝ¸øÈÎÎñº¯ÊýµÄ²ÎÊý(UBaseType_t    )START_TASK_PRIO,       //ÈÎÎñÓÅÏȼ¶(TaskHandle_t*  )&StartTask_Handler);   //ÈÎÎñ¾ä±ú              vTaskStartScheduler();          //开启任务调度器
}//开始任务
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建计数信号量CountSemaphore=xSemaphoreCreateCounting(255,0);   //创建释放信号量任务xTaskCreate((TaskFunction_t )SemapGive_task,             (const char*    )"semapgive_task",           (uint16_t       )SEMAPGIVE_STK_SIZE,        (void*          )NULL,                  (UBaseType_t    )SEMAPGIVE_TASK_PRIO,        (TaskHandle_t*  )&SemapGiveTask_Handler);   //创建获取信号量任务xTaskCreate((TaskFunction_t )SemapTake_task,     (const char*    )"semaptake_task",   (uint16_t       )SEMAPTAKE_STK_SIZE,(void*          )NULL,(UBaseType_t    )SEMAPTAKE_TASK_PRIO,(TaskHandle_t*  )&SemapTakeTask_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}//释放信号量任务
void SemapGive_task(void *pvParameters)
{u8 key,i=0;u8 semavalue;BaseType_t err;while(1){key=KEY_Scan(0);             //扫描按键if(CountSemaphore!=NULL)     //创建成功{switch(key){case WKUP_PRES:err=xSemaphoreGive(CountSemaphore);//释放信号量if(err==pdFALSE){printf("释放信号量失败!!!\r\n");}semavalue=uxSemaphoreGetCount(CountSemaphore); //获取计数信号量值LCD_ShowxNum(155,111,semavalue,3,16,0);           //显示break;}}i++;if(i==50){i=0;LED0=!LED0;}vTaskDelay(10);     }
}//获取信号量
void SemapTake_task(void *pvParameters)
{u8 num;u8 semavalue;while(1){xSemaphoreTake(CountSemaphore,portMAX_DELAY);     //等待数值信号量num++;semavalue=uxSemaphoreGetCount(CountSemaphore);    //获取LCD_ShowxNum(155,111,semavalue,3,16,0);         //显示LCD_Fill(6,131,233,313,lcd_discolor[num%14]);   //清屏LED1=!LED1;vTaskDelay(1000);                              }
}

信号量——计数信号量相关推荐

  1. FreeRTOS笔记篇:第六章 - (二进制信号量 计数信号量 队列下)使用中断管理

    目录 测试环境如下 概述 概况 中断对RTOS的影响 中断请求任务切换的宏 延迟中断处理 二进制信号量 xSemaphoreCreateBinary() xSemaphoreTake() xSemap ...

  2. xsemaphoretake返回_FreeRTOS 计数信号量

    本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的源码实现是基于消息队列实现的. 信号量的概念及其作用 信号量(semaphores)是 20 ...

  3. 计数信号量的删除与状态查询

    文章目录 1 计数信号量的删除与状态查询 1 计数信号量的删除与状态查询 信号量的删除: 信号量的状态查询: 参考资料: [李述铜]从0到1自己动手写嵌入式操作系统

  4. 计数信号量的获取与释放

    文章目录 1 计数信号量的获取与释放 1.1 设计实现 1 计数信号量的获取与释放 1.1 设计实现 信号量的wait: 信号量的notify: 信号量的无等待获取: /*************** ...

  5. 计数信号量的原理与创建

    文章目录 1 计数信号量的原理与创建 1.1 概述 1.2 设计原理 1.3 设计实现 1 计数信号量的原理与创建 1.1 概述 信号量简而言之就是一个带事件控制的计数器,在其上定义了三个操作: 可以 ...

  6. 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信.同步和互斥的最优选择,提供任务间最快速的通信.也是提供任务间同步和互斥的主要手段.VxWorks提供3种信号量来解决不同的问题. ...

  7. FreeRTOS 计数信号量

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的 ...

  8. Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量

    <semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...

  9. RTOS原理与实现06:计数信号量实现

    目录 1. 计数信号量的原理与创建 1.1 概述 1.2 设计原理 1.3 设计实现 1.3.1 定义信号量 1.3.2 添加tSemInit函数 2. 计数信号量的获取与释放 2.1 设计原理 2. ...

最新文章

  1. 同底数幂比较大小方法_初中数学解题技法19.幂的运算
  2. 只需两步,Tomcat JVM 参数性能迅速调到最优!
  3. fft 估计载波频率程序_OFDM信道估计和仿真
  4. Windows Server 2008 R2 搭建DNS服务器(转)
  5. 二分图-匈牙利算法模板
  6. 全面解析Java中的String数据类型
  7. 中小企业ERP快速实施的八大准则
  8. 我是这样入侵 Hacking Team 的
  9. 深入浅出分析MySQL常用存储引擎
  10. LF 第一模块 考试总结
  11. RTB竞价中的cookie mapping技术
  12. 华为u2000 olt 添加成功,同步网元失败 提示 服务器不可达 解决办法
  13. 服务器运行几年后搬迁,服务器搬迁之后的准备工作和应对
  14. python绘制隐含波动率曲面_如何用python计算隐含波动率
  15. IT界最短的笑话:上中台!
  16. Android 淘宝19年双十一自动化做任务
  17. ffmepg H264 NALU分析
  18. 计算机控制课设串级回路,华北电力大学过程计算机控制课设ddc串级回路pid闭环.docx...
  19. 汇编语言(王爽)期末复习
  20. oracle rrsf_Oracle实战笔记(第三天)

热门文章

  1. 团宝网员工再次被休假 合作商家欲联合起诉
  2. MATLAB 学习笔记(2)MATLAB 矩阵的加减乘除运算
  3. Netty应用:快速了解http各版本的特性 HttpServer的小demo
  4. Vue 路由懒加载和动态加载
  5. python t检验显著差异_Python整合方差齐性检验的t检验的小技巧
  6. JS window 对象 打开新窗口
  7. 计算机体系结构:Chapter 5 :ILP(指令级并行)
  8. 旧版android模拟器,Mrpoid2模拟器
  9. 认认真真写博客,踏踏实实编代码
  10. K3ERP web登录问题解决