uCOSii中的互斥信号量

news2024/11/22 15:18:28

uCOSii中的互斥信号量

一、互斥型信号量项管理 (MUTUAL EXCLUSION SEMAPHORE MANAGEMENT)

OSMutexAccept() 无条件等待地获取互斥型信号量

OSMutexCreate() 建立并初始化一个互斥型信号量

OSMutexDel() 删除互斥型信号量

OSMutexPend() 等待一个互斥型信号量

OSMutexPost() 释放一个互斥型信号量

OSMutexQuery() 查询一个互斥型信号量的当前状态

OS_EVENT *MutualExclusionSemaphores_Event; //定义事件控制模块指针

#define MutualExclusionSemaphores_PRIO  4

//继承优先级,互斥信号量专有的

/*当某个任务已经获取到这个互斥信号量时,却发现"另外一个更高优先级的任务"也在试图获得"这个互斥信号量",这时,需要将拥有"这个互斥信号量的任务"的优先级被提升到这个"继承优先级",防止任务之间产生竞争。

必须确保MutualExclusionSemaphores_PRIO的值小于所有"需要请求这个互斥信号量的任务"的优先级;

*/

MutualExclusionSemaphores_Event=OSMutexCreate(MutualExclusionSemaphores_PRIO,&err);

//创建并初始化一个互斥信号量,用于使任务获得对共享资源的独占式访问权

//相比较而言,FreeRTOS创建互斥信号量比uCOSii更简单更容易

二、互斥信号量的创建,发送和拾取

1、My_Task_Priority.c文件

__align(8) OS_STK START_TASK_STACK[START_TASK_STACK_SIZE]; //START_TASK任务堆栈
__align(8) OS_STK SaveDATA1_TASK_STACK[SaveDATA1_TASK_STACK_SIZE];   //SaveDATA1_TASK任务堆栈
__align(8) OS_STK ReadDATA1_TASK_STACK[ReadDATA1_TASK_STACK_SIZE];   //ReadDATA1_TASK任务堆栈
//如果任务中使用printf来打印浮点数据的话一点要8字节对齐

OS_EVENT *MutualExclusionSemaphores_Event; //定义事件控制模块指针

2、My_Task_Priority.h文件

//My_Task_Priority.h
#ifndef __MY_TASK_PRIORITY_H
#define __MY_TASK_PRIORITY_H

#include "includes.h"

//当OS_LOWEST_PRIO=63时,μC/OS-II有64个优先级,优先级的高低按编号从0(最高)到63(最低)排序;
//OS_TASK_IDLE_PRIO为63,是空闲任务优先级,OS_TASK_IDLE_ID为65535
//OS_TASK_STAT_PRIO为62,是统计任务优先级,OS_TASK_STAT_ID为65534
//uCOSii至少有两个任务,分别是"空闲任务"和"统计任务"
/*
为了保证“启动任务”能够连续运行,必须将“启动任务”的优先级选择为最高。
否则,当“启动任务”创建一个优先级高于自己的任务时,刚刚创建的任务就
会立即进入运行状态,而与这个任务关联的其它任务可能还没有创建,它使
用的通信工具也还没有创建,系统必然出错。
*/
#define START_TASK_PRIORITY      3   //设置START_TASK任务优先级,开始任务的优先级设置为最高
#define START_TASK_STACK_SIZE   192  //设置START_TASK任务堆栈大小,为8的倍数
extern OS_STK START_TASK_STACK[START_TASK_STACK_SIZE]; //START_TASK任务堆栈

#define MutualExclusionSemaphores_PRIO  4   //继承优先级,互斥信号量专有的
//当某个任务已经获取到这个互斥信号量时,却发现"另外一个更高优先级的任务"也在试图获得"这个互斥信号量",
//这时,需要将拥有"这个互斥信号量的任务"的优先级被提升到这个"继承优先级",防止任务之间产生竞争。
//必须确保MutualExclusionSemaphores_PRIO的值小于所有"需要请求这个互斥信号量的任务"的优先级
//在访问互斥信号量时,使用的优先级。

#define SaveDATA1_TASK_PRIORITY       5   //设置SaveDATA1_TASK任务优先级为5
#define SaveDATA1_TASK_STACK_SIZE  	 56  //设置SaveDATA1_TASK任务堆栈大小为56,为8的倍数
extern OS_STK SaveDATA1_TASK_STACK[SaveDATA1_TASK_STACK_SIZE];  //SaveDATA1_TASK任务堆栈

#define ReadDATA1_TASK_PRIORITY       6   //设置ReadDATA1_TASK任务优先级为6
#define ReadDATA1_TASK_STACK_SIZE  	 72  //设置ReadDATA1_TASK任务堆栈大小为72,为8的倍数
extern OS_STK ReadDATA1_TASK_STACK[ReadDATA1_TASK_STACK_SIZE];  //ReadDATA1_TASK任务堆栈

extern OS_EVENT *MutualExclusionSemaphores_Event;

#endif

3、Start_Task.c文件

#include "Start_Task.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

#include "My_Task_Priority.h"
#include "SaveDATA1_Task.h"
#include "ReadDATA1_Task.h"

void Start_Task(void *pdata);

const char Start_Task_rn_REG[]="\r\n";
const char Start_Task_Initialise_REG[]="Start_Task Initialise";
//Start_Task任务
void Start_Task(void *pdata)
{
	OS_CPU_SR cpu_sr=0;
	u8 err;

	pdata = pdata;

	printf("%s",Start_Task_rn_REG);
	printf("%s",Start_Task_Initialise_REG);

	OS_ENTER_CRITICAL();   //进入临界区(无法被中断打断),需要定义cpu_sr变量

	MutualExclusionSemaphores_Event=OSMutexCreate(MutualExclusionSemaphores_PRIO,&err);
	//创建并初始化一个互斥信号量,用于使任务获得对共享资源的独占式访问权
//	OSMutexPost(MutualExclusionSemaphores_Event);//释放一个互斥型信号量

	OSTaskCreate( SaveDATA1_Task,/* 函数指针*/
	              (void *)0,/* 建立任务时,传递的参数*/
								(OS_STK*)&SaveDATA1_TASK_STACK[SaveDATA1_TASK_STACK_SIZE-1],/* 指向堆栈任务栈顶的指针*/
								SaveDATA1_TASK_PRIORITY/* 任务优先级*/
							);						   
	OSTaskCreate( ReadDATA1_Task,/* 函数指针*/
	              (void *)0,/* 建立任务时,传递的参数*/
								(OS_STK*)&ReadDATA1_TASK_STACK[ReadDATA1_TASK_STACK_SIZE-1],/* 指向堆栈任务栈顶的指针*/
								ReadDATA1_TASK_PRIORITY/* 任务优先级*/
							);
	
	//OSTaskSuspend(START_TASK_PRIO);	//挂起起始任务Start_Task(),但不删除
	OSTaskDel(OS_PRIO_SELF); //删除自己
	OS_EXIT_CRITICAL();		//退出临界区(可以被中断打断)
}

4、SaveDATA1_Task.c文件

#include "SaveDATA1_Task.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

#include "My_Task_Priority.h"
#include "AT24cxxDriver.h"

void SaveDATA1_Task(void *pdata);

const char SaveDATA1_Task_rn_REG[]="\r\n";
const char SaveDATA1_Task_Initialise_REG[]="SaveDATA1_Task Initialise";
const char WriteDATA1_REG[]="WriteDATA1=";
//SaveDATA1_Task任务
void SaveDATA1_Task(void *pdata)
{
	u16 SaveDATA1_Cnt;
	u8 err;
	u8 DATA1;

	printf("%s",SaveDATA1_Task_rn_REG);
	printf("%s",SaveDATA1_Task_Initialise_REG);
	while(1)
	{
		OSTimeDlyHMSM(0,0,0,1000);//延时1秒
		SaveDATA1_Cnt++;
		if(SaveDATA1_Cnt >60)//60秒时间到,则保存DATA1
		{
		  OSMutexPend(MutualExclusionSemaphores_Event,0,&err);
		  //等待一个互斥型信号量,waits for a mutual exclusion semaphore.
			EEPROM_U8_Data_Write(DATA1, DATA1_EEPROM_Address);
			printf("%s",SaveDATA1_Task_rn_REG);
			printf("%s",WriteDATA1_REG);
			printf("%u",DATA1);
			OSMutexPost(MutualExclusionSemaphores_Event);//释放一个互斥型信号量
			SaveDATA1_Cnt =0;
		}
	}
}

5、ReadDATA1_Task.c文件

#include "ReadDATA1_Task.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()

#include "My_Task_Priority.h"
#include "AT24cxxDriver.h"

void ReadDATA1_Task(void *pdata);

const char ReadDATA1_Task_rn_REG[]="\r\n";
const char ReadDATA1_Task_Initialise_REG[]="ReadDATA1_Task Initialise";
const char ReadDATA1_REG[]="ReadDATA1=";
//ReadDATA1_Task任务
void ReadDATA1_Task(void *pdata)
{
    u16 ReadDATA1_Cnt;
    u8 err;
    u8 DATA1;

    printf("%s",ReadDATA1_Task_rn_REG);
    printf("%s",ReadDATA1_Task_Initialise_REG);
    while(1)
    {
        OSTimeDlyHMSM(0,0,0,1000);//延时1秒
        ReadDATA1_Cnt++;
        if(ReadDATA1_Cnt >60)//60小时时间到,读取DATA1
        {
          OSMutexPend(MutualExclusionSemaphores_Event,0,&err);
          //等待一个互斥型信号量,waits for a mutual exclusion semaphore.
            DATA1=EEPROM_U8_Data_Read1(DATA1_EEPROM_Address);
            
            printf("%s",ReadDATA1_Task_rn_REG);
            printf("%s",ReadDATA1_REG);
            printf("%u",DATA1);
            OSMutexPost(MutualExclusionSemaphores_Event);//释放一个互斥型信号量
            ReadDATA1_Cnt =0;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扬帆起航——Qt自定义控件介绍

文章目录 前言自定义控件的定义自定义控件的好处如何实现自定义控件实现没有自带的控件 如何使用自定义控件测试和优化常见的自定义控件总结 前言 Qt 提供了丰富的控件、工具和库,可以帮助开发人员快速创建现代化的跨平台应用程序。但是对于某些特殊的需求&#xf…

【数据结构】冒泡,快速,直接插入,归并,选择排序

🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Dream It Possible】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🎁冒泡排序 🏳️‍&…

CentOS7.4安装OpenVPN

系统环境 [rootvpn ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 一. 准备工作 [rootvpn ~]# yum -y install openssl-devel openssl pam pam-devel lzo lzo-devel pkcs11-helper pkcs11-helper-devel 二. 安装OpenVPN服务 1. 下载openvpn源码包 [r…

【计算机网络 - 第六章】链路层

目录 一、概述 1、数据链路层提供的服务? 二、差错检测 1、奇偶校验 2、循环冗余校验CRC 三、多路访问链路和协议 1、概述 (1)多路访问协议 2、信道划分协议 ① 频分多路复用FDM ② 时分多路复用TDM ③ 波分多路复用WDM ④ 码分…

更好看的国产蓝牙耳机,音质也没问题,哈氪零度青春版体验

夏天躲在空调房里戴着耳机听音乐、玩游戏是很多人的日常,这两年国产耳机做得越来越好了,设计也很有新意,像是我现在用的这款哈氪零度青春版,就采用了一种冰封造型设计,视觉效果很新颖,看起来很有立体感&…

【一个简单的前后端交互页面】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 客户端与服务器之间的通信流程 理解当前案例…

chatgpt赋能python:Python文件拆分技巧详解

Python 文件拆分技巧详解 随着数据量的不断增大,我们经常需要处理非常大的数据文件,这时候就需要用到文件拆分技巧。在Python中,文件拆分可以帮助我们提高数据处理的效率,这是一个非常实用的技巧。在本篇文章中,我们将…

奇巴布Feed流性能优化

01 项目背景 “爱奇艺奇巴布”是爱奇艺为0-8岁孩子和家长定制化设计的寓教于乐平台,为儿童量身打造精致的观看体验,精彩内容解锁寓教于乐新方式。为儿童提供优质动画内容的同时,我们更关注APP用户体验。在产品交互设计上我们立足儿童视角&…

抖音SEO矩阵系统开发分享及搭建流程

目录 产品功能亮点 产品介绍及开发背景 开发要求及实现流程 产品功能亮点 1. 支持多账号多平台一键 授权管理 2.支持矩阵视频批量剪辑,批量发布 3. 多平台关键词布局,提升企业及产品曝光 4. 评论区关键词自动回复,意向线索智能挖掘 5…

RTOS专栏(一) —— rt-thread简单介绍和qemu使用

本期主题: 简单介绍rt-thread介绍qemu和rt-thread怎么配合使用qemu的简单例子 rt-thread & qemu 1.rt-thread介绍2.qemu介绍3.搭建rt-thread和qemu开发环境4.简单例子 1.rt-thread介绍 RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统&#xff0…

《操作系统》期末主观题梳理

操作系统简答题 文章目录 操作系统简答题第一章第二章第三章第四章第五章第六章第七章第八章第九章 第一章 在计算机系统上配置OS(operating system, 操作系统)的目标是什么?作用主要表现在哪几个方面? 在计算机系统上配置OS, 主要目标是实现:方便性、有效性、可…

Error: Flash Download failed - Target DLL has been cancelled

文章目录 背景参考 背景 在使用keilv5进行STM32开发时,配置用JLink进行文件烧录,出现如下错误: 查阅资料,是因为Keil未识别烧录工具,需要进行下面的操作: 1.打开工程配置窗口,点开Debug选项卡…

并查集专题

⭐️前言⭐️ 本篇文章主要介绍与并查集相关的题目。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主…

阿里「通义千问」内测详细使用体验

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、简要介绍二、分类问题测试0️⃣自我介绍1️⃣生成内容2️⃣回答问题3️⃣对话协…

springboot+vue大学生租房系统(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的大学生租房系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌…

太稳了,支付系统就该这么设计

支付中心系统对内为各个业务线提供统一的支付、退款等服务,对外对接三方支付或银行服务实现资金的流转。如下图: 大部分公司基本都是这样的架构,主要有以下几方面的优点: 形成统一支付服务,降低业务线接入成本及重复研…

数据结构-树,森连,二叉树之间的转换

树》二叉树 1.给兄弟加线 2.给出长子外的孩子去线 3.层次调整 (整体向左偏移45) eg: 1.给兄弟加线: 2.给处长紫外的孩子去线 3.层次调整,整体向左偏移45 (由兄弟转化来的孩子都是右节点&#xff0c…

DJ6-5 目录管理

目录 6.5.1 文件控制块和索引结点 1、文件控制块 FCB 2、索引节点 6.5.2 简单文件目录 1、单级目录结构 2、二级目录结构 3、树形目录结构 6.5.3 目录查询技术 1、线性检索法 2、Hash 方法 文件目录:是指由文件说明索引组成的用于文件检索的特殊文件…

chatgpt赋能python:Python文件复制到指定文件夹——实现简单又高效的文件操作

Python 文件复制到指定文件夹——实现简单又高效的文件操作 如今,人们对于数据的需求越来越多,因此在编程过程中,对于文件的操作也变得越来越重要。而Python作为一种高效而简洁的编程语言,其文件操作也是十分出色的。本文将会带领…

C/C++ ---- 内存管理

目录 C/C内存分布 常见区域介绍 经典习题(读代码回答问题) 选择题 填空题 C语言内存管理方式 malloc/free calloc realloc C内存管理方式 new和delete操作内置类型 new和delete操作自定义类型 operator new和operator delete函数 new和dele…