6.物联网操作系统信号量

一。信号量的概念与应用

信号量定义

FreeRTOS信号量介绍

FreeRTOS信号量工作原理

1.信号量的定义

        多任务环境下使用,用来协调多个任务正确合理使用临界资源。

2.FreeRTOS信号量介绍

        Semaphore包括Binary,Count,Mutex;

        Mutex包括RecursiveMutex,Mutex。

3.FreeRTOS信号量工作原理

        任务1在运行时,使用了一个临界资源,他发送一个二值信号量同步信号,表示占用资源,任务2来运行时,发现有任务占用资源(信号量同步信号),所以堵塞任务,等待下资源的释放。

二。二值信号量函数的应用

1.功能需求

1、修改按键功能

2、当按键按下触发打印一次CPU利用率

3、使用二值信号量实现按键与任务间同步

2.API详解

(1)xSemaphoreCreateBinary()创建二值信号量

6.物联网操作系统信号量_第1张图片

(2)xSemaphoreGive()任务间释放信号量

6.物联网操作系统信号量_第2张图片

 (3)xSemaphoreGiveFromISR()任务间释放信号量

6.物联网操作系统信号量_第3张图片

 (4)xSemaphoreTake()任务间获取信号量 semphr.h

6.物联网操作系统信号量_第4张图片

 (5)xSemaphoreTakeFromISR()中断获取信号量

6.物联网操作系统信号量_第5张图片

 3.任务实现

1.创建二值信号量

2.在任务中获取信号量

3.在中断中发送信号量

 3.1Cubemx创建工程(在上一个基础上queue队列)

(1)在FREERTOS中创建二值信号量

6.物联网操作系统信号量_第6张图片

二值信号量在FREERTOS的初始化的时候就会创建(返回信号量的句柄)

6.物联网操作系统信号量_第7张图片

3.2 步骤:

(1)把FREERTOS.c中的二值信号量声明外接到GPIO.c中(GPIO.c中有按键按下的GPIO中断处理)

6.物联网操作系统信号量_第8张图片

#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

extern osSemaphoreId CpuPrintBinarySemHandle;

(2)在GPIO.c中的按键中断回调函数中加入任务释放信号量函数 

6.物联网操作系统信号量_第9张图片

xSemaphoreGiveFromISR(CpuPrintBinarySemHandle,NULL);

(3)FREERTOS.c中的串口输出的主函数中

6.物联网操作系统信号量_第10张图片

if(xSemaphoreTake(CpuPrintBinarySemHandle,portMAX_DELAY) == pdPASS){

结果

        复位直接打印程序的cpu利用率,由于没有运行就输出,所以只能打印printf,字符串没有东西,按key3释放信号量,这个时候主函数中接受到有信号量,所以再次运行。

三。技术信号量函数的应用

功能分析

API详解

功能实现

1.功能分析

1、修改按键功能,模拟停车位出入功能

2、当按键K3按下获取车位

3、当按键K4按下释放车位

2.API讲解

xSemaphoreCreateCounting()

6.物联网操作系统信号量_第11张图片

 uxSemaphoreGetCount()

6.物联网操作系统信号量_第12张图片

3.功能实现

1.按键k4初始化

2.创建技术信号量

3.k3按下获取停车位

4.按下释放停车位

1.cubemx创建工程

(1)Key4(PF11)初始配置,中断配置

6.物联网操作系统信号量_第13张图片

 (2)FREERTOS中使能以下后,才可以添加计数信号量

6.物联网操作系统信号量_第14张图片

 (3)创建计数信号量(初始化为4)

6.物联网操作系统信号量_第15张图片

 2.步骤:

(1)在FREERTOS.c中有设置的计数信号量,extern设置到GPIO.c中

6.物联网操作系统信号量_第16张图片

6.物联网操作系统信号量_第17张图片

extern osSemaphoreId KeyCountingSemHandle;

(2)GPIO.c的中断回调函数中,Give为释放信号量,Take为使用信号量,Key3为释放,Key为使用。

《获取》

6.物联网操作系统信号量_第18张图片

《释放》

6.物联网操作系统信号量_第19张图片

 

//key3中
if(xSemaphoreTakeFromISR(KeyCountingSemHandle,NULL)==pdPASS){
	printf("Take success\n");
}else{
	printf("Take fail\n");
}
//key4中
if(xSemaphoreGiveFromISR(KeyCountingSemHandle,NULL)==pdPASS){
	printf("Give success\n");
}else{
	printf("Give fail\n");
}

结果:

按Key3为开走车,Key为停车

四。信号量实现原理

1.信号量创建删除

6.物联网操作系统信号量_第20张图片

 

2.信号量释放

6.物联网操作系统信号量_第21张图片

 

3.信号量获取

6.物联网操作系统信号量_第22张图片

 

你可能感兴趣的:(物联网)