uc/os-ii 实验4:互斥信号量
来源:互联网 发布:下载淘宝网2015新版 编辑:程序博客网 时间:2024/06/02 01:46
开发板:正电原子STM32F103 MINI
实现功能:模拟优先级反转现象
要点:了解互斥信号量的相关操作,互斥型信号量所对应的事件控制块中成员变量OSEventCnt的高8位为要提升的优先级,低8位赋予OS_MUTEX_AVAILABLE,需要注意的是OS_MUTEX_AVAILABLE不一定是0XFF,但是创建二值信号时这个值必须为0XFF否则创建不成功,当任务成功创建互斥信号量后OS_MUTEX_AVAILABLE的值将变成创建信号量任务的优先级,当该任务释放互斥信号量后OS_MUTEX_AVAILABLE的值会重新赋值0xFF,需要注意的是二值信号量的释放必须与请求信号量的任务为同一个任务。
任务代码:
#include "sys.h"#include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "includes.h" //功能:二值信号量//设置任务堆栈大小#define KEY_STK_SIZE 64#define KEY1_STK_SIZE 64#define DLY_STK_SIZE 64#define START_STK_SIZE 64//设置任务堆栈OS_STK KEY1TaskStk[KEY1_STK_SIZE];OS_STK KEYTaskStk[KEY_STK_SIZE];OS_STK DLYTaskStk[DLY_STK_SIZE];OS_STK StartTaskStk[START_STK_SIZE];//设置任务优先级#define KEY1_TASK_PRIO 9#define KEY_TASK_PRIO 6#define DLY_TASK_PRIO 10#define START_TASK_PRIO 5//设置事件OS_EVENT * Mutex_P;INT8U err=0;//任务声明void TaskDLY(void *p);void TaskKEY1(void *p);void TaskKEY(void *p);void TaskStart(void *p);//系统时钟配置函数void SysTick_Configuration(void);int main(void){ Stm32_Clock_Init(9); //系统时钟设置 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); SysTick_Configuration(); OSInit(); OSTaskCreate(TaskStart,(void *)0,(OS_STK*)&StartTaskStk[START_STK_SIZE-1],START_TASK_PRIO); OSStart(); return 0; }//启动任务//控制DS0的亮灭.void TaskStart(void *pdata){ pdata=pdata; OS_ENTER_CRITICAL(); //创建事件 Mutex_P=OSMutexCreate(3,&err); OSTaskCreate(TaskDLY,(void*)0,(OS_STK*)&DLYTaskStk[DLY_STK_SIZE-1],DLY_TASK_PRIO); OSTaskCreate(TaskKEY1,(void*)0,(OS_STK*)&KEY1TaskStk[KEY1_STK_SIZE-1],KEY1_TASK_PRIO); OSTaskCreate(TaskKEY,(void*)0,(OS_STK*)&KEYTaskStk[KEY_STK_SIZE-1],KEY_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); OS_EXIT_CRITICAL();}//任务1 void TaskKEY(void *pdata){ pdata=pdata; LED0=1; while(1) { OSTimeDlyHMSM(0,0,0,10); //任务切换 OSMutexPend(Mutex_P,0,&err); //请求信号量 while(KEY1==1) //按键没有按下 { OSTimeDlyHMSM(0,0,0,10); } LED0=0; //按键按下 OSTimeDlyHMSM(0,0,0,50); }}//任务2void TaskKEY1(void *pdata){ pdata=pdata; LED1=0; while(1) { LED1=!LED1; OSTimeDlyHMSM(0,0,0,100); }}//任务3void TaskDLY(void *pdata){ pdata=pdata; while(1) { OSMutexPend(Mutex_P,0,&err); //请求信号量 OSTimeDlyHMSM(0,0,5,0); OSMutexPost(Mutex_P); //发送信号量 OSTimeDlyHMSM(0,0,2,0); }}//系统时钟中断服务函数void SysTick_Handler(void){ OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */ OSIntNesting++; OS_EXIT_CRITICAL(); OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */ OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */}//系统时钟配置,设计1ms产生一次中断void SysTick_Configuration(void){ SysTick->CTRL&=~(1<<2);//SYSTICK使用外部时钟源 SysTick->CTRL|=1<<1; //开启SYSTICK中断 SysTick->LOAD=9000; //产生1ms中断 //bit2清空,选择外部时钟 HCLK/8 SysTick->CTRL|=1<<0; //开启SYSTICK}
0 0
- uc/os-ii 实验4:互斥信号量
- uC/OS-II互斥信号量与任务优先级反转
- uC/OS-II 学习笔记:信号量实验
- uc/os-ii实验1:信号量
- uc/os-ii 实验2:信号量
- uc/os-ii信号量
- UC/OS II事件管理(3)之互斥信号量管理
- uc/os-ii互斥型信号量
- uc/os-ii信号量集
- uc/os-iii学习笔记-资源管理(中断、信号、信号量、互斥信号量)
- uC/OS-II 学习笔记之:信号量
- uC/OS-II的信号量及其操作
- uC/OS-II 学习笔记:信号量
- uc/os-ii信号量的理解
- uc/os-ii 实验3:优先级反转
- 移植uC/OS-II到瑞萨的单片机,添加信号量功能
- uC/OS-II 函数之信号量相关函数
- UC/OS II事件管理(2)之信号量管理
- 深入分析字符编码之-几种常见的字符编码格式
- Maven新导入项目时出现错误Failure to transfer commons-lang:commons-lang:jar:2.1 from https://repo.maven.apache.
- memset()函数的使用
- 原子指令分析
- 播放视频
- uc/os-ii 实验4:互斥信号量
- xmpp中 出席节 几种状态的切换及判断
- Ubuntu安装配置
- 引发异常
- jquery插件开发学习笔记(一)
- iOS菜鸟笔记2: Foundation库中最常用的类
- oscache的简单配置与使用
- linux工作环境配置
- 关于unity人形模型子父对象各自加(混合)碰撞器或刚体产生的碰撞检测结果的不同