| 
 
| 本帖最后由 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
 
 
 
 | 
 |