document.write('
')

澳门新莆京在线登录

创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

实时操作系统FreeRTOS信号量应用

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-06-08 09:24 次阅读

1.信号量简介

信号量常用于控制对共享资源的访问与任务同步。资源共享例如火车票售卖,所有用户都可以进行买票和退票操作,对于所用用户来说火车票就是共享资源,当卖出一张票信号量减一、有人退一张票信号量加一,这种案例就属于计数型信号量。常用的信号量还有二值信号量。例如使用公共电话,同一时间只能一个人使用,此时电话就只有两种状态:使用或者未使用,若将电话这两个状态作为信号量的话则就是二值信号量。
信号量的另一应用场合就是任务同步。用于任务与任务间或任务与中断间同步。在执行中断服务函数时可以向任务发送信号量通知任务该事件发生了,在退出中断服务函数以后任务调度器的调度下同步的任务就会执行。因为中断服务函数需要快进快出,代码简洁,一般在中断服务函数中设置标志位,然后在其它地方根据标志位来实现具体功能,在FreeRTOS中就可使用信号量来完成此功能。

2.二值信号量

二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常相似,但还是有细微差别,互斥信号量拥有优先级继承机制,二值信号没有。因此二值信量适合于同步(任务与任务、任务与中断同步),而互斥信号量适合于简单的互斥访问。
二值信号量其实就是一个只有一个队列项的队列,这个特殊的队列要么是满的,要么是空的。使用二值信号量必须包含semphr.h头文件。

函数名 功能
vSemaphoreCreateBinary() 动态创建二值信号量,老版FreeRTOS创建二值信号量函数
xSemaphoreCreateBinary() 动态创建二值信号量,新版FreeRTOS创建二值信号量函数
xSemaphoreCreateBinaryStatic() 静态创建二值信号量

3.二值信号量应用示例

此示例通过创建3个任务,start_task、0_task、Semaphore_task。通过任务start_task创建另外两个任务。

#include "freeRTOS.h"
#include "task.h"//创建相关头文件
#include "queue.h"//消息队列相关头文件
#include "semphr.h"//信号量相关头文件

#define START_TASK_PRIO 1        //任务优先级
#define START_STK_SIZE 128       //任务堆栈大小
TaskHandle_t StartTask_Handler;   //任务句柄
void start_task(void *pvParameters);//任务函数

#define LED0_TASK_PRIO 2     //任务优先级,数字越大优先级越高
#define LED0_STK_SIZE 128     //任务堆栈大小
TaskHandle_t LED0Task_Handler; //任务句柄
void LED0_task(void);         //任务函数

#define Semaphore_TASK_PRIO 2     //任务优先级
#define Semaphore_STK_SIZE 128      //任务堆栈大小
TaskHandle_t SemaphoreTask_Handler; //任务句柄
void Semaphore_task(void);          //任务函数

主函数

int main()
{
	Beep_Init();//初始化
	LED_Init();//LED初始化
	KEY_Init();
	Usart1_Init(115200);//串口1初始化
	TIMx_Init(TIM2,72,20000);//20ms
	TIMx_Init(TIM3,7200,5000);//500ms
	TIM3->CR1|=1<<0;
	/*创建任务*/
	xTaskCreate((TaskFunction_t)start_task,//任务函数
							(const char *)"start_task",//任务名称	
							(uint16_t)START_STK_SIZE,//堆栈大小
							NULL,           //传递给任务函数的参数
							(UBaseType_t)START_TASK_PRIO,//任务优先级
							(TaskHandle_t *)&StartTask_Handler//任务句柄
							);
	vTaskStartScheduler();     //开启任务调度		
}	

开始任务

SemaphoreHandle_t BinarySemaphore;	//二值信号量句柄
/*开始任务函数*/
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();  //进入临界区
	/*创建二值信号量*/
	BinarySemaphore=xSemaphoreCreateBinary();//创建二值信号量
	//创建LED0任务
	xTaskCreate( (TaskFunction_t  )LED0_task,//任务函数
							(const char    *)"LED0_task",//任务名称
							 (uint16_t)LED0_STK_SIZE,//堆栈大小
								NULL,           //传递给任务函数的参数
							 (UBaseType_t   )LED0_TASK_PRIO,//任务优先级
							 (TaskHandle_t *)&LED0Task_Handler);//任务句柄

	xTaskCreate(  (TaskFunction_t )Semaphore_task,//任务函数
							(const char    *)"Semaphore_task",//任务名称
							(uint16_t )Semaphore_STK_SIZE,//堆栈大小
								NULL,           //传递给任务函数的参数
							(UBaseType_t    )Semaphore_TASK_PRIO,//任务优先级
		                   (TaskHandle_t  *)&SemaphoreTask_Handler);//任务句柄

	vTaskDelete(StartTask_Handler); //删除开始任务	
	taskEXIT_CRITICAL();    //退出临界区					
}

LED0任务,此任务1000ms进行LED翻转

void LED0_task(void)
{
	while(1)
	{
		LED1=!LED1;
		Delay_Ms(1000);	
	}
}

Semaphore函数,此任务函数获取信号量,处理串口1中断接收数据。

void Semaphore_task(void)//任务函数
{
	BaseType_t err=pdFALSE;
	while(1)
	{
		(BinarySemaphore!=NULL)
		{
			err=xSemaphoreTake(BinarySemaphore,portMAX_DELAY);	//获取信号量
			if(err==pdTRUE)
			{
				usart1_rx_buff[usart1_cnt]='\0';
				printf("rx=%s\r\n",usart1_rx_buff);
				usart1_cnt=0;
			}
		}
	}
}

串口中断服务函数

#include "FreeRTOS.h"					//FreeRTOS使用
#include "task.h" 
#include "queue.h"	 //消息队列
#include "semphr.h"//信号量
u8 usart1_rx_buff[1024];//串口1接收数据缓冲区
u16 usart1_cnt=0;//保存数组下班
u8 usart1_flag;//接收完成标志符
extern SemaphoreHandle_t BinarySemaphore;	//二值信号量句柄
void USART1_IRQHandler(void)
{
	u8 c;
	BaseType_t pxHigherPriorityTaskWoken;//保存任务是否需要切换的值
	if(USART1->SR&1<<5)
	{
		c=USART1->DR;
		if(usart1_flag==0)//判断上一次数据是否处理完成
		{
			if(usart1_cnt<1024)	
			{
				usart1_rx_buff[usart1_cnt++]=c;
				TIM2->CNT=0;//清空计数器值
				TIM2->CR1|=1<<0;//开启定时
			}
			else usart1_flag=1;
		}
	}
	if( usart1_flag && (BinarySemaphore!=NULL))
	{
//释放信号量
	xSemaphoreGiveFromISR(BinarySemaphore,&pxHigherPriorityTaskWoken);	
//如果需要的话,进行一次上下文切换
	portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);
		usart1_flag=0;
	}
}

中断服务函数

#include "FreeRTOS.h"					//FreeRTOS使用
#include "semphr.h"
extern SemaphoreHandle_t BinarySemaphore;	//二值信号量句柄//消息队列句柄
void TIM2_IRQHandler(void)
{
	BaseType_t pxHigherPriorityTaskWoken;//保存任务是否需要切换的值
	if(TIM2->SR&1<<0)//判断是否为更新中断
	{
		TIM2->CR1&=~(1<<0);//关闭定时器2
		usart1_flag=1;
		if( usart1_flag && (BinarySemaphore!=NULL))
		{
             //释放信号量
			xSemaphoreGiveFromISR(BinarySemaphore,&pxHigherPriorityTaskWoken);
            //如果需要的话,进行一次上下文切换
			portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);		
	usart1_flag=0;
		}
	}
	TIM2->SR=0;//清除标志位
}

实现效果

poYBAGKXEqmAaxw_AABsyvIK1BQ061.png
收藏 人收藏

    评论

    相关推荐

    基于MODBUS协议用STM32F103做从机接收发送数据包实验

    给大家分享一个网友qq_34471646做的实验,用STM32做从机接收主机发送过来的数据包(也是基....
    的头像 汽车电子技术 发表于 06-14 17:47 662次 阅读

    多核处理器为嵌入式系统设计人员提供机会

      因为多核芯片可以承载多个操作环境,以前需要多个离散计算模块的系统现在可以组合在单个硬件环境中。通....
    的头像 星星科技指导员 发表于 06-14 17:02 159次 阅读

    软通动力与华为合作助推我国数字交通可持续发展

    6月,首个面向交通领域的OpenHarmony战略合作在深圳举办。软通动力旗下子公司鸿湖万联(江苏)....
    的头像 科技绿洲 发表于 06-14 16:59 204次 阅读

    提供非对称多核处理器提高性能可预测性

      下一代网络和应用程序不断增长的性能需求,加上用户对可靠性和服务质量的期望,需要专门构建的非对称多....
    的头像 星星科技指导员 发表于 06-14 16:16 137次 阅读

    用STM32F103做CAN的收发通信的程序思路与代码分享

    STM32的标识符屏蔽滤波目的是减少了CPU处理CAN通信的开销。STM32的过滤器组最多有28个(....
    的头像 STM32嵌入式开发 发表于 06-14 16:13 669次 阅读

    芯动科技正式加入龙蜥社区 推动生态繁荣发展

    近日,芯动科技宣布正式加入国内操作系统开源社区及创新平台——龙蜥社区(OpenAnolis)。 ....
    的头像 科技绿洲 发表于 06-14 15:30 276次 阅读

    STM32F103中文教程及参考手册

    STM32F103中文教程及参考手册
    发表于 06-14 15:26 14次 阅读

    芯动科技正式加入龙蜥操作系统开源社区

    近日,芯动科技宣布正式加入国内操作系统开源社区及创新平台——龙蜥社区(OpenAnolis)。
    的头像 芯动科技Innosilicon 发表于 06-14 15:16 133次 阅读

    多核系统中的自动分析并以图形方式描述实时事件的工具

      支持多核的调试工具以标准调试器无法提供的方式绘制系统的图形图像。它为开发人员提供了对中断、上下文....
    的头像 星星科技指导员 发表于 06-14 15:14 82次 阅读

    使用虚拟化最大化多核SoC性能

      人们普遍认为,必须利用 Linux 与实时操作系统 (RTOS) 或简单的运行时环境的组合来充分....
    的头像 星星科技指导员 发表于 06-14 14:55 140次 阅读

    对测量多核性能的追求

      毫无疑问,多核处理器支持新功能,并极大地改善了现有嵌入式产品的性能、功耗和成本。
    的头像 星星科技指导员 发表于 06-14 14:35 86次 阅读

    STM32Cube工具和扩展包为MCU提供专用Azure RTOS高质量中间件

    STM32Cube工具和扩展包为从入门级到高性能的MCU提供专用Azure RTOS高质量中间件
    发表于 06-14 14:25 48次 阅读

    统信软件与厂商合作协助构建安全可信的基础软件底座

    统信软件总经理刘闻欢在信息安全领域有着近10年的工作经验,对于安全问题格外重视。统信软件从成立之初,....
    的头像 科技绿洲 发表于 06-14 11:43 169次 阅读

    华为与拓维信息携手推进OpenHarmony在公路领域生态建设

    6月10日,华为智慧公路军团OpenHarmony生态使能伙伴战略合作签约仪式在华为总部举办。
    的头像 科技绿洲 发表于 06-14 11:10 145次 阅读

    润和软件进一步推进金融行业数字化转型发展

    近日,搭载江苏润和软件股份有限公司(以下简称“润和软件”)研发的HiHopeOS金融数字化服务终端操....
    的头像 HiHope社区 发表于 06-14 10:54 117次 阅读

    在非对称多核架构中实现软件组件

      两个应用程序的源代码都可以在github上找到,你可以看到代码总量相当合理(几百行),并且通过M....
    的头像 星星科技指导员 发表于 06-14 09:35 106次 阅读

    WLDOS云应用支撑平台

    ./oschina_soft/gitee-wldos.zip
    发表于 06-14 09:24 3次 阅读
    WLDOS云应用支撑平台

    利尔达与ST联合发布STM32MP1开发板新品

    近日,致力于提供物联网产品研发、技术应用、服务落地一站式解决方案的国家高新技术企业利尔达与ST意法半....
    的头像 物联网观察 发表于 06-13 15:22 131次 阅读

    STM32课程设计贪吃蛇

    贪吃蛇课程设计
    发表于 06-13 15:09 16次 阅读

    STM32F103双串口实验

    STM32F103双串口实验,程序将串口1和串口3全部调通,可同时使用
    发表于 06-13 15:07 7次 阅读

    STM32F407-双串口实验

    STM32F407-双串口实验,程序将串口1和串口2全部调通,可同时使用
    发表于 06-13 15:06 15次 阅读

    嵌入式和物联网应用中蓝牙重要协议的应用

    它创建了最好避免的依赖关系;如果产品要在该领域使用多年,就必须处理报废 (EOL) 问题。选择随芯片....
    的头像 星星科技指导员 发表于 06-13 14:27 98次 阅读

    xenomai实时性的影响因素及优化措施

    本文讲述一些有利于提高xenomai实时性的配置建议,部分针对X86架构,但它们的底层原理相通,同样....
    的头像 Linux阅码场 发表于 06-13 12:01 258次 阅读

    Vinix V编写的操作系统

    ./oschina_soft/vinix.zip
    发表于 06-13 09:15 12次 阅读
    Vinix V编写的操作系统

    请问CH561可以跑freeRTOS和MQTT么?      ...
    发表于 06-13 06:05 31次 阅读

    中科创达和中国联通打造全球首例5G端到端多切片方案

    近日召开的中国联通“聚策汇力,启航未来”泛终端技术生态创新论坛上,中科创达软件股份有限公司物联网事业....
    的头像 科技绿洲 发表于 06-12 11:37 450次 阅读

    使用rtthread移植qboot工程的学习笔记

    学习rtthread,在配置qboot时的过程;记录一下自己使用rtthread studio配置q....
    的头像 tian的个人专栏 发表于 06-12 09:55 1081次 阅读

    Linux内核社区正式合并LoongArch架构支持代码

    经过龙芯中科与内核社区一年多的紧密合作,北京时间2022年6月4日清晨,Linux内核社区正式合并L....
    的头像 科技绿洲 发表于 06-12 09:18 244次 阅读

    MH32F103ARPT6软硬件兼容STM32F103RCT

    MH2103A(C)xxxx系列使用高性能的32位内核,最高工作频率216 MHz。 内置的存储器包....
    发表于 06-11 15:52 41次 阅读

    板子型号为野火F103指南者,本人在根据课本做点灯实验,将控制RBG小灯的三个引脚定义成了宏,然后写代码将其混合展现出不同的...
    发表于 06-11 00:12 638次 阅读

    1、AUTOSAR的四种功能安全机制虽然AUTOSAR不是一个完整的安全解决方案,但它提供了一些安全机制用于支持安全关键系...
    发表于 06-10 17:33 2536次 阅读

    PWM脉冲宽度调制的基本原理及实现方法

    PWM的全称是脉冲宽度调制(Pulse-width modulation),是通过将有效的电信号分散....
    的头像 凡亿PCB 发表于 06-10 17:06 426次 阅读

    本期是我们新推出的技术问答系列。该系列是针对演示某款产品的功能以及该款产品的一些常见应用问题解答。      ...
    发表于 06-10 17:00 922次 阅读

    W800开发套件鸿蒙系统教程

    要是想听操作系统的多,我会抽1个小时详细讲解下,我2005年2009年做了差不多5年linux内核,....
    发表于 06-10 15:35 50次 阅读

    KUBERNETES的工作原理是什么

    Kubernetes 提供了一个框架,用于部署、管理、扩展和切换分布式容器,这些容器是随依赖项和配置....
    的头像 科技绿洲 发表于 06-10 13:19 171次 阅读

    浪潮信息正式加入Arm SystemReady™ 计划

    日前,作为全球第二的服务器厂商,浪潮信息宣布加入Arm SystemReady™ 计划,并通过了Ar....
    的头像 科技绿洲 发表于 06-10 12:01 218次 阅读

    龙芯自主指令系统架构产学合作协同育人项目正式发布

    近期,龙芯中科2022年产学合作协同育人项目正式通过教育部高教司审核,面向全国本科院校正式发布,相关....
    的头像 科技绿洲 发表于 06-10 11:14 277次 阅读

    简介 RT-THREAD很多应用都是基于文件系统的,像micropython等等,提到文件系统,大家都想到的是SDCARD或者SP...
    发表于 06-10 10:31 271次 阅读

    我现在在使用安富莱的V7开发板,想在这块板子上添加PIN设备驱动。 不过这个板卡上的一部分IO是使用74HC574扩展的。 74...
    发表于 06-10 09:17 420次 阅读

    研华ARK边缘计算系统多款产品与统信操作系统完成产品互认证

    近日,研华ARK边缘计算系统产品通过了统信操作系统的兼容性认证测试。测试表明,ARK-2250、AR....
    发表于 06-09 17:06 635次 阅读

    QX32F103C8T6,内置ARM Cortex-M3为内核的32bit微控制器,最高频率可达72MHz, 内置PLL、内置FLASH、SRA...
    发表于 06-09 17:02 693次 阅读

    RT-Thread专业版实现对于龙芯全系列处理器支持

    近日,在龙芯中科与睿赛德科技的共同努力下,RT-Thread专业版已实现了对LoongArch32和....
    的头像 科技绿洲 发表于 06-09 16:45 585次 阅读

    1、Nuvoton M487USCI之UUART串口接收 前两次做了USCI的UUART打印和UI2C总线设备的读写,本例程测试UU...
    发表于 06-09 14:39 713次 阅读

    普华基础软件入选国家鼓励重点软件企业

    近日,普华基础软件通过2021年度“国家鼓励的重点软件企业”认定,入选企业将享受政府税收优惠等各项扶....
    的头像 科技绿洲 发表于 06-09 10:57 208次 阅读

    软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。 在开始使...
    发表于 06-09 10:40 429次 阅读

    如何提升C编程能力

    GNU C:GNU的C函数库,其实就是glibc,它是Linux上最重要的函数库,它定义了 ANSI....
    的头像 FPGA之家 发表于 06-09 10:24 149次 阅读

    触摸按键原理

    电容C通过电阻R放电,由于电容刚开始放电时电压为E,放电电流I=E/R,该电流很大,所以放电速度很快....
    的头像 FPGA之家 发表于 06-09 10:19 178次 阅读

    基于STM32水温控制

    基于STM32水温控制
    发表于 06-08 14:26 195次 阅读

    中科驭数和社区成员推进OpenCloudOS社区生态体系完善

    近日,中科驭数作为初始成员,宣布加入OpenCloudOS操作系统开源社区。
    的头像 科技绿洲 发表于 06-08 11:16 523次 阅读

    LwIP应用开发实战指南-基于野火STM32全系列(M4/7)开发板

    TCP/IP 是一个庞大的协议族,它是众多网络协议的集合,包括:ARP、IP、ICMP、 UDP、....
    发表于 06-08 09:50 20次 阅读

    基于ARM内核的32位高级MCU STM32F4xx中文手册

    本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/....
    发表于 06-08 09:32 33次 阅读

    工具                      &nb...
    发表于 06-08 07:55 249次 阅读

    统信软件发起UOS主动安全防护计划

    作为国内自主操作系统领头羊,统信软件在生态建设和应用落地上始终走在行业前列,为我国数字经济发展和行业....
    的头像 科技绿洲 发表于 06-07 17:07 298次 阅读

    AWS无服务器平台部署云解决方案

      无服务器服务使应用程序更容易扩展和更快地开发,而无需管理典型的基于服务器的基础设施。开发人员可以....
    的头像 星星科技指导员 发表于 06-07 17:04 265次 阅读

    《FreeRTOS 内核实现与应用开发实战—基于STM32》

    完整的RTOS开发教程
    发表于 06-07 15:29 9次 阅读

    watchOS 9通过各项全新功能乐享生活

    watchOS 9是最先进的可穿戴操作系统,通过各项全新功能进一步保持紧密联系乐享健康生活。
    发表于 06-07 14:54 167次 阅读

    环旭电子与客户共同开发云端通信网关产品

    近期,环旭电子与客户共同开发出一款云端通信网关产品,可将火灾报警系统的讯息透过有线网络(POTS,P....
    的头像 科技绿洲 发表于 06-07 11:39 166次 阅读

    渊亭科技DataExa系列通过统信服务器操作系统兼容性认证测试

    近日,渊亭科技自主研发的智能防务体系产品及DataExa系列人工智能产品的8款产品,通过了统信服务器....
    的头像 科技绿洲 发表于 06-07 11:24 175次 阅读

    5分钟看完苹果WWDC2022大会

    6月7日凌晨1点,苹果WWDC22澳门新莆京在线登录大会正式召开,本次发布会上iOS 16、M2芯片、MacBo....
    发表于 06-07 09:31 464次 阅读

    嵌入式技术

    文章:51 被阅读:82475澳门新莆京在线登录

    关注 9人关注
    必威体育官网下载 365bet下载地址苹果版 永利app下载 必威体育注册 必威体育betway登录手机 365bet客户端下载 金沙彩票app 必威苹果客户端下载 必威体育app手机版 金沙彩票手机版下载 新澳门葡京网站多少 必威体育betway登录手机 必威体育app官方版下载 必威体育app官方版下载 必威betway中文版 澳门新莆京在线登录 必威体育betway登录手机 必威体育官网下载 澳门威尼斯人网上娱乐 必威登录网页版登录注册 必威体育app手机版 必威体育appios下载 金沙彩票app下载安装 365bet官方下载苹果版 365bet下载地址苹果版 澳门新莆京在线登录 Betway必威中文官网 365betapp苹果版下载 Betway必威中文官网 必威体育app官方版下载