- #ifndef _APP_CLK_
- #define _APP_CLK_
- #define CLK_TASK_MAX_NUM 10 //时钟任务最大数量,不可定义过大
- typedef unsigned char a_size_t; //如果延迟时间不够,将数据类型改为uint16_t
- typedef void (* a_cb_t)(void );
- typedef struct
- {
- a_cb_t clk_cb;
- a_size_t delay;
- a_size_t peroid;
- }app_clk_t;
- typedef enum
- {
- CONSTRUCT_FAULT,
- CONSTRUCT_SUC,
-
- CALLBACK_REPEAT = (unsigned char) 0xff
- }status_t;
- /*******************************************************************************
- **函数功能: 创建一个软件系统时钟
- **输入参数: clk - 用户定义的时钟实例
- **
- ** clk_cb - 要定期执行的回调函数,该函数由用户定义
- **
- ** dly - 创建时钟后,延迟多久执行相应的clk_cb。具体dly延时多久取决
- ** app_clk_scheduler()的定时间隔。假如app_clk_scheduler()的
- ** 定时间隔1ms,dly = 100,则clk_cb延迟100ms后执行
- **
- ** peroid - 间隔period后再次运行clk_cb.当peroid=0, 表示clk_cb只执行
- ** 一次,当peroid!=0,clk_cb永远执行,具体peroid的取值同dly
- **
- ** run_flag - 如果创建完成后立刻运行则 - TRUE
- ** 如果创建完成后不要立刻运行 - FALSE
- **输出参数: status_t - 如果创建成功 - CONSTRUCT_SUC
- ** - 如果创建失败 - CONSTRUCT_FAULT
- *******************************************************************************/
- status_t app_construct_clk(app_clk_t *clk, a_cb_t clk_cb, a_size_t dly, a_size_t period, unsigned char run_flag);
- /*******************************************************************************
- **函数功能: 软件系统时钟调度,该函数调用间隔决定了用户的定时函数最少间隔多久
- ** 执行一次
- **
- **输入参数: 空
- **输出参数: 空
- *******************************************************************************/
- void app_clk_scheduler(void );
- /*******************************************************************************
- **函数功能: 启动定时函数
- **
- **输入参数: clk - 用户定义的时钟实例
- **
- **输出参数: 空
- *******************************************************************************/
- void app_clk_start(app_clk_t *clk);
- /*******************************************************************************
- **函数功能: 停止定时函数
- **
- **输入参数: clk - 用户定义的时钟实例
- **
- **输出参数:
- *******************************************************************************/
- void app_clk_stop(app_clk_t *clk);
- #endif
#include “app_clk.h”
app_clk_t test_handle;
unsigned char clk100us_flag,clk100us;
//硬件定时器中断,中断间隔100us
void interrupt_timer(void )
{
clk100us_flag = 1;
}
void test_led(void )
{
//取反LED
}
main()
{
/*
初始化一个硬件定时器,定时器定时为100us(当然,这个值你随你自己定)
*/
timer_init();
/*
初始化一个软件定时器test_led,第一个100表示100ms后test_led开始运行, 第二个100指的是test_led每隔100ms运行一次,如果这个值设置为0,
则test_led只在100ms后运行一次,TRUE表示初始化完成时test_led开始运行,如果是FALSE,初始化完成后,test_led不立即运行,而是通过
app_clk_start(&test_handle)手动启动test_led
*/
app_construct_clk(&test_handle, test_led,100,100,TRUE);
while(1)
{
if(clk100us_flag)
{
clk100us_flag= 0;
if(++clk100us >= 10 )
{
clk100us = 0;
app_clk_scheduler(); //软时钟调度
}
}
}
}
爱因斯坦曾说过“科学理论应该尽可能简单,但是不能过于太简单”,有时候简单也不失为一种美,当然,没有哪一种方法是能适应任何场合的,
还是那句话,只有合适的,没有最好的。
这次先把这个软件定时器代码发出来,后续再写一篇基于这个软件定时器的编程方法,希望也能对你有点作用。
源码: