ucosII实时操作系统 实现--问答》》待续

来源:互联网 发布:ubuntu gcc下载 编辑:程序博客网 时间:2024/05/17 04:40

疑问:
1、何时发生调度?
2、怎么发生的调度?如何实现的,凭什么高优先级的任务到了,能够及时带走? 靠异常吗?
3、为什么从中断服务子程序出来后,可能会发生调度/切换?
4、μC/OS-Ⅱ任务调度所花的时间是常数,与应用程序中建立的任务数无关? 不相信是个常数。任务调度算法?定义?
5、近期弄得一个项目,加了些功能,结果频繁进入hard fault异常,结果找到两处根源。。擦–一处是:生命了一个全局文件指针,之前测试用着,整合程序时 少干掉了.fclose(file);另一处便是常见的任务栈分配少啦,512*4没够,有点陶醉–一怒之下–》1024*4 ,搞定,然而问题也来了,任务栈的分配?给谁使儿?用来确定以后如何估算任务栈的大小,然后再*1.5啥的,心里就妥妥的踏实啦。

带着疑问,查资料+找源码,
1、2、何时发生调度?

  • OSIntExit–OS_SchedNew
  • OSStart–OS_SchedNew
  • OS_Sched–OS_SchedNew
  • OSEventPendMulti–OS_Sched;以下都是OS_Sched–OS_SchedNew的调度
  • OSSchedUnlock
  • OSFlagDel
  • OSFlagPend
  • OSFlagPost
  • OSMboxDel
  • OSMboxPend
  • OSMboxPendAbort
  • OSMboxPost
  • OSMboxPostOpt
  • OSMutexDel
  • OSMutexPend
  • OSMutexPost
  • OSQDel
  • OSQPend
  • OSQPendAbort
  • OSQPost
  • OSQPostFront
  • OSQPostOpt
  • OSSemDel
  • OSSemPend
  • OSSemPendAbort
  • OSSemPost
  • OSTaskChangePrio
  • OSTaskCreate
  • OSTaskCreateExt
  • OSTaskDel
  • OSTaskResume
  • OSTaskSuspend
  • OSTimeDly
  • OSTimeDlyResume
    以上这些函数均会导致调度的发生,当然OSTimeDlyHMSM内部调用OSTimeDly的函数也在这个行列中。

ucosII操作系统,主要有以下几个任务调度时机:

  • 进程状态转换时刻,进程终止、睡眠时;
  • 可运行队列中增加一个进程时;
  • 内核处理完成后,由中断返回时;

任务调度依据:根据最高就绪优先级值OSPrioHighRdy在任务控制块数组OSTCBPrioTbl中找到最高就绪优先级任务OSTCBHighRdy,然后进行任务切换调度。
为了让任务主动让出CPU,在没有同步关系的任务中需要使用OSTimeDly进行延时以便任务切换。OSTimeDly通过调用任务切换函数OS_Sched切换任务。对于延时任务,其关键的处理在系统时钟中断处理函数OSTimeTick中。此函数每个时钟tick被调用一次,把延时的任务置为“非就绪”状态,并对任务延时时间进行计时。在OS_SchedNew中判断任务的优先级和最高任务优先级是否一致,如果一样,表示是一个任务,不调度。否则,就暂停当前任务而切换到高优先级任务。

3、为什么从中断服务子程序出来后,可能会发生调度/切换?
可能直接继续进行下一个中断服务程序,这不称为调度。

4、
任务调度:

0 0
原创粉丝点击