基于uCOS-II系统的stm32物联网套件(温湿度传感器)开发——信号量实现任务间同步、邮箱实现任务之间的通讯

基于uCOS-II系统的stm32物联网套件(温湿度传感器)开发—— 信号量实现任务间同步、邮箱实现任务之间的通讯

实现功能

  1. uC/OS任务间通讯和同步,建立一个工程,应用程序含两个任务,任务B根据任务A发送过来的延时时间值不断显示跑马灯;
  2. 使用信号量实现任务间同步;
  3. 使用邮箱实现任务之间的通讯。

程序分析

main.c

#include "includes.h"

static OS_STK A_task_stk[TASK_STK_SIZE];		  					//定义任务A的栈
static OS_STK B_task_stk[TASK_STK_SIZE];							//定义任务B的栈
OS_EVENT *Led_Semp;												//定义Led信号量的事件控制块指针
OS_EVENT *Str_Box;												//定义消息邮箱事件控制块指针

int main(void)
{
  BSP_Init();																					//初始化uCOS-II系统的板上时钟
	OSInit();																						//uCOS-II系统初始化	
	Led_Semp = OSSemCreate(0);									//创建计数型信号量
	Str_Box = OSMboxCreate((void *)0);							//创建消息邮箱
	OSTaskCreate(TaskA,(void *)0,								//创建任务A
	   &A_task_stk[TASK_STK_SIZE-1], TASK_PRIOA);
	OSTaskCreate(TaskB,(void *)0,								//创建任务B
	   &B_task_stk[TASK_STK_SIZE-1], TASK_PRIOB);
	OSStart();													//uCOS-II系统启动函数		
    return 0;
 }

app_cfg.h

#ifndef  __APP_CFG_H__
#define  __APP_CFG_H__

/*******************设置任务优先级*******************/
#define TASK_PRIOA       4
#define TASK_PRIOB       5
 
/************设置栈大小(单位为 OS_STK )************/
#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)										//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)																		
{
		int i = 0;
		for(i=1;i<5;i++)
		{
			led_set(i,0);											//设置LED状态函数
		}
}
//任务A发送信号同步和消息邮箱中的延时时间
void TaskA(void *p_arg)
{	
	char delay = 3;													//定义延时时间变量3s
	while(1){
		//通过锁任务调度器,防止信号量和消息邮箱没有同时产生
		OSSchedLock();												//任务调度函数上锁
		OSSemPost(Led_Semp);										//计数型信号量释放函数
		OSMboxPost(Str_Box,&delay);									//消息邮箱存入信息函数
		OSSchedUnlock();											//任务调度函数解锁			
		OSTimeDlyHMSM(0,0,5,0);										//时间延时5s		
	}
}
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);									//时间延时1s		
			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	//_APP_H_

注:运用信号量和消息邮箱时应注意在os_cfg.h中,打开此功能!
学识有限,如有错误欢迎指正。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32 uCOS-II任务实验是一种基于STM32微控制器和uCOS-II操作系统的多任务应用程序实验。该实验旨在通过使用uCOS-II操作系统实现多个任务同时运行,提高系统的效率和可靠性。 在该实验中,我们可以使用STM32开发板和uCOS-II操作系统,创建多个任务并分配不同的优先级。每个任务可以执行不同的操作,例如读取传感器数据、控制外设、处理数据等。通过使用uCOS-II操作系统任务调度机制,可以确保每个任务按照其优先级顺序执行,从而实现任务并发执行的效果。 在实验过程中,我们需要学习uCOS-II操作系统的基本概念和使用方法,包括任务创建、任务调度、信号量、消息队列等。同时,还需要了解STM32微控制器的硬件资源和编程方法,以便实现任务的具体功能。 总之,STM32 uCOS-II任务实验是一种非常有意义的实验,可以帮助我们深入了解嵌入式系统的多任务编程和操作系统原理,提高我们的实际应用能力。 ### 回答2: stm32是一款基于arm cortex-m内核的微控制器,其具有高性能和低功耗的优点,可广泛应用于嵌入式系统、智能家居、机器人等领域。同时,ucos-ii是一款实时操作系统,能够提供多任务管理、资源管理、时管理等功能,可帮助开发人员快速构建嵌入式系统stm32 ucos-ii任务实验是指在stm32平台上实现ucos-ii操作系统的多任务管理功能,以实现任务之间的并发执行。该实验通常包括以下几个步骤: 1.准备工作:在开发板上搭建环境,包括stm32开发环境、ucos-ii环境以及相关工具的配置。 2.任务定义:定义多个任务,每个任务都是一个独立的程序模块,应包括任务的初始化、任务功能、任务清理等步骤。 3.任务调度:ucos-ii操作系统会根据任务的优先级、状态等因素进行任务调度,确保任务可以及时得到执行。 4.任务通信:在多任务实验中,由于各个任务之间具有相互制约关系,因此需要进行任务通信,以确保任务能够协同工作。 5.调试测试:在实现任务后,需要进行调试测试,确保各个任务能够正常运行,系统具有稳定性和健壮性。 综上所述,stm32 ucos-ii任务实验可以帮助开发人员深入了解stm32的基本功能和ucos-ii实时操作系统的特点,提高系统的并发处理能力,为嵌入式系统开发和应用提供有力支持。 ### 回答3: STM32 uCOS-II任务实验是一种在STM32芯片上使用uC/OS-II操作系统进行多任务开发的实验。该实验旨在帮助学生和工程师熟悉uC/OS-II操作系统,学习多任务开发和调试技术。 在这个实验中,我们需要使用一些基本的硬件和软件,如STM32开发板、uC/OS-II操作系统、Keil或者IAR嵌入式开发工具、以及一些基本的电子元器件。我们需要编写一些任务代码,在uC/OS-II操作系统上进行多任务的协作开发。我们需要学习如何在uC/OS-II操作系统上创建任务、删除任务、挂起任务、恢复任务、设置任务优先级等等。 在进行STM32 uCOS-II任务实验时,我们需要注意一些事项。首先,我们需要根据实际需要分析任务的资源需求和优先级,为每个任务分配适当的资源和优先级。其次,我们需要了解uC/OS-II操作系统的机制和原理,例如任务调度、消息传递、事件通知等等,以便正确使用和调试操作系统的各种功能。 总之,STM32 uCOS-II任务实验是一个非常有价值和有意义的实验,它能够帮助我们提高多任务开发和调试的能力。通过这个实验,我们能够掌握uC/OS-II操作系统的使用方法和技能,提高我们的嵌入式开发能力和技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值