一种在单片机上实现多个软件定时功能的框架
2012-11-16 19:50
190 查看
标题似乎写得不大合适,不妨设想一个这样的需求场景:单片机程序一般有个大循环while(1),
在这个循环中处理所有中断以外的事情,这些事情需要被执行的周期各不一样,有些需要频繁地做
,有些需要很长时间才做一次。我们把这些事情记为T1,T5,T10 ,T200...
T表示task或者time吧,后面的数字表示执行周期,即T1表示此事情1秒执行一次,T2表示需要
2秒执行一次。。。碰到这种需求,我们会想要是有ucos就好了,要是有Linux就好了。
好在情况不是很复杂,事情需要的执行周期也不是很精准,任务之间的交互基本上也没有。
这里给出一个实现这样需求的模板:
首先需要一个定时器,单片机的硬件定时器,并使能中断,中断中只做两件件事:
uint8_t tick=0;
void timer_int(void)
{
1:重装初值 10ms
2:tick++;
}
在大循环中:
void main()
{
sys_init();
while(1){
tasks();
}
}
真正的工作在tacks中:
static uint8_t timer_1s = 0;
static uint8_t timer_5s = 5;
static uint8_t timer_10s = 2;
static uint8_t timer_100s = 10;
void tasks()
{
if(timer_1s < 100){
return;
}
disable_global_interrupts();
timer_1s = 0;
enable_global_interrupts();
//------- process per 1s --------//
tsk_1s();
sw_timer_dec(timer_5s );
if(timer_5s > 0){
return;
}
timer_1s = 5;
//------- process per 5s --------//
tsk_5s();
sw_timer_dec(timer_10s );
if(timer_10s > 0){
return;
}
timer_10s = 2;
//------- process per 5s --------//
tsk_10s();
......
}
void sw_timer_dec(uint8_t* timer)
{
if(*timer == 0){
return;
}
(*timer)--;
}
在这个循环中处理所有中断以外的事情,这些事情需要被执行的周期各不一样,有些需要频繁地做
,有些需要很长时间才做一次。我们把这些事情记为T1,T5,T10 ,T200...
T表示task或者time吧,后面的数字表示执行周期,即T1表示此事情1秒执行一次,T2表示需要
2秒执行一次。。。碰到这种需求,我们会想要是有ucos就好了,要是有Linux就好了。
好在情况不是很复杂,事情需要的执行周期也不是很精准,任务之间的交互基本上也没有。
这里给出一个实现这样需求的模板:
首先需要一个定时器,单片机的硬件定时器,并使能中断,中断中只做两件件事:
uint8_t tick=0;
void timer_int(void)
{
1:重装初值 10ms
2:tick++;
}
在大循环中:
void main()
{
sys_init();
while(1){
tasks();
}
}
真正的工作在tacks中:
static uint8_t timer_1s = 0;
static uint8_t timer_5s = 5;
static uint8_t timer_10s = 2;
static uint8_t timer_100s = 10;
void tasks()
{
if(timer_1s < 100){
return;
}
disable_global_interrupts();
timer_1s = 0;
enable_global_interrupts();
//------- process per 1s --------//
tsk_1s();
sw_timer_dec(timer_5s );
if(timer_5s > 0){
return;
}
timer_1s = 5;
//------- process per 5s --------//
tsk_5s();
sw_timer_dec(timer_10s );
if(timer_10s > 0){
return;
}
timer_10s = 2;
//------- process per 5s --------//
tsk_10s();
......
}
void sw_timer_dec(uint8_t* timer)
{
if(*timer == 0){
return;
}
(*timer)--;
}
相关文章推荐
- 单片机定时功能的实现
- 基于proteus的51单片机仿真实例七十七、使用555实现定时功能应用实例
- 一种互联网应用的分布式架构模式微服务应用框架的实现(gradle,dubbo,zookeeper,springmmvc)
- JFinal框架简单使用及增删查改分页功能实现
- STC89C52RC单片机实现串口打印功能
- andorid下实现定时发短信的功能
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
- 在Django框架下,用redis实现购物车功能
- Android换肤功能实现与换肤框架QSkinLoader使用方式介绍
- 在Spring Boot框架下使用WebSocket实现聊天功能
- 在Linux下用软件实现RAID功能
- MUI框架中实现附近搜索功能
- 基于.Net(C#开发)平台的三层框架架构软件的设计与实现
- VS2013写window服务,实现定时短信功能
- 使用服务程序实现PHP定时执行任务功能
- Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
- 实现定时发送邮件功能 数据是从数据库中获取到的
- Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
- Android后台定时提醒功能实现
- 自己写的日志框架--linkinLog4j--实现基本的框架功能