代码如下
#include "led.h"
#include "beep.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "MPU6050.h"
#include "iic_analog.h"
//#include "timer.h"
//ALIENTEK战舰STM32开发板实验54
//UCOSII实验2-2-任务创建,删除,挂起,恢复
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
/////////////////////////UCOSII任务堆栈设置///////////////////////////////////
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//创建任务堆栈空间
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数接口
void start_task(void *pdata);
//uart任务
//设置任务优先级
#define uart_TASK_PRIO 9
//设置任务堆栈大小
#define uart_STK_SIZE 64
//创建任务堆栈空间
OS_STK uart_TASK_STK[uart_STK_SIZE];
//任务函数接口
void uart_task(void *pdata);
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO 5
//设置任务堆栈大小
#define LED0_STK_SIZE 64
//创建任务堆栈空间
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数接口
void led0_task(void *pdata);
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO 6
//设置任务堆栈大小
#define LED1_STK_SIZE 64
//创建任务堆栈空间
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数接口
void led1_task(void *pdata);
//蜂鸣器任务
//设置任务优先级
#define BEEP_TASK_PRIO 7
//设置任务堆栈大小
#define BEEP_STK_SIZE 64
//创建任务堆栈空间
OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
//任务函数接口
void beep_task(void *pdata);
//MPU6050任务
//设置任务优先级
#define MPU6050_TASK_PRIO 8
//设置任务堆栈大小
#define MPU6050_STK_SIZE 128
//创建任务堆栈空间
OS_STK MPU6050_TASK_STK[MPU6050_STK_SIZE];
//任务函数接口
void MPU6050_task(void *pdata);
OS_EVENT * msg_AX; //邮箱事件块指针
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(57600);
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init(); //蜂鸣器初始化
while(Single_Read_IIC( SLAVEADRESS , ACCEL_XOUT_L )==0) //反复初始化MPU6050,直到读出数据
Sys_Configuration();
OSInit(); //初始化UCOSII
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
OSStart();
}
//开始任务
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
msg_AX=OSMboxCreate((void*)0); //创建消息邮箱
OSStatInit(); //初始化统计任务.这里会延时1秒钟左右
OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
OSTaskCreate(MPU6050_task,(void *)0,(OS_STK*)&MPU6050_TASK_STK[MPU6050_STK_SIZE-1],MPU6050_TASK_PRIO);
OSTaskCreate(beep_task,(void *)0,(OS_STK*)&BEEP_TASK_STK[BEEP_STK_SIZE-1],BEEP_TASK_PRIO);
OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(uart_task,(void *)0,(OS_STK*)&uart_TASK_STK[uart_STK_SIZE-1],uart_TASK_PRIO);
OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.
OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
}
void MPU6050_task(void *pdata)
{
// signed int AX=0;//AY=0,AZ=0,GX=0,GY=0,GZ=0;
while(1)
{
if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ) //判断是否有删除请求
{
OSTaskDel(OS_PRIO_SELF); //删除任务本身TaskLed
}
// AX=0+getAccX();
// AY=getAccY()+0;
// AZ=getAccZ()+0;
// GX=getGyroX()+0;
// GY=getGyroY()+0;
// GZ=getGyroZ()+0;
// OSMboxPost(msg_AX,(void*)&AX);//发送消息
}
}
//LED0任务
void led0_task(void *pdata)
{
while(1)
{
delay_ms(100);
LED0=0;
delay_ms(50);
LED0=1;
delay_ms(2350);
}
}
//LED1任务
void led1_task(void *pdata)
{
while(1)
{
LED1=0;
delay_ms(50);
LED1=1;
delay_ms(4950);
}
}
//蜂鸣器任务
void beep_task(void *pdata)
{
while(1)
{
if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ) //判断是否有删除请求
{
OSTaskDel(OS_PRIO_SELF); //删除任务本身TaskLed
}
BEEP=1;
delay_ms(60);
BEEP=0;
delay_ms(9940);
}
}
void uart_task(void *pdata)
{
signed int AX=0;
u8 err;
while(1)
{
if(OSTaskDelReq(OS_PRIO_SELF)==OS_ERR_TASK_DEL_REQ) //判断是否有删除请求
{
OSTaskDel(OS_PRIO_SELF); //删除任务本身TaskLed
}
AX=0+(signed int)OSMboxPend(msg_AX,1,&err);
// printf("AX:%8d AY:%8d AZ:%8d GX:%8d GY:%8d GZ:%8d \r\n",AX,AY,AZ,GX,GY,GZ);
printf("AX:%8d \r\n",AX);
delay_ms(50);
}
}
|