OpenEdv-开源电子网

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

ucos使用软件定时器后,任务无法正常运行,一直进软件定时器回调函数

[复制链接]

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-7-6
在线时间
10 小时
发表于 2015-7-6 21:34:37 | 显示全部楼层 |阅读模式
5金钱

#define START_TASK_PRIO       10 
#define START_STK_SIZE   64
OS_STK START_TASK_STK[START_STK_SIZE];
void start_task(void *pdata);  

#define LED1_TASK_PRIO       7
#define LED1_STK_SIZE   64
OS_STK  LED1_TASK_STK[LED1_STK_SIZE];
void LED1_task(void *pdata);  

#define LED2_TASK_PRIO       8 
#define LED2_STK_SIZE   64
OS_STK  LED2_TASK_STK[LED2_STK_SIZE];
void LED2_task(void *pdata);  
OS_TMR *tmr1; //
void tmr1_callback(OS_TMR *ptmr,void *p_arg);
int main (void)
{
    u8 err;
    OS_CPU_SysTickInit();
    BSP_GPIO_Init();
    OSInit();   
  err=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;
u8 err;  
    pdata = pdata;
 tmr1=OSTmrCreate(100,10,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)tmr1_callback,0,"tmr1",&err);
   OSTmrStart(tmr1,&err);
    OS_ENTER_CRITICAL();
   OSTaskCreate(LED1_task,(void *)0,(OS_STK *)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO );//???¨LED1????    
//   OSTaskCreate(LED2_task,(void *)0,(OS_STK *)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO );
    OSTaskSuspend(START_TASK_PRIO);
    OS_EXIT_CRITICAL();
}
void LED1_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
// u8 err;  
    pdata = pdata;
    while(1)
    {
        LED1=!LED1;
        OSTimeDly(50);
    }
    
}
void LED2_task(void *pdata)
{
    OS_CPU_SR cpu_sr=0;
// u8 err;  
    pdata = pdata;
    while(1)
    {
        LED0=!LED0;
        OSTimeDly(10);
    }
    
}
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
    u8 i;
    for(;;)
    {
        if(i>=10)
        {
            i=0;
            LED0=!LED0;
        }
        i++;
    }
}
#define OS_TMR_CFG_TICKS_PER_SEC 100u   /*     Rate at which timer management task runs (Hz)            */
#define OS_TASK_TMR_PRIO          9u
#define OS_TICKS_PER_SEC       200u


不开启软件定时器时,两个LED闪烁正常,开启软件定时器后,把LED2任务屏蔽掉后,一直进软件定时器回调函数,LED1_task无法进入,有谁知道这是怎么回事吗?

最佳答案

查看完整内容[请看2#楼]

软件定时器的回调函数是个函数,必须尽快返回,而不能写成任务。  下面这样写是不对的,因为这是任务的形式: void tmr1_callback(OS_TMR *ptmr,void *p_arg) {     u8 i;     for(;;)     {     } }   应该改为:  void tmr1_callback(OS_TMR *ptmr,void *p_arg) {   &nb ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
发表于 2015-7-6 21:34:38 | 显示全部楼层
软件定时器的回调函数是个函数,必须尽快返回,而不能写成任务。 

下面这样写是不对的,因为这是任务的形式:
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
    u8 i;
    for(;;)
    {
    }
}  


应该改为:
 void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
    static u8 i=0;
    if(i>=10)
        {
            i=0;
            LED0=!LED0;
        }
    i++;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-6 22:28:20 | 显示全部楼层
把软件定时器的优先级设置为最高试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2014-10-21
在线时间
49 小时
发表于 2015-7-7 15:47:53 | 显示全部楼层
回调函数你进入了死循环了,没有挂起啊
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-7-6
在线时间
10 小时
 楼主| 发表于 2015-7-7 21:21:47 | 显示全部楼层
回复【3楼】lionmon:
---------------------------------
例程里也没有挂起啊?而且软件定时器挂起,怎么挂起,加OSTimeDly,这样定时器还准吗?不就失去定时器的意义了吗?
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-7-6
在线时间
10 小时
 楼主| 发表于 2015-7-7 21:48:01 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,优先级改完0也不行啊~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-7 22:37:54 | 显示全部楼层
回复【5楼】ghqiloveu:
---------------------------------
这就不太清楚了,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2014-10-21
在线时间
49 小时
发表于 2015-7-13 09:43:05 | 显示全部楼层
回复【4楼】ghqiloveu:
---------------------------------
我的意思是你的定时器回调函数进入了死循环,一直在执行定时器的回调函数
回复

使用道具 举报

12

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2014-10-21
在线时间
49 小时
发表于 2015-7-13 09:47:01 | 显示全部楼层
回复【4楼】ghqiloveu:
---------------------------------
定时器中不可以加OSTimeDly,你尝试着把 for(;;)改为 for(j=0;j<5000;j++)试试
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-7-6
在线时间
10 小时
 楼主| 发表于 2015-7-13 21:37:19 | 显示全部楼层
回复【9楼】jnfxt95:
---------------------------------
问题就在这,改完之后就好了。创建任务习惯了,写顺手了!还是jnfxt95 厉害,一眼就看出问题出在哪了,以后得多向高手学习啊!还希望多多指教!
回复

使用道具 举报

12

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2014-10-21
在线时间
49 小时
发表于 2015-7-15 16:14:44 | 显示全部楼层
回复【10楼】ghqiloveu:
---------------------------------
不是早给你说了吗,你的回调函数进入了死循环,也没有挂起当然就一直做这个任务了
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-7-6
在线时间
10 小时
 楼主| 发表于 2015-7-16 20:40:51 | 显示全部楼层
回复【11楼】lionmon:
---------------------------------
不好意思,没看到你上面的回复,站内信里只提示了最后一次的回复。
回复

使用道具 举报

12

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2014-10-21
在线时间
49 小时
发表于 2015-7-20 15:39:39 | 显示全部楼层
回复【12楼】ghqiloveu:
---------------------------------
额、、、其实我之前就是遇到这样的问题,找了一下午才知道哪里的问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 20:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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