信号量——计数信号量
信号量——计数信号量
计数信号量
计数信号量简介
计数信号量又称为数值信号量,二值信号量相当于长度为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); }
}
信号量——计数信号量相关推荐
- FreeRTOS笔记篇:第六章 - (二进制信号量 计数信号量 队列下)使用中断管理
目录 测试环境如下 概述 概况 中断对RTOS的影响 中断请求任务切换的宏 延迟中断处理 二进制信号量 xSemaphoreCreateBinary() xSemaphoreTake() xSemap ...
- xsemaphoretake返回_FreeRTOS 计数信号量
本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的源码实现是基于消息队列实现的. 信号量的概念及其作用 信号量(semaphores)是 20 ...
- 计数信号量的删除与状态查询
文章目录 1 计数信号量的删除与状态查询 1 计数信号量的删除与状态查询 信号量的删除: 信号量的状态查询: 参考资料: [李述铜]从0到1自己动手写嵌入式操作系统
- 计数信号量的获取与释放
文章目录 1 计数信号量的获取与释放 1.1 设计实现 1 计数信号量的获取与释放 1.1 设计实现 信号量的wait: 信号量的notify: 信号量的无等待获取: /*************** ...
- 计数信号量的原理与创建
文章目录 1 计数信号量的原理与创建 1.1 概述 1.2 设计原理 1.3 设计实现 1 计数信号量的原理与创建 1.1 概述 信号量简而言之就是一个带事件控制的计数器,在其上定义了三个操作: 可以 ...
- 二进制信号量,互斥信号和计数信号量的区别
VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信.同步和互斥的最优选择,提供任务间最快速的通信.也是提供任务间同步和互斥的主要手段.VxWorks提供3种信号量来解决不同的问题. ...
- FreeRTOS 计数信号量
以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的 ...
- Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量
<semaphore信号量:一个简单的示例程序>用户态程序 目录 概念 应用场景 使用方法 内核信号量的构成 信号量的API 初始化 PV操作 获取信号量(P) 释放内核信号量(V) 补充 ...
- RTOS原理与实现06:计数信号量实现
目录 1. 计数信号量的原理与创建 1.1 概述 1.2 设计原理 1.3 设计实现 1.3.1 定义信号量 1.3.2 添加tSemInit函数 2. 计数信号量的获取与释放 2.1 设计原理 2. ...
最新文章
- 同底数幂比较大小方法_初中数学解题技法19.幂的运算
- 只需两步,Tomcat JVM 参数性能迅速调到最优!
- fft 估计载波频率程序_OFDM信道估计和仿真
- Windows Server 2008 R2 搭建DNS服务器(转)
- 二分图-匈牙利算法模板
- 全面解析Java中的String数据类型
- 中小企业ERP快速实施的八大准则
- 我是这样入侵 Hacking Team 的
- 深入浅出分析MySQL常用存储引擎
- LF 第一模块 考试总结
- RTB竞价中的cookie mapping技术
- 华为u2000 olt 添加成功,同步网元失败 提示 服务器不可达 解决办法
- 服务器运行几年后搬迁,服务器搬迁之后的准备工作和应对
- python绘制隐含波动率曲面_如何用python计算隐含波动率
- IT界最短的笑话:上中台!
- Android 淘宝19年双十一自动化做任务
- ffmepg H264 NALU分析
- 计算机控制课设串级回路,华北电力大学过程计算机控制课设ddc串级回路pid闭环.docx...
- 汇编语言(王爽)期末复习
- oracle rrsf_Oracle实战笔记(第三天)