硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1981|回复: 7
收起左侧

[μCOS-II] uC/OS-II,低优先级任务霸占了CPU控制权,但为何高优先级的任务还在运行呢?

[复制链接]

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2019-2-28 10:32:05 | 显示全部楼层 |阅读模式
任务19负责处理485通信事务,我做了个指令通过485读取任务栈的工作情况,这个指令的代码如下:
void PrintKernelStackStatus(void)
{        
    OS_TCB       *pTcb;                                                            //定义一个任务控制块指针
    OS_STK_DATA  sStackStatus;                                                  //用于读取任务栈使用情况
        
    pTcb = &OSTCBTbl[0];                                                    //指向第1个任务控制块
        
    TX485();
    usDelay(20);
   
    sMyUart2.txNum   = 0;
    sMyUart2.txTotal = 47;
    memcpy(sMyUart2.txBuf, "=============================================\r\n", 47);
    USART_ITConfig(USART2, USART_IT_TC, ENABLE);
    while(sMyUart2.txNum < sMyUart2.txTotal);
    usDelay(2000);
   
    TX485();
    usDelay(20);
   
    sMyUart2.txNum   = 0;
    sMyUart2.txTotal = 40;
    memcpy(sMyUart2.txBuf, "优先级  栈使用  栈剩余  百分比  任务名\r\n", 40);
    USART_ITConfig(USART2, USART_IT_TC, ENABLE);
    while(sMyUart2.txNum < sMyUart2.txTotal);
    usDelay(2000);
   
    TX485();
    usDelay(20);
   
    sMyUart2.txNum   = 0;
    sMyUart2.txTotal = 47;
    memcpy(sMyUart2.txBuf, "=============================================\r\n", 47);
    USART_ITConfig(USART2, USART_IT_TC, ENABLE);
    while(sMyUart2.txNum < sMyUart2.txTotal);
    usDelay(2000);
        
    while(pTcb != NULL)
    {
        memset(sMyUart2.txBuf, 0, 160);
      
        //获得任务栈空间使用情况
        OSTaskStkChk(pTcb->OSTCBPrio, &sStackStatus);   
        
        sprintf((char *)sMyUart2.txBuf,
                "%03d     %03d     %03d     %02d%%     %s\r\n",
                pTcb->OSTCBPrio,
        sStackStatus.OSUsed,
                sStackStatus.OSFree,
                ((sStackStatus.OSUsed * 100)/(sStackStatus.OSUsed + sStackStatus.OSFree)) + 1,
        pTcb->OSTCBTaskName);   

        TX485();
        usDelay(20);   
        
        sMyUart2.txNum = 0;
        sMyUart2.txTotal = strlen((char *)sMyUart2.txBuf);
     
        USART_ITConfig(USART2, USART_IT_TC, ENABLE);
   
        while(sMyUart2.txNum < sMyUart2.txTotal);
        usDelay(2000);
        
        //指向上一个任务控制块
        pTcb = pTcb->OSTCBPrev;                    
    }
}

我用的波特率是1200,这个函数需要运行4.3秒的时间,从上面的源代码看,函数里面一直是独占CPU的控制权的,按说这时候所有其它任务都应该是被挂起了,但是我发现在这4.3秒的时间里,所有的高优先级任务确实还在运行,那么这里唯一的可能性就是在485发送数据的时候发生串口中断,在退出中断的时候进行了任务切换,难道真的是这样吗?


回复

使用道具 举报

0

主题

105

回帖

105

积分

初级会员

积分
105
发表于 2019-2-28 11:51:12 | 显示全部楼层
抢占式运行的。高级任务需要执行的时候就切换到高级任务了。
切换原因一般是systick中断、信号之类的,看高级任务在等待什么。
回复

使用道具 举报

8

主题

42

回帖

71

积分

初级会员

积分
71
发表于 2019-2-28 12:49:21 | 显示全部楼层
taobaofarmer 发表于 2019-2-28 12:29
乱说,人家不释放CPU的控制权你等啥有用

实时操作系统就是这样的,高优先级任务可抢占低优先级,不行可以换成非实时OS
回复

使用道具 举报

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2019-2-28 13:34:25 | 显示全部楼层
控制权不是低优先级任务释放后高优先级任务才能运行,而是高优先级任务直接就可以把控制权抢到手,自己用完的再释放;就像中断抢占main程序的执行权一样
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2019-3-2 22:34:45 | 显示全部楼层
因为系统心跳里会检测高级任务是不是在等待某个信号量或者邮箱 它的执行时间到了等等,在这里就会执行切换到高优先级任务的操作。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2019-3-2 22:36:28 | 显示全部楼层
同志,你把ucoss源码看一遍就明白了
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
 楼主| 发表于 2019-3-3 10:20:21 | 显示全部楼层
楼上已经看明白源码了吧
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2019-3-4 12:37:01 | 显示全部楼层
是的                       
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 00:25 , Processed in 0.212480 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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