-
请问下,我已经加你了,麻烦同意允许!
-
这我知道啊!假如不用这个系统自带的延时函数,采用自己写的软件延时程序,任务只能等待延时完毕后,才会进行任务切换,这样岂不是浪费CPU,好像也会使得OSCPUUsage利用率提高,系统很容易崩溃,会跑飞的!
-
首先感谢你的回答,但是假如不用ucos系统的延时,那么一个任务获取CPU,运行完后会自动放弃CPU吗?能否给个QQ啊,讨论下,谢谢!我的QQ:724887638
-
接着分析。
系统从Task1让出CPU之后运行Task2中的代码100us,Task2再将CPU让给其他的任务,假设我系统中只有两个任务,那么系统在这个时候就只能调用空闲任务:OSTaskIdle()任务。前面说过,系统节拍定时器是1ms中断一次,系统节拍定时器调用OSTimeTick()函数遍历所有TCB块并更新TCB块中的OSTCBDly参数,若某个TCB中的OSTCBDly参数为0,则将该任务放入任务就绪列表,标志该任务延时结束并处于就绪状态。也就是说,这个时候离Task1就绪还有900个us,而我要求300us之后再次调用该任务,很明显,ARM处理器在OS_TICKS_PER_SEC = 1000的情况下是做不到的,那么怎么办呢,将该值加大,那么无非会增加系统的额外开销,这样做允许吗?系统能够正常运行吗?这个问题有待进一步探讨。
那么,像我目前这个项目,uC/OS-II很明显满足不了我的需求了??????
-
现我将Task2这个任务编写成如下代码,其优先级为4:
void Task2 (void *pvData)
{
pvData = pvData;
while (1) {
……
100us
……
OSTimeDly(2);
}
}
假如这个时候Task2已经就绪,那么CPU肯定是调用这个任务来运行。那么,CPU做完处理需要的时间是100us,之后调用OSTimeDly(2)让出CPU,那么这个时候系统会将该任务从TCB中删除,并将2(OSTimeDly(2)的参数)赋给TCB中的OSTCBDly参数,再调用OS_Sched()任务调度器将CPU让给其他的任务。问题来了,这个时候系统会调用Task1来运行吗?
我在群里的问题是,系统肯定是延时1ms之后再来调用Task2的,某些高手说,OSTimeDly(2)的参数是随便取的,我们不用管他。是,他说的是对的,只是他没有明白我说的意思,我要求任务在300us之后再调用Task1和Task2,
按照这样的话,系统并不能完成我的要求?????? 请高手指点啊!
-
现我将Task1这个任务编写成如下代码,其优先级为3:
void Task1 (void *pvData)
{
pvData = pvData;
while (1) {
……
200us
……
OSTimeDly(1);
}
}
比如说这个时候我将CPU分配给该任务,然后CPU做完处理需要的时间是200us,之后调用OSTimeDly(1)让出CPU,那么这个时候系统会将该任务从TCB中删除,并将1(OSTimeDly(1)的参数)赋给TCB中的OSTCBDly参数,再调用OS_Sched()任务调度器将CPU让给其他的任务,即Task2。