本帖最后由 373290948 于 2015-5-1 16:49 编辑
UCOSII系统时钟相关函数:
1.OSTimeDly( ) //系统节拍延时函数
void OSTimeDly ( INT16U ticks);
所属文件 调用者 开关量
OS_TIMC.C 只能是任务 无
OSTimeDly()将一个任务延时若干个时钟节拍。如果延时时间大于0,系统将立即进行任
务调度。延时时间的长度可从0 到65535 个时钟节拍。延时时间0 表示不进行延时,函数将
立即返回调用者。延时的具体时间依赖于系统每秒钟有多少时钟节拍(由文件SO_CFG.H 中
的常量OS_TICKS_PER_SEC 设定)。
参数
ticks 为要延时的时钟节拍数。
返回值
无
注意/警告
注意到延时时间 0 表示不进行延时操作,而立即返回调用者。为了确保设定的延时时间,建
议用户设定的时钟节拍数加1。例如,希望延时10 个时钟节拍,可设定参数为11。
范例:
void TaskX(void *pdata)
{
for (;;) {
.
.
OSTimeDly(10); /* 任务延时10个时钟节拍 */
.
.
}
}
2.OSTimeDlyHMSM( )//系统节拍时分秒延时函数
void OSTimeDlyHMSM( INT8U hours,INT8U minutes,INT8U seconds,INT8U milli);
所属文件 调用者 开关量
OS_TIMC.C 只能是任务 无
OSTimeDlyHMSM()将一个任务延时若干时间。延时的单位是小时、分、秒、毫秒。所以
使用OSTimeDlyHMSM()比OSTimeDly()更方便。调用OSTimeDlyHMSM()后,如果
延时时间不为0,系统将立即进行任务调度。
参数
hours 为延时小时数,范围从0-255。
minutes 为延时分钟数,范围从0-59。
seconds 为延时秒数,范围从0-59
milli 为延时毫秒数,范围从0-999。需要说明的是,延时操作函数都是以时钟节拍为为单位
的。实际的延时时间是时钟节拍的整数倍。例如系统每次时钟节拍间隔是10ms,如果设定延
时为5ms,将不产生任何延时操作,而设定延时15ms,实际的延时是两个时钟节拍,也就是
20ms。
返回值
OSTimeDlyHMSM()的返回值为下述之一:
OS_NO_ERR:函数调用成功。
OS_TIME_INVALID_MINUTES:参数错误,分钟数大于59。
OS_TIME_INVALID_SECONDS:参数错误,秒数大于59。
OS_TIME_INVALID_MILLI:参数错误,毫秒数大于999。
OS_TIME_ZERO_DLY:四个参数全为0。
注意/警告
OSTimeDlyHMSM(0,0,0,0)表示不进行延时操作,而立即返回调用者。另外,如果延
时总时间超过65535 个时钟节拍,将不能用OSTimeDlyResume()函数终止延时并唤醒任务。
范例:
void TaskX(void *pdata)
{
for (;;) {
.
OSTimeDlyHMSM(0, 0, 1, 0); /* 任务延时 1 秒 */
.
.
}
}
3.OSTimeDlyResume( ) //系统节拍延时任务恢复函数
void OSTimeDlyResume( INT8U prio);
所属文件 调用者 开关量
OS_TIMC.C 只能是任务 无
OSTimeDlyResume()唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数延时的任务。
参数
prio 为指定要唤醒任务的优先级。
返回值
OSTimeDlyResume()的返回值为下述之一:
OS_NO_ERR:函数调用成功。
OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO。
OS_TIME_NOT_DLY:要唤醒的任务不在延时状态。
OS_TASK_NOT_EXIST:指定的任务不存在。
注意/警告
用户不应该用 OSTimeDlyResume()去唤醒一个设置了等待超时操作,并且正在等待事件发
生的任务。操作的结果是使该任务结束等待,除非的确希望这么做。
OSTimeDlyResume()函数不能唤醒一个用OSTimeDlyHMSM()延时,且延时时间总计超
过65535 个时钟节拍的任务。例如,如果系统时钟为100Hz,OSTimeDlyResume()不能唤
醒延时OSTimeDlyHMSM(0,10,55,350)或更长时间的任务。
(OSTimeDlyHMSM(0,10,55,350)共延时 [ 10 minutes *60 + (55+0.35)seconds ]
*100 =65,535 次时钟节拍------译者注)
范例:
void TaskX(void *pdata)
{
INT8U err;
pdata = pdata;
for (;;) {
err = OSTimeDlyResume(10); /* 唤醒优先级为10的任务 */
if (err == OS_NO_ERR) {
. /* 任务被唤醒 */
}
}
}
4.OSTimeGet( ) //系统节拍获取函数
INT32U OSTimeGet (void);
所属文件 调用者 开关量
OS_TIMC.C 任务或中断 无
OSTimeGet()获取当前系统时钟数值。系统时钟是一个32 位的计数器,记录系统上电后或
时钟重新设置后的时钟计数。
参数
无。
返回值
当前时钟计数(时钟节拍数)。
注意/警告
无
范例:
void TaskX(void *pdata)
{
INT32U clk;
for (;;) {
.
.
clk = OSTimeGet(); /* 获取当前系统时钟的值 */
.
.
}
}
5.OSTimeSet( ) //系统节拍设置函数
void OSTimeSet (INT32U ticks);
所属文件 调用者 开关量
OS_TIMC.C 任务或中断 无
OSTimeSet()设置当前系统时钟数值。系统时钟是一个32 位的计数器,记录系统上电后或
时钟重新设置后的时钟计数。
参数
ticks 要设置的时钟数,单位是时钟节拍数。
返回值
无。
注意/警告
无
范例:
void TaskX(void *pdata)
{
for (;;) {
.
.
OSTimeSet(0L); /* 复位系统时钟 */
.
.
}
}
6.OSTimeTick( ) //系统节拍检测函数
void OSTimeTick (void);
所属文件 调用者 开关量
OS_TIMC.C 任务或中断 无
每次时钟节拍,μC/OS-II 都将执行OSTimeTick()函数。OSTimeTick()检查处于延时状
态的任务是否达到延时时间(用OSTimeDly()或OSTimeDlyHMSM()函数延时),或正
在等待事件的任务是否超时。
参数:
无。
返回值:
无。
注意/警告:
OSTimeTick()的运行时间和系统中的任务数直接相关,在任务或中断中都可以调用。如果
在任务中调用,任务的优先级应该很高(优先级数字很小),这是因为OSTimeTick()负责
所有任务的延时操作。
范例:(Intel 80x86,实模式)
TickISRPROC FAR
PUSHA ; 保存CPU寄存器内容
PUSH ES
PUSH DS
;
INC BYTE PTR _OSIntNesting ; 标识C/OS-II进入中断处理程序
CALL FAR PTR _OSTimeTick ; 调用时钟节拍处理函数
. ; 用户代码清除中断标志
.
CALL FAR PTR _OSIntExit ; 标识C/OS-II退出中断处理程序
POP DS ; 恢复CPU寄存器内容
POP ES
POPA
;
IRET ; 中断返回
TickISRENDP
|