完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我刚刚学ucos,发现一个疑问。有多个任务在运行,其中一个任务是屏幕显示,要消耗100ms的时间,期间没有中断,是不是一定要让这个100ms运行完,才能再一次进行任务调度。
还有一个问题,书上说中断返回后不是原来那个任务了,那如果100ms运行到一半后中断,返回中断后有更高优先级了,那显示任务是不是要等到高优先级任务运行完了再继续完成显示任务,那显示任务不是出问题了 |
|
相关推荐
3个回答
|
|
1、只要调用了可以引起任务切换的其它API函数都可以引起任务切换。比如你的显示任务,如果里面有调用UCOS的延时函数的话就会进行任务切换,不知道你说的这个100ms延时是单纯的用户应用程序运行时间,还是加上了这个延时。如果使用的UCOSIII的话每个系统时钟节拍都会进行任务切换,也就是每个systick中断都会进行任务切换。
2、如果你觉得的你的显示任务会出问题,那么这个就是临界区代码保护了。很简单,在你的显示任务中加上临界区代码保护,也就是关闭任务调度器,等显示任务运行完了以后在打开任务调度器。这样中断返回以后就不会切换到其它任务去了。 |
|
|
|
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(); } } 这个是原子时钟节拍中断,里面是不是有任务调度 |
|
|
|
有的,OSIntCtxSw(); 就是
|
|
|
|
只有小组成员才能发言,加入小组>>
692 浏览 0 评论
1106 浏览 1 评论
2473 浏览 5 评论
2808 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2646 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
653浏览 9评论
649浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
781浏览 6评论
628浏览 5评论
668浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 07:02 , Processed in 0.974227 second(s), Total 82, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号