OpenEdv-开源电子网

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

ucos任务调度问题?

[复制链接]

52

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
691
金钱
691
注册时间
2014-9-7
在线时间
121 小时
发表于 2017-6-15 09:10:32 | 显示全部楼层 |阅读模式
我刚刚学ucos,发现一个疑问。有多个任务在运行,其中一个任务是屏幕显示,要消耗100ms的时间,期间没有中断,是不是一定要让这个100ms运行完,才能再一次进行任务调度。

还有一个问题,书上说中断返回后不是原来那个任务了,那如果100ms运行到一半后中断,返回中断后有更高优先级了,那显示任务是不是要等到高优先级任务运行完了再继续完成显示任务,那显示任务不是出问题了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-6-15 09:38:35 | 显示全部楼层
本帖最后由 zuozhongkai 于 2017-6-15 09:40 编辑

1、只要调用了可以引起任务切换的其它API函数都可以引起任务切换。比如你的显示任务,如果里面有调用UCOS的延时函数的话就会进行任务切换,不知道你说的这个100ms延时是单纯的用户应用程序运行时间,还是加上了这个延时。如果使用的UCOSIII的话每个系统时钟节拍都会进行任务切换,也就是每个systick中断都会进行任务切换。
2、如果你觉得的你的显示任务会出问题,那么这个就是临界区代码保护了。很简单,在你的显示任务中加上临界区代码保护,也就是关闭任务调度器,等显示任务运行完了以后在打开任务调度器。这样中断返回以后就不会切换到其它任务去了。

回复 支持 反对

使用道具 举报

52

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
691
金钱
691
注册时间
2014-9-7
在线时间
121 小时
 楼主| 发表于 2017-6-15 09:58:43 | 显示全部楼层
void SysTick_Handler(void)
{                                  
        OSIntEnter();                //½øèëÖD¶Ï
    OSTimeTick();       //μ÷óÃucosμÄê±Öó·tÎñ3ìDò               
    OSIntExit();        //′¥·¢èÎÎñÇD»»èíÖD¶Ï
}


void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    if (OSRunning == OS_TRUE) {
        OS_ENTER_CRITICAL();
        if (OSIntNesting > 0u) {                           /* Prevent OSIntNesting from wrapping       */
            OSIntNesting--;
        }
        if (OSIntNesting == 0u) {                          /* Reschedule only if all ISRs complete ... */
            if (OSLockNesting == 0u) {                     /* ... and not locked.                      */
                OS_SchedNew();
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
#if OS_TASK_PROFILE_EN > 0u
                    OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
#endif
                    OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */
                    OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
                }
            }
        }
        OS_EXIT_CRITICAL();
    }
}
这个是原子时钟节拍中断,里面是不是有任务调度
回复 支持 反对

使用道具 举报

39

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2016-4-21
在线时间
129 小时
发表于 2017-6-15 14:10:20 | 显示全部楼层
12778298 发表于 2017-6-15 09:58
void SysTick_Handler(void)
{                                  
        OSIntEnter();                //½øèëÖD¶Ï

有的,OSIntCtxSw(); 就是
本人交流群:136045527,欢迎各位大佬和萌新
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-2 02:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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