ZKX's LAB

ucos ii 任务控制块 ucos ii是怎么实现多任务运行的?

2020-07-27知识16

在ucos II中各个任务的调度时间(就是多久运行一次任务)是在哪里设置的?我看使用的时候会在任务中添加一 OS_CFG.h中define OS_TICKS_PER_SEC 100/*Set the number of ticks in one second*/上面这句是操作系统每秒调度次数普通任务的运行周期要靠延时函数OSTimeDly()和OSTimeDlyHMSM()实现ucos-ii 不能进行任务切换 存在4个问题,修改就可以了(1)主要是在OSStart();前面缺少下列语句,系统老的时钟中断无任务切换功能:OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);Install uC/OS-II's clock tick ISR*/PC_SetTickRate(OS_TICKS_PER_SEC);Reprogram tick rate*/OS_EXIT_CRITICAL();(2)printf()是DOS服务,不可重入,必须改成可重入的函数,如PC_DispStr()函数,或者写为OS_ENTER_CRITICAL();printf(\"this is App_one,prio=10,Delay 6 second and start again\\n\\n\");OS_EXIT_CRITICAL();等就可以了。原来的系统自带的那几个test程序,就都没有使用printf()函数。(3)另外OSTimeDlyHMSM(0,0,0,3000)是不允许的,要写为OSTimeDlyHMSM(0,0,3,0);否则认为OSTimeDlyHMSM()参数无效而忽略,任务App_one不延时而长期循环,不切换。(4)因为prio=10,20,30,所以OS_CFG.H中要至少定义define OS_LOWEST_PRIO 32否则某些低优先级任务被认为无效,不参与切换。ucos ii 为什么要在OSStart()之前最少创建一个任务?任务怎样才能进入就绪状态的?是由什么条件触发的吗? 因为OSStart()要启动最高优先级的就绪任务,所以必须要至少创建一个任务,任务要进入就绪状态的话有多种方式,比如说任务的延时时间到了,或者获得一个信号量,这些触发条件是要看你如何去编程控制的,建议你可以去看看UCOS相关的书,钟常慰注释的ucos也很不错的ucos-ii操作系统可以允许后台运行多个任务,而每个任务都是无限循环的,内核是如何调度的, 每个嵌入式操作系统都会牵扯到这个问题。任务调度通俗的讲就是操作系统分配每个任务的运行时间,协调他们的工作。对于每个任务来说,编程者可以认为只有它占用CPU,故而可以写成无限循环的形式,在这个循环中加入系统延时(或请求消息、事件等),当任务运行到系统延时这条语句不会傻傻的等待,而是转而处理其他的任务。操作系统记住了延时时间,当时间到时如果这个任务就绪再引发一次调度,执行本任务,也就是延时之后的程序。操作系统是怎么知道哪个任务应该运行,哪个任务需要等待,哪个任务需要消息的呢?不管哪个操作系统,都要有一个任务控制块,这个控制块要标明任务的优先级、任务的入口地址,并且给任务分别堆栈等。堆栈其实就是保存任务运行信息的,比如在哪个地方调用了系统延时,当系统调度给这个任务运行时就能找到在什么地方运行了。找本ucOS的书看,然后读代码,能很快理解。学习任何一门知识都要扎实,这种问题书上讲解的很清楚,不要上来就问,这不是学习的好态度。祝你好运~

#嵌入式系统#优先级#ucos

随机阅读

qrcode
访问手机版