基于uCOS-II系统的stm32物联网套件(温湿度传感器)开发—— 信号量实现任务间同步、邮箱实现任务之间的通讯
实现功能
- uC/OS任务间通讯和同步,建立一个工程,应用程序含两个任务,任务B根据任务A发送过来的延时时间值不断显示跑马灯;
- 使用信号量实现任务间同步;
- 使用邮箱实现任务之间的通讯。
程序分析
main.c
#include "includes.h"
static OS_STK A_task_stk[TASK_STK_SIZE];
static OS_STK B_task_stk[TASK_STK_SIZE];
OS_EVENT *Led_Semp;
OS_EVENT *Str_Box;
int main(void)
{
BSP_Init();
OSInit();
Led_Semp = OSSemCreate(0);
Str_Box = OSMboxCreate((void *)0);
OSTaskCreate(TaskA,(void *)0,
&A_task_stk[TASK_STK_SIZE-1], TASK_PRIOA);
OSTaskCreate(TaskB,(void *)0,
&B_task_stk[TASK_STK_SIZE-1], TASK_PRIOB);
OSStart();
return 0;
}
app_cfg.h
#ifndef __APP_CFG_H__
#define __APP_CFG_H__
#define TASK_PRIOA 4
#define TASK_PRIOB 5
#define TASK_STK_SIZE 80
#endif
app.c
#include "includes.h"
OS_EXT OS_EVENT *Led_Semp;
OS_EXT OS_EVENT *Str_Box;
INT8U errM;
INT8U err;
void led_set(int num,int sta)
{
if(sta==1)
{
switch(num)
{
case 1 :
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
break;
case 2 :
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
break;
case 3 :
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
break;
case 4 :
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
break;
default :
break;
}
}
else
{
switch(num)
{
case 1 :
GPIO_SetBits(GPIOB,GPIO_Pin_4);
break;
case 2 :
GPIO_SetBits(GPIOB,GPIO_Pin_5);
break;
case 3 :
GPIO_SetBits(GPIOB,GPIO_Pin_6);
break;
case 4 :
GPIO_SetBits(GPIOB,GPIO_Pin_7);
break;
default :
break;
}
}
}
void led_init(void)
{
int i = 0;
for(i=1;i<5;i++)
{
led_set(i,0);
}
}
void TaskA(void *p_arg)
{
char delay = 3;
while(1){
OSSchedLock();
OSSemPost(Led_Semp);
OSMboxPost(Str_Box,&delay);
OSSchedUnlock();
OSTimeDlyHMSM(0,0,5,0);
}
}
void TaskB(void *p_arg){
char *time;
while(1){
OSSemPend(Led_Semp,0,&err);
time = OSMboxPend(Str_Box,10,&errM);
OSTimeDlyHMSM(0,0,1,0);
if(err == OS_ERR_NONE){
led_set(1,1);
OSTimeDlyHMSM(0,0,*time,0);
led_set(1,0);
OSTimeDlyHMSM(0,0,*time,0);
led_set(2,1);
OSTimeDlyHMSM(0,0,*time,0);
led_set(2,0);
OSTimeDlyHMSM(0,0,*time,0);
led_set(3,1);
OSTimeDlyHMSM(0,0,*time,0);
led_set(3,0);
OSTimeDlyHMSM(0,0,*time,0);
led_set(4,1);
OSTimeDlyHMSM(0,0,*time,0);
led_set(4,0);
OSTimeDlyHMSM(0,0,*time,0);
}
}
}
app.h
#ifndef _APP_H_
#define _APP_H_
void TaskA(void *p_arg);
void TaskB(void *p_arg);
#endif
注:运用信号量和消息邮箱时应注意在os_cfg.h中,打开此功能!
学识有限,如有错误欢迎指正。