ostimedly延时多少,ucosOSTimeDly 在延时的过程中CPU在干吗
来源:整理 编辑:亚灵电子网 2023-08-02 07:58:38
1,ucosOSTimeDly 在延时的过程中CPU在干吗
OSTimeDly(OS_TICKS_PER_SEC*9)在延时的过程中CPU在干吗?CPU的行为取决于你这个function的实现是什么,这个函数是否会引起调度,或者这个函数就只是一个while loop来检查timer 模块是否已经跑到了你设置进去的值(OS_TICKS_PER_SEC*9)。
2,UCOSII如何实现微妙级别的延时
把宏OS_TICKS_PER_SEC改成1000000我先回答你后面的问题:ostimedly()最小延时多长?这个最小的延时准确来说是小于等于一个ucos的系统节拍。至于多少秒,需要看你的ucos工作的节拍时长是多长(参见宏os_ticks_per_sec,它的值意思就是1秒钟有多少个系统节拍,比如这个值是1000,那么你的系统节拍就是1/1000s);如何实现微妙级别的延时?在ucos上基本是不可能实现这么高精度的延时的,如果你不介意高频率切换任务带来的cpu浪费,你当然可以把它的节拍调到微妙级别以下,然后通过ostimedly来获得这个延时。最可靠的实现方法是使用硬件定时器来获得这个高精度的延时。另外如果你真的考虑把时钟节拍调到微妙级来实现高精度延时,我建议你最好把节拍调到100ns,因为ucos的延时计算也有个精度问题,他的误差波动在1个时钟节拍内,也就是说你需要把节拍调到100ns后,其误差(≤0.1us)才会显得可以忽略掉(相对于1us)
3,OSTimeDlyHMSM 源代码是什么
OSTimeDlyHMSM
UC/OS-II的延时函数,
函数声明为:INT8U OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);
功能:
调用OSTimeDlyHMSM()函数会使UC/OS-Ⅱ进行一次任务调度,并且执行下一个处于就绪态的优先级最高的任务。
例如:整个程序执行过程中系统只有两个就绪任务A和B优先级分别为0、1,任务A中调用OSTimeDlyHMSM(时间T1)函数后任务A会立即被挂起,任务B执行T1时间后再执行任务A。或者在延时时间T1未完时任务B通过调用 OSTimeDlyResume()取消了延时(取消延时后B任务应执行完后)去执行任务A。
若任务AB同时调用OSTimeDlyHMSM函数,任务A,B将会交替延时。
注意写OSTimeDly()函数的区别。
调用OSTimeDly()函数,用户可以通过定义全局常数 OS_TICKS_PER_SEC(参看 OS_CFG.H)的方法将延时的时间转换成时钟段

4,关于ucos中OSTimeDly的问题
void main (void) OSInit();...... OSTaskCreate(Task, (void *)0, (void *)&TaskStk[0][0], 10); OSTaskCreate(Task1, (void *)0, (void *)&TaskStk[1][0], 12); ...... OSStart();}void Task1(void *data) UBYTE x1;x1=x1; for (; *LED0 =1; OSTimeDly(3); /*从Task切换到此处,该任务也进入等待态,只有空闲任务运行 ,在3个时钟周期后, Task被重新调度运行,所以LED不是没灭,只是时间很短; */ }} void Task (void *data) for (; *LED0 =0; OSTimeDly(3); /*由于此任务优先级高,所以首先运行,当运行到此处,进入等待态,此时Task1运行,并且在Task1中LED0被马上修改为1,所以LED0灭的时间与任务切换时间相等,所以如果修改为OSTimeDly(6),则在Task运行完之后Task1不马上运行,即可*/ }}
5,如何理解ucos的实时ostimedlyhmsm
1、你调用OSTimeDly或者OSTimeDlyHMSM,意味着该任务CPU使用权会被没收,然而你开启一个定时器之后,该任务还可以使用CPU。2、举例子:如下情景,可以使用定时器作超时处理,设备A管理设备B、C、E,设备A向设备BCE设备发送某一消息,如果在T时间内,设备BCE没有回应,设备A将重起并初始化BCE;那么可以在一个任务中,依次向BCE发送消息,并且启动动定时器TMRa,TMRb,TMRc,定时器时间到时调用各自的重起并初始化函数;另一方面,如果接收到BCE的消息则停止定时器TMRa,TMRb,TMRc。3、然而如果用OSTimeDly或者OSTimeDlyHMSM处理上面的场景,可能要多开几个任务管理BCE并增加信号量通知OSTimeDly或者OSTimeDlyHMSM之后,到底是“重起并初始化BCE”还是什么都不做。4、定时器和延时都是基于“系统的节拍”来计时/定时的,虽然定时器是在一个高优先级的任务中管理,这个任务也是由“系统节拍中断“中向其发送信号量,因此还是基于“系统的节拍”。5、没必要去对它们的区别做出一个定义,关键还是去理解它们的应用场合,它们都能解决什么问题。可以检查你的中断里面是不是有耗时的操作导致os 时基不准!
文章TAG:
ostimedly延时多少延时 多少 过程