OpenEdv-开源电子网

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

UCOS中,用消息邮箱进行任务切换,结果只执行了 一次,就死在空闲状态,什么原因呢?

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-31
在线时间
0 小时
发表于 2012-9-6 17:07:07 | 显示全部楼层 |阅读模式

#include "includes.h"

static  OS_STK  Start_task_stk[START_TASK_STK_SIZE]; 
static  OS_STK  task1_stk[TASK1_STK_SIZE];    
static  OS_STK  task2_stk[TASK2_STK_SIZE];   

void task1(void * p_arg);   
void task2(void * p_arg);
void Start_task(void * p_arg);

OS_EVENT *My_Box;   
static INT32U Task1Msg,Task2Msg;         
static void systick_init(void)
{
        RCC_ClocksTypeDef  rcc_clocks;
        RCC_GetClocksFreq(&rcc_clocks);  
        SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);                                        
}

int main(void)
{
    SystemInit();   
    OSInit();

 My_Box = OSMboxCreate((void*)&Task1Msg);                  //创建消息邮箱

    OSTaskCreate(Start_task,(void *)0,&Start_task_stk[START_TASK_STK_SIZE - 1],START_TASK_PRIO);
 OSStart();
 return 0;
}


static void Start_task(void *p_arg)
{
     BSP_Init();
  systick_init();
  OSTaskCreate(task1,0,&task1_stk[TASK1_STK_SIZE - 1],TASK1_PRIO);
  OSTaskCreate(task2,0,&task2_stk[TASK2_STK_SIZE - 1],TASK2_PRIO);
  
  while(1)         
  {
    OSTimeDlyHMSM(0,0,0,200);     
  }         
}

static void task1(void *p_arg)
{

 INT8U  err;
 p_arg=p_arg; 
 while(1)
  {
  if(OSMboxPend(My_Box,0,&err)== (void *)&Task1Msg)
  {                 
   led_on(LED1);  
      led_off(LED2);
   
   OSMboxPost(My_Box,(void *)&Task2Msg);  
            OSTimeDlyHMSM(0,0,0,200);   
  }
  }    
}

static void task2(void *p_arg)
{  
    INT8U err;
    p_arg = p_arg;
    if(OSMboxPend(My_Box,0,&err) == (void *)&Task2Msg)     // 请求邮箱中的消息,如果没有消息则挂起该任务
 { 
  while(1)
  {
   led_on(LED2);  
      led_off(LED1);
   OSMboxPost(My_Box,(void *)&Task1Msg);
   OSTimeDlyHMSM(0,0,0,200);                  
  }
 }
}


 

my_box0906.rar

374.26 KB, 下载次数: 569

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-6 21:03:47 | 显示全部楼层
回复【楼主位】brand:
---------------------------------
static void task2(void *p_arg)
 这个函数有问题吧,ucosii的任务必须是个死循环。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-31
在线时间
0 小时
 楼主| 发表于 2012-9-7 20:49:02 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我把这个错改过来了,但是程序还是死在空闲状态啊 ,单步运行时,任务二进不去
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-7 22:54:41 | 显示全部楼层
你吧task1,task2的优先级掉换试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-31
在线时间
0 小时
 楼主| 发表于 2012-9-9 13:23:06 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我觉得不是优先级的问题,我也改了优先级,还是不对哦
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-9 14:52:09 | 显示全部楼层
那你先不用邮箱,试试两个任务能否正常调度。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-31
在线时间
0 小时
 楼主| 发表于 2012-9-10 14:21:34 | 显示全部楼层
        不用邮箱,也不正常 ,还是死在空闲状态,搞不清楚怎么弄,盼望指导啊
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2012-9-10 15:36:56 | 显示全部楼层
因为你初始化systick时钟不正确,ucosii没有这个时钟是不能运行的,你只需要把systick_init上面的头两个语句注释掉即可
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-8-31
在线时间
0 小时
 楼主| 发表于 2012-9-10 19:28:16 | 显示全部楼层

回复【8楼】Tardis:
---------------------------------
这个系统时钟配置的是正确的啊,为什么错了呢?能具体的讲解一下么,我很菜,没明白 
我看网上大家讲的原因基本是:定时器没有打开或者在运行过程中被某个程序关闭了定时器,导致系统时钟也被关闭了.任务无法切换
我还不太明白

                                        

回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2012-1-9
在线时间
24 小时
发表于 2012-9-16 11:16:39 | 显示全部楼层
把task2的 if(OSMboxPend(My_Box,0,&err)== (void *)&Task2Msg)  放到while里试试
回复 支持 反对

使用道具 举报

15

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2013-7-12
在线时间
64 小时
发表于 2013-8-31 13:00:20 | 显示全部楼层
我的也是,死在空闲任务中,楼主解决了吗??
提供工业物联网整体解决方案!
https://shop469761648.taobao.com/?spm=2013.1.0.0.3e0568ccstLyMK
回复 支持 反对

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2014-5-21 11:26:18 | 显示全部楼层
回复【11楼】zxcmcu:
------------------------------
我也遇到这个问题了?难道是时钟的问题,我在别的板子上跑的没问题啊,求指教
天道酬勤
回复 支持 反对

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-2-2
在线时间
5 小时
发表于 2015-10-8 17:57:44 | 显示全部楼层
之前也遇到这个问题,一直没有解决,刚好今天在帖子上看到有人回复:定时器没有打开或者在运行过程中被某个程序关闭了定时器,导致系统时钟也被关闭了.任务无法切换。顿时茅塞顿开,回去重新查看了一下delay.c的源代码,发现里面有这样几行代码:
#if SYSTEM_SUPPORT_UCOS
//#include "includes.h" //ucos 使用  
#endif
然而我并没有把includes.h包含进去!我之前为了不让编译器报错,所以只是把它屏蔽了,想着只是一条条件编译语句,而且有了endif结束不会影响到后面。但是偏偏就是这个地方出了问题。后来我往里面添加了一句:
#if SYSTEM_SUPPORT_UCOS
#include "ucos_ii.h"
//#include "includes.h" //ucos 使用  
#endif
然后解决了。我猜是因为没有把ucosii的头文件包含进去导致后面的都没有编译成功,systick定时器中断没有开启,所以导致任务无法切换。
希望对你有帮助。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 23:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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