uCOSii中的互斥信号量

article/2025/9/17 17:24:19

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://chatgpt.dhexx.cn/article/cGv179fj.shtml

相关文章

互斥信号量

目录 1、Creat 2、Delete 3、Wait 4、Post 5、Statu 互斥信号量 在介绍二进制信号量时,曾讨论到如果二进制信号量创建时设置参数 bInitValue 为TRUE,则可以用于互斥访问共享资源。实际上,SylixOS 的二进制信号量实现的互斥性是将一个变量…

UCOS-III 互斥量

互斥量 一、互斥量基本概念二、互斥量优先级继承机制三、互斥量应用场景四、互斥量运作机制五、互斥量创建流程1、定义互斥量2、创建互斥量 六、互斥量接口函数1、创建互斥量函数OSMutexCreate()2、删除互斥量函数 OSMutexDel()3、获取互斥量函数 OSMutexPend()4、释放互斥量函…

互斥量知识

文章目录 互斥量1、基本概念2、互斥量的优先级继承机制3、互斥量应用场景4、互斥量运行机制5、互斥量控制块6、互斥量函数接口(1)互斥量创建函数 xSemaphoreCreateMutex()(2)递归互斥量创建函数 xSemaphoreCreateRecursiveMutex()…

同步和互斥

同步和互斥 竞争与协作 在单核 CPU 系统里,为了实现多个程序同时运行的假象,操作系统通常以时间片调度的方式,让每个进程执行每次执行一个时间片,时间片用完了,就切换下一个进程运行,由于这个时间片的时间很…

多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)

文章目录 一、同步与互斥的概念二、互斥锁(同步)三、条件变量(同步)1、线程的条件变量实例12、线程的条件变量实例23、虚假唤醒(spurious wakeup) 四、读写锁(同步)五、自旋锁(同步)…

同步和互斥区别

互斥的概念 由于多线程执行操作共享变量的这段代码可能会导致竞争状态,因此我们将此段代码称为临界区(critical section),它是访问共享资源的代码片段,一定不能给多线程同时执行。 我们希望这段代码是互斥&#xff0…

操作系统——互斥的定义及实现

一、进程互斥的定义 所谓进程互斥,指的是对某个系统资源,一个进程正在使用它,另外一个想用它的进程就必须等待,而不能同时使用 。进程互斥是多道程序系统中进程间存在的一种源于资源共享的制约关系,也称间接制约关系,主要是由被共享资源的使用性质所决定的。 二、互斥…

Fisher判别分析详解

Fisher判别分析 将高维度空间的样本投影到低维空间上,使得投影后的样本数据在新的子空间上有最小的类内距离以及最大的类间距离,使得在该子空间上有最佳的可分离性 可以看出右侧投影后具有更好的可分离性。 Fisher判别分析和PCA差别 刚学完感觉两个很…

基于spss的多元统计分析 之 聚类分析+判别分析(2/8)

实验目的: 1.掌握聚类分析及判别分析的基本原理; 2.熟悉掌握SPSS软件进行聚类分析及判别分析的基本操作; 3.利用实验指导的实例数据,上机熟悉聚类分析及判别分析方法。 实验前预习:…

机器学习——线性判别分析

目录 线性判别分析 LDA的降维过程 案例:鸢尾花(Iris) 代码演示 数据集 局部线性嵌入 线性判别分析 线性判别分析(LDA)是一种有监督的线性降维算法。与PCA不同,LDA是为了使降维后的数据点尽可能地容易被区分。 线性判别分析…

MATLAB判别分析例题,判别分析的matlab实现案例.doc

判别分析的matlab实现案例.doc 读取EXAMP10_01XLS中数据,进行距离判别读取数据读取文件EXAMP10_01XLS的第1个工作表中C2F51范围的数据,即全部样本数据,包括未判企业SAMPLEXLSREAD EXAMP10_01XLS , , C2F51 读取文件EXAMP10_01XLS的第1个工作…

SAS数据分析之判别分析

判别分析与聚类分析有非常类似的特性,因此,在多数数据分析的教材中,这两章是一前一后出现的,简而言之,聚类分析,其实是判别分析的基础,即在聚类分析的基础上,总结出各类的权值&#…

线性判别分析

线性判别分析(LDA)是一种经典的线性学习方法。其思想是:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离。如图所示的二分类示意图: 损失函数的…

sas判别分析

#判别分析两大类:Fisher&Bayes #neighbbor:马氏距离和欧氏距离; #典型判别分析,联系典型相关分析#组变量相关,最后得到的每组内变量的线性组合作为典型变量 #协方差矩阵,举个栗子,设一组特征x(a1,a…

【数模】判别分析

文章目录 判别分析简介SPSS操作步骤输出结果分析 判别分析简介 判别分析又称“分辨法”,是在分类确定的条件下,根据某一研究对象的各种特征值判别其类型归属问题的一种多变量统计分析方法。 其基本原理是按照一定的判别准则,建立一个或多个判…

fisher线性判别分析matlab,线性判别分析LDA

首先搞清楚什么叫判别分析?Discriminant Analysis就是根据研究对象的 各种特征值判别其类型归属问题的一种多变量统计分析方法。 根据判别标准不同,可以分为距离判别、Fisher判别、Bayes判别法等。比如在KNN中用的就是距离判别,当然这里的“距…

spssfisher判别分析步骤_spss进行判别分析步骤_spss进行判别分析

1.Discriminant Analysis判别分析主对话框 如图 1-1 所示 图 1-1 Discriminant Analysis 主对话框 (1)选择分类变量及其范围 在主对话框中左面的矩形框中选择表明已知的观测量所属类别的变量(一定是离散变量), 按上面的一个向右的箭头按钮,使该变量名移到右面的Groupin…

R语言判别分析

本文首发于公众号:医学和生信笔记,完美观看体验请至公众号查看本文。 文章目录 Fisher判别分析Bayes判别分析 判别分析(discriminant analysis)是根据判别对象若干个指标的观测结果判定其属于哪一类的统计方法。经典的判别分析方法…

R 判别分析

判别分析 1. 数据描述2. 调入数据3.Fisher线性判别3.1 计算Fisher线性判别函数3.2 根据线性判别模型对原数据进行预测,并分析预测结果。3.3 对新的数据(CF_TD0.31,NI_TA0.06, CA_CL4.23, CA_NS0.62)进行判定。 4.距离判别(协方差矩…

16种常用的数据分析方法-判别分析

判别分析又称为线性判别分析(Linear Discriminant Analysis)。产生于20世纪30年代,是利用已知类别的样本建立判别模型,为未知类别的样本判别的一种统计方法。 ​ 判别分析方法目的与特点 目的 判别分析的目的是对已知分类的数据建…