1.功能概述
按键按下后,触发外部中断,由外部中断服务子函数发送信号量,温度采集任务接收到信号量后,通过DS18B20采集温度。温度采集完成后,以消息邮箱发送给串口显示。
设计一个LED灯任务,监视系统的运行情况。
2.主要代码
2.1 系统的初始化
OS_EVENT * keySem;//定义信号量
OS_EVENT* Temp_MBOX; //定义消息邮箱
#define START_TASK_PRIO 4 //开始任务优先级
#define START_STK_SIZE 64 //开始任务堆栈大小
static OS_STK START_TASK_STK[START_STK_SIZE]; //定义开始任务的堆栈
#define TempRead_TASK_PRIO 6 //
#define TempRead_STK_SIZE 100 //
static OS_STK TempRead_TASK_STK[TempRead_STK_SIZE]; //
#define Disp_TASK_PRIO 8 //
#define Disp_STK_SIZE 100 //
static OS_STK Disp_TASK_STK[Disp_STK_SIZE]; //
#define LED_TASK_PRIO 10 //
#define LED_STK_SIZE 64 //
static OS_STK LED_TASK_STK[LED_STK_SIZE]; //
int main()
{
RCC_Init();
LED_Init();
exti_init();
printf_init(); //printf³õʼ»¯
ds18b20_init(); //DS18B20³õʼ»¯
Delay_Init();
OSInit(); //³õʼ»¯UCOS²Ù×÷ϵͳ
keySem=OSSemCreate(0);
Temp_MBOX=OSMboxCreate((void *)0); //½¨Á¢ÏûÏ¢ÓÊÏä
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //´´½¨ÆðʼÈÎÎñ
OSStart(); //Æô¶¯ucos²Ù×÷ϵͳ
}
开始任务如下
void start_task(void *pdata) //¿ªÊ¼ÈÎÎñ
{
OS_CPU_SR cpu_sr=0;
pdata=pdata;
OSStatInit(); //初始化统计任务
OS_ENTER_CRITICAL(); //关中断
OSTaskCreate(LED_task,(void *)0,(OS_STK *)&LED_TASK_STK[LED_STK_SIZE-1] ,LED_TASK_PRIO);//LED灯任务
OSTaskCreate(TempRead_task,(void *)0,(OS_STK *)&TempRead_TASK_STK[TempRead_STK_SIZE-1] ,TempRead_TASK_PRIO);//温度读取
OSTaskCreate(Disp_task,(void *)0,(OS_STK *)&Disp_TASK_STK[Disp_STK_SIZE-1] ,Disp_TASK_PRIO);//串口显示
OSTaskSuspend(START_TASK_PRIO); //挂起开始任务
OS_EXIT_CRITICAL(); //开中断
}
2.2 LED灯任务
void LED_task(void *pdata) //ÈÎÎñ1 led
{
pdata=pdata;
while(1)
{
// OSSemPend(ledSem,0,&err);
GPIO_ResetBits(GPIOB,LED); //IO¿ÚÊä³öµÍµçƽ
delay_ms(1000);
GPIO_SetBits(GPIOB,LED); //IO¿ÚÊä³ö¸ßµçƽ
delay_ms(1000);//ÑÓʱԼΪ1s
}
}
2.3 温度采集任务
void TempRead_task(void *pdata) //ÈÎÎñ1 TempRead_task
{
double data;
INT8U err;
INT8U i=4;
pdata=pdata;
while(1)
{
OSSemPend(keySem,0,&err);
OSSchedLock();
data=readtemp();
printf("当前温度值为:%f ℃/r/n",data);
printf("i=%d\r\n",i++);//测试代码
//delay_ms(500);
OSMboxPost(Temp_MBOX,(void *)&data);//发送消息邮箱
OSSchedUnlock();
}
}
2.4 串口显示任务
void Disp_task(void *pdata) //ÈÎÎñ1 led
{
u8 err,i=0;
double msg;
pdata=pdata;
while(1)
{
msg=*(double *)OSMboxPend(Temp_MBOX,0,&err); //接收消息邮箱
if(err==OS_ERR_NONE)
{
printf("成功接收消息r\n");
printf"当前温度值为:%f ℃/r/n",msg);
printf(" \r\n");
}
}
}