uc/os-ii 实验6:消息邮箱(2)
2017-03-17 23:22
225 查看
开发板:正电原子STM32F103 MINI
实现功能:实现消息邮箱群发现象
要点:了解消息邮箱广播相关操作,OSMboxPostOpt函数的第三个参数opt,当为OS_POST_OPT_NONE时,则把消息只向优先级别最高的等待任务发送,当为OS_POST_OPT_BROADCAST时,把消息向所有等待任务广播。
代码如下:
实现功能:实现消息邮箱群发现象
要点:了解消息邮箱广播相关操作,OSMboxPostOpt函数的第三个参数opt,当为OS_POST_OPT_NONE时,则把消息只向优先级别最高的等待任务发送,当为OS_POST_OPT_BROADCAST时,把消息向所有等待任务广播。
代码如下:
#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key.h" #include "includes.h" //功能:消息邮箱 //设置任务堆栈大小 #define LED_STK_SIZE 64 #define LED1_STK_SIZE 64 #define KEY_STK_SIZE 64 #define START_STK_SIZE 64 //设置任务堆栈 OS_STK LEDTaskStk[LED_STK_SIZE]; OS_STK LED1TaskStk[LED1_STK_SIZE]; OS_STK KEYTaskStk[KEY_STK_SIZE]; OS_STK StartTaskStk[START_STK_SIZE]; //设置任务优先级 #define LED1_TASK_PRIO 9 #define LED_TASK_PRIO 6 #define KEY_TASK_PRIO 4 #define START_TASK_PRIO 5 //设置事件 OS_EVENT * MBox_P; INT8U err=0; //任务声明 void TaskLED1(void *pdata); void TaskLED(void *pdata); void TaskKEY(void *pdata); void TaskStart(void *pdata); //系统时钟配置函数 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; } //启动任务 void TaskStart(void *pdata) { pdata=pdata; OS_ENTER_CRITICAL(); //创建事件 MBox_P=OSMboxCreate((void *)0); //事例1 OSTaskCreate(TaskLED1,(void*)0,(OS_STK*)&LED1TaskStk[LED1_STK_SIZE-1],LED1_TASK_PRIO); OSTaskCreate(TaskLED,(void*)0,(OS_STK*)&LEDTaskStk[LED_STK_SIZE-1],LED_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 TaskLED(void *pdata) { unsigned char *p; pdata=pdata; LED0=1; while(1) { p=OSMboxPend(MBox_P,0,&err); //请求信号邮箱 if(*(p+1)=='t') { LED0=!LED0; } OSTimeDlyHMSM(0,0,0,100); } } //任务2 void TaskLED1(void *pdata) { unsigned char *p a151 ; LED1=1; while(1) { p=OSMboxPend(MBox_P,0,&err); //请求信号邮箱 if(*(p+2)=='a') { LED1=!LED1; } OSTimeDlyHMSM(0,0,0,100); } } //任务3 void TaskKEY(void *pdata) { while(1) { if(KEY1==1) //按键按下 { while(KEY1==1) { OSTimeDlyHMSM(0,0,0,10); } OSMboxPostOpt(MBox_P,"Start",OS_POST_OPT_NONE); //只有LED闪 //OSMboxPostOpt(MBox_P,"Start",OS_POST_OPT_BROADCAST); //LED LED1闪 OSTimeDlyHMSM(0,0,0,10); } else { OSTimeDlyHMSM(0,0,0,10); } } } //系统时钟中断服务函数 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 }
相关文章推荐
- uC/OS-II 学习笔记:消息邮箱实验
- uC/OS-II 学习笔记:消息邮箱
- uC/OS-II 学习笔记之:消息邮箱
- uc/os-II之向消息邮箱发送消息
- uC/OS-II 学习笔记之:信号量、消息邮箱、消息队列之间的使用区别
- uC/OS-II消息邮箱及其操作
- 【iCore4 双核心板_uC/OS-II】例程八:消息邮箱
- uC/OS-II中的消息邮箱
- uc/os-ii 实验5:信号邮箱(1)
- uc/os-II 分析(9)---消息邮箱
- uc/os-ii消息邮箱
- uC/OS-II中的消息邮箱
- uC/OS-II 最简单的消息队列
- uC/OS-II实验程序之一(事件标志)
- uC/OS-II学习笔记 消息队列
- uC/OS-II 学习笔记:消息队列
- uc/os-ii 实验4:互斥信号量
- uC/OS-II 学习笔记:信号量实验
- uC/OS的消息邮箱使用经验
- μC/OS-II实验:实验四 消息队列