基于uCOS-II系统的stm32物联网套件(温湿度传感器)开发—— 多任务LED闪烁

基于uCOS-II系统的stm32物联网套件(温湿度传感器)开发—— 多任务LED闪烁

实现功能

编写多任务应用程序,实现任务1控制LED1每500ms闪烁1次,任务2控制LED2 每1秒闪烁1次,任务3控制LED3每2秒闪烁1次,任务4控制LED4每4秒闪烁一次。

程序分析

main.c

#include "includes.h"
//分别定义四个LED闪烁任务的栈
static OS_STK LED1_task_stk1[TASK_STK_SIZE];		
static OS_STK LED2_task_stk2[TASK_STK_SIZE];
static OS_STK LED3_task_stk3[TASK_STK_SIZE];
static OS_STK LED4_task_stk4[TASK_STK_SIZE];

int main(void)
{
  	BSP_Init();											//初始化uCOS-II系统的板上时钟
	OSInit();											//uCOS-II系统初始化
	//创建四个LED闪烁任务
	OSTaskCreate(Task_LED1,(void *)0,
	   &LED1_task_stk1[TASK_STK_SIZE-1], TASK_PRIO4);
	OSTaskCreate(Task_LED2,(void *)0,
	   &LED2_task_stk2[TASK_STK_SIZE-1], TASK_PRIO5);
	OSTaskCreate(Task_LED3,(void *)0,
	   &LED3_task_stk3[TASK_STK_SIZE-1], TASK_PRIO6);
	OSTaskCreate(Task_LED4,(void *)0,
	   &LED4_task_stk4[TASK_STK_SIZE-1], TASK_PRIO7);

	OSStart();											//uCOS-II系统启动函数
    return 0;
 }

app_cfg.h

#ifndef  __APP_CFG_H__
#define  __APP_CFG_H__

/*******************设置任务优先级*******************/
#define TASK_PRIO4       4
#define TASK_PRIO5       5
#define TASK_PRIO6       6
#define TASK_PRIO7       7

/************设置栈大小(单位为 OS_STK )************/
#define TASK_STK_SIZE   80  
 
#endif

app.c

#include "includes.h"

int i=0;
void led_set(int num,int sta)										//num为LED灯号,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;
				}
		}
}

//将四个LED灯全部熄灭
void led_init(void)																		
{
		for(i=1;i<5;i++)
		{
			led_set(i,0);												//设置LED状态函数
		}
}
//LED1闪烁函数
void Task_LED1(void *p_arg)
{																					
	led_init();															//LED初始化函数
	while(1)																							
	{
		led_set(1,1);													//设置LED状态函数
		OSTimeDlyHMSM(0, 0, 0,250);										//任务延时函数250ms
		led_set(1,0);	
		OSTimeDlyHMSM(0, 0, 0,250);

	}
}
//LED2闪烁函数
void Task_LED2(void *p_arg){
	led_init();															//LED初始化函数																							
	while(1)																								
	{
		led_set(2,1);													//设置LED状态函数
		OSTimeDlyHMSM(0, 0, 0,500);										//任务延时函数500ms
		led_set(2,0);	
		OSTimeDlyHMSM(0, 0, 0,500);
	}
}
//LED3闪烁函数
void Task_LED3(void *p_arg){
	led_init();															//LED初始化函数																						
	while(1)																								
	{
		led_set(3,1);													//设置LED状态函数
		OSTimeDlyHMSM(0, 0, 1,0);										//任务延时函数1s
		led_set(3,0);	
		OSTimeDlyHMSM(0, 0, 1,0);
	}
}
//LED4闪烁函数
void Task_LED4(void *p_arg){
	led_init();															//LED初始化函数																							
	while(1)																								
	{
		led_set(4,1);													//设置LED状态函数
		OSTimeDlyHMSM(0, 0, 2,0);										//任务延时函数2s
		led_set(4,0);	
		OSTimeDlyHMSM(0, 0, 2,0);
	}
}

app.h

#ifndef	_APP_H_
#define	_APP_H_

/**************** 用户任务声明 *******************/
void Task_LED1(void *p_arg);
void Task_LED2(void *p_arg);
void Task_LED3(void *p_arg);
void Task_LED4(void *p_arg);
#endif	//_APP_H_
学识有限,如有错误欢迎指正。

你可能感兴趣的:(uCOS)