uCOSii中的互斥信号量

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;
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值