• 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文件

    1. __align(8) OS_STK START_TASK_STACK[START_TASK_STACK_SIZE]; //START_TASK任务堆栈
    2. __align(8) OS_STK SaveDATA1_TASK_STACK[SaveDATA1_TASK_STACK_SIZE]; //SaveDATA1_TASK任务堆栈
    3. __align(8) OS_STK ReadDATA1_TASK_STACK[ReadDATA1_TASK_STACK_SIZE]; //ReadDATA1_TASK任务堆栈
    4. //如果任务中使用printf来打印浮点数据的话一点要8字节对齐
    5. OS_EVENT *MutualExclusionSemaphores_Event; //定义事件控制模块指针

    2、My_Task_Priority.h文件

    1. //My_Task_Priority.h
    2. #ifndef __MY_TASK_PRIORITY_H
    3. #define __MY_TASK_PRIORITY_H
    4. #include "includes.h"
    5. //当OS_LOWEST_PRIO=63时,μC/OS-II有64个优先级,优先级的高低按编号从0(最高)到63(最低)排序;
    6. //OS_TASK_IDLE_PRIO为63,是空闲任务优先级,OS_TASK_IDLE_ID为65535
    7. //OS_TASK_STAT_PRIO为62,是统计任务优先级,OS_TASK_STAT_ID为65534
    8. //uCOSii至少有两个任务,分别是"空闲任务""统计任务"
    9. /*
    10. 为了保证“启动任务”能够连续运行,必须将“启动任务”的优先级选择为最高。
    11. 否则,当“启动任务”创建一个优先级高于自己的任务时,刚刚创建的任务就
    12. 会立即进入运行状态,而与这个任务关联的其它任务可能还没有创建,它使
    13. 用的通信工具也还没有创建,系统必然出错。
    14. */
    15. #define START_TASK_PRIORITY 3 //设置START_TASK任务优先级,开始任务的优先级设置为最高
    16. #define START_TASK_STACK_SIZE 192 //设置START_TASK任务堆栈大小,为8的倍数
    17. extern OS_STK START_TASK_STACK[START_TASK_STACK_SIZE]; //START_TASK任务堆栈
    18. #define MutualExclusionSemaphores_PRIO 4 //继承优先级,互斥信号量专有的
    19. //当某个任务已经获取到这个互斥信号量时,却发现"另外一个更高优先级的任务"也在试图获得"这个互斥信号量",
    20. //这时,需要将拥有"这个互斥信号量的任务"的优先级被提升到这个"继承优先级",防止任务之间产生竞争。
    21. //必须确保MutualExclusionSemaphores_PRIO的值小于所有"需要请求这个互斥信号量的任务"的优先级
    22. //在访问互斥信号量时,使用的优先级。
    23. #define SaveDATA1_TASK_PRIORITY 5 //设置SaveDATA1_TASK任务优先级为5
    24. #define SaveDATA1_TASK_STACK_SIZE 56 //设置SaveDATA1_TASK任务堆栈大小为56,为8的倍数
    25. extern OS_STK SaveDATA1_TASK_STACK[SaveDATA1_TASK_STACK_SIZE]; //SaveDATA1_TASK任务堆栈
    26. #define ReadDATA1_TASK_PRIORITY 6 //设置ReadDATA1_TASK任务优先级为6
    27. #define ReadDATA1_TASK_STACK_SIZE 72 //设置ReadDATA1_TASK任务堆栈大小为72,为8的倍数
    28. extern OS_STK ReadDATA1_TASK_STACK[ReadDATA1_TASK_STACK_SIZE]; //ReadDATA1_TASK任务堆栈
    29. extern OS_EVENT *MutualExclusionSemaphores_Event;
    30. #endif

    3、Start_Task.c文件

    1. #include "Start_Task.h"
    2. #include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
    3. #include "My_Task_Priority.h"
    4. #include "SaveDATA1_Task.h"
    5. #include "ReadDATA1_Task.h"
    6. void Start_Task(void *pdata);
    7. const char Start_Task_rn_REG[]="\r\n";
    8. const char Start_Task_Initialise_REG[]="Start_Task Initialise";
    9. //Start_Task任务
    10. void Start_Task(void *pdata)
    11. {
    12. OS_CPU_SR cpu_sr=0;
    13. u8 err;
    14. pdata = pdata;
    15. printf("%s",Start_Task_rn_REG);
    16. printf("%s",Start_Task_Initialise_REG);
    17. OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断),需要定义cpu_sr变量
    18. MutualExclusionSemaphores_Event=OSMutexCreate(MutualExclusionSemaphores_PRIO,&err);
    19. //创建并初始化一个互斥信号量,用于使任务获得对共享资源的独占式访问权
    20. // OSMutexPost(MutualExclusionSemaphores_Event);//释放一个互斥型信号量
    21. OSTaskCreate( SaveDATA1_Task,/* 函数指针*/
    22. (void *)0,/* 建立任务时,传递的参数*/
    23. (OS_STK*)&SaveDATA1_TASK_STACK[SaveDATA1_TASK_STACK_SIZE-1],/* 指向堆栈任务栈顶的指针*/
    24. SaveDATA1_TASK_PRIORITY/* 任务优先级*/
    25. );
    26. OSTaskCreate( ReadDATA1_Task,/* 函数指针*/
    27. (void *)0,/* 建立任务时,传递的参数*/
    28. (OS_STK*)&ReadDATA1_TASK_STACK[ReadDATA1_TASK_STACK_SIZE-1],/* 指向堆栈任务栈顶的指针*/
    29. ReadDATA1_TASK_PRIORITY/* 任务优先级*/
    30. );
    31. //OSTaskSuspend(START_TASK_PRIO); //挂起起始任务Start_Task(),但不删除
    32. OSTaskDel(OS_PRIO_SELF); //删除自己
    33. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
    34. }

    4、SaveDATA1_Task.c文件

    1. #include "SaveDATA1_Task.h"
    2. #include "stdio.h" //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
    3. #include "My_Task_Priority.h"
    4. #include "AT24cxxDriver.h"
    5. void SaveDATA1_Task(void *pdata);
    6. const char SaveDATA1_Task_rn_REG[]="\r\n";
    7. const char SaveDATA1_Task_Initialise_REG[]="SaveDATA1_Task Initialise";
    8. const char WriteDATA1_REG[]="WriteDATA1=";
    9. //SaveDATA1_Task任务
    10. void SaveDATA1_Task(void *pdata)
    11. {
    12. u16 SaveDATA1_Cnt;
    13. u8 err;
    14. u8 DATA1;
    15. printf("%s",SaveDATA1_Task_rn_REG);
    16. printf("%s",SaveDATA1_Task_Initialise_REG);
    17. while(1)
    18. {
    19. OSTimeDlyHMSM(0,0,0,1000);//延时1
    20. SaveDATA1_Cnt++;
    21. if(SaveDATA1_Cnt >60)//60秒时间到,则保存DATA1
    22. {
    23. OSMutexPend(MutualExclusionSemaphores_Event,0,&err);
    24. //等待一个互斥型信号量,waits for a mutual exclusion semaphore.
    25. EEPROM_U8_Data_Write(DATA1, DATA1_EEPROM_Address);
    26. printf("%s",SaveDATA1_Task_rn_REG);
    27. printf("%s",WriteDATA1_REG);
    28. printf("%u",DATA1);
    29. OSMutexPost(MutualExclusionSemaphores_Event);//释放一个互斥型信号量
    30. SaveDATA1_Cnt =0;
    31. }
    32. }
    33. }

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

  • 相关阅读:
    【Matlab】欧拉公式、梯形公式和改进欧拉公式求解常微分方程
    mysql-视图/存储过程/触发器
    Unity中Shader法线贴图(下)实现篇
    css实现的悬停菜单鼠标跟随图片显示交互特效html页面前端源码
    联创电子业绩惊现首亏:主力产品下滑,车载业务扛不住了?
    Go Machine Learning
    【基础框架】MyBatisPlus入门
    区间查找,二分,思维
    【leetcode】【剑指offer Ⅱ】050. 向下的路径节点之和
    06.论Redis持久化的几种方式
  • 原文地址:https://blog.csdn.net/weixin_42550185/article/details/130900036