OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5386|回复: 5

ucos2 中修改任务优先级就不能运行了,求教~~~

[复制链接]

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
发表于 2013-9-16 20:24:32 | 显示全部楼层 |阅读模式
代码如下
#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      
//设置任务堆栈大小
#define uart_STK_SIZE       64
//创建任务堆栈空间
OS_STK uart_TASK_STK[uart_STK_SIZE];
//任务函数接口
void uart_task(void *pdata);


//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO      
//设置任务堆栈大小
#define LED0_STK_SIZE       64
//创建任务堆栈空间
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数接口
void led0_task(void *pdata);


//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO      
//设置任务堆栈大小
#define LED1_STK_SIZE       64
//创建任务堆栈空间
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数接口
void led1_task(void *pdata);


//蜂鸣器任务
//设置任务优先级
#define BEEP_TASK_PRIO      
//设置任务堆栈大小
#define BEEP_STK_SIZE   64
//创建任务堆栈空间
OS_STK BEEP_TASK_STK[BEEP_STK_SIZE];
//任务函数接口
void beep_task(void *pdata);


//MPU6050任务
//设置任务优先级
#define MPU6050_TASK_PRIO      
//设置任务堆栈大小
#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); 
}  
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
 楼主| 发表于 2013-9-16 20:25:19 | 显示全部楼层
以上是能运行的版本,但是我把优先级改掉就不能正常运行了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-16 21:54:01 | 显示全部楼层
仿真下
回复 支持 反对

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
 楼主| 发表于 2013-9-16 22:05:30 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
找到原因了,MPU6050任务没释放CPU,我加了个delay就可以了
回复 支持 反对

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
 楼主| 发表于 2013-9-16 22:08:55 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
话说串口发送数据需要等待一个数据发送完成才发送下一个,在ucos中串口发送时的等待时间会释放CPU吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-16 22:16:58 | 显示全部楼层
回复【5楼】红木甲板:
---------------------------------
printf?
不会。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 05:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表