|
本帖最后由 Gorgon_Meducer 于 2013-1-8 12:49 编辑
延时函数也要用状态机来写:软件延时还是定时器延时都无所谓的,都有具体写法。
对于延时,其实不推荐写成函数来调用,而推荐做成资源,我记得我有一个很老的帖子里面有提到过,具体接口是这样的:
1、有一个申请延时的函数request_delay(),然后把延时时间传递进去,这个函数会返回一个句柄
2、如果句柄有效,则可以通过is_time_out()函数利用传入的句柄来查询是否所需的延时已经到时间了
可以看出,这个接口是把延时当成后台资源的,这并不难做,用一个定时器维护一个计数器就可以做到。并且非常适合
状态机环境使用。但是需要注意的是,句柄是有生命周期的,一旦一个句柄代表的延时到达时间了,或者说timeout了,
则查询的过程会自动注销这个句柄。
你可以自己根据这个思路来设计下这种结构,如果有问题,我找找看能不能找到过去的那个代码……
厄……居然找到代码了……单击这里下载
下面是接口部分的定义——貌似是我2年前的风格……呵呵……凑合着用吧
- #ifndef _USE_MULTI_DELAY_H_
- #define _USE_MULTI_DELAY_H_
- /*-----------------------------*
- * include head files *
- *----------------------------*/
- #include "..\..\..\utils\compiler.h"
- #include "Multi-Delay_cfg.h"
- /*-----------------------------*
- * Macros for constants *
- *----------------------------*/
- /*-----------------------------*
- * Macros for others *
- *----------------------------*/
- /*-----------------------------*
- * type definitions *
- *----------------------------*/
- typedef enum DelayState
- {
- DELAY_DOWN_COUNTING,
- DELAY_TIME_OUT,
- DELAY_ERROR
- }ES_DELAY_STATE;
- /*-----------------------------*
- * public functions prototypes*
- *----------------------------*/
- extern void MutiDelay_INIT(void);
- extern uint16_t Add_Delay_Item(uint16_t hwTime);
- extern ES_DELAY_STATE If_Time_Out(uint16_t hwDHandl);
- extern void Cancel_Delay_Item(uint16_t hwDHandl);
- #endif
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|