uCos串口打印被中断的问题

2019-07-14 20:21发布

各位烧友,请教一个问题,就是我在任务中调用uCOS的定时器实现周期延时的时候,定时器一被调用串口打印就被中断了,而且后面一直都不再打印了,搞得我调试的时候很不方便;但是如果我在Main函数中调用定时器,串口打印就不会被中断,是不是在任务中的时候发生了任务调度,但是定时器的优先级又很高,导致串口打印被中断了呢?
伪代码如下:
main
{
        1、SetFanCtlSpdDly(500,3);  //每隔3秒加一次风机速度,目标值500
        //此处是通过创建uCOS软件定时器实现,此处打印函数不会中断

        2、恢复风机延时调速任务
}


风机延时调速任务
{
        一分钟后SetFanCtlSpdDly(900,3);
        //此处任务中调用定时器时会停止打印
}

注:打印函数是在另一个任务中一直打印速度值
求指教^_^
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
小梨^大枣
2019-07-15 08:25
andy_wsj 发表于 2016-9-29 11:54
如果SetFanCtlSpdDly就是你说的定时器的话,那么打印任务的优先级可能较低,同样被SetFanCtlSpdDly延迟了,那要看你的SetFanCtlSpdDly怎么写的了,可以考虑用信号量来延时并解决释放CPU资源的问题

void SetFanCtlSpdDly(uint16_t i_u16ExpectSpdValue,uint8_t i_u8DelayTime)
{
    OS_ERR err;
   
    g_u16FanExpectCtlSpd = i_u16ExpectSpdValue;
    if(i_u8DelayTime > 0) {
        OSTmrCreate((OS_TMR *)&FanSpdCycleDlyTimeAdjustTmr,
                    (CPU_CHAR *)"fan Speed Cycle Delay Time Adjust Timer",
                    (OS_TICK)0,
                    (OS_TICK)i_u8DelayTime * OS_CFG_TMR_TASK_RATE_HZ,   
                    (OS_OPT)OS_OPT_TMR_PERIODIC,
                    (OS_TMR_CALLBACK_PTR)FanSpdAdjustDlyCallBack,
                    (void *)0,
                    (OS_ERR *)&err);

        if(err == OS_ERR_NONE) {
            OSTmrStart(&FanSpdCycleDlyTimeAdjustTmr, &err);
        }
    } else {
        SetFanCtlSpd(i_u16ExpectSpdValue);
    }

具体代码是这样的,当速度达到我期望的速度时就会在回调函数里面删掉定时器。我是在想定时器的优先级这么高,除了系统节拍任务不会有任务比他高了,那怎么保证在开定时器的时候打印任务不被中断哟?我试过吧锁调度器代码屏蔽了也不行,你说的那种方法能说的详细点么?好不好封装成函数啊

一周热门 更多>