C语言表驱动法在定时任务列表中的应用

简介: C语言表驱动法在定时任务列表中的应用

640.jpg

在嵌入式软件开发中,如果存在硬件定时器不足以支撑软件运行的时候,软件定时器的实现就显得十分有必要了。函数指针可以用于定时任务列表的创建和使用。在这种情况下,对系统的输入是时间的流逝。许多项目无法证明使用实时操作系统的合理性。相反,所需要的只是以预定的时间间隔运行许多任务。这种处理非常简单,如下所示:

typedef struct
{
   int interval;      
   void (*proc)(void); 
} timer_task;
static const timer_task timer_handler_task[] = 
{
    { INTERVAL_16_MSEC,  fnA }, 
    { INTERVAL_50_MSEC,  fnB }, 
    { INTERVAL_500_MSEC, fnC },
    ...
    { 0, NULL }
};
extern volatile int tick;
void main(void)
{
    const timer_task *ptr;
    int time;
    while (1) 
    {
       if (tick) 
       {
            tick--;
            time = computeElapsedTime(tick);
            for (ptr = timer_handler_task; ptr->interval != 0; ptr++)
            {
                if (!(time % ptr->interval))
                    (ptr->proc)(); 
            }
       }
    }
}

在以上例子中,我们定义了自己的数据类型(timer_task),它仅由一个间隔和一个指向函数的指针组成。然后定义一个timer_task类型的结构体数组timer_handler_task,并使用将要调用的函数列表及其调用间隔对其进行初始化。在main函数中,我们有启动代码,它必须启用一个周期性的计时器中断,该中断以固定的间隔增加易失性变量tick。然后我们进入无限循环。


while循环中检查非零刻度值,递减刻度变量并计算自程序开始运行以来经过的时间。然后代码简单地遍历每个任务,查看是否已经执行到该任务的时间,如果是,则通过函数指针调用它。


如果你的项目仅包含两个或三个任务,那么应用这个方法就有点大材小用了。但是,如果你的项目有大量定时任务,或者将来可能需要添加其它的任务,那么这种方法是非常不错的。在这里我们要注意的是,一旦你有新的需求,你只需要修改timer_handler_task这个数组的内容就可以了,而主循环中的代码不必更改。

往期精彩

表驱动+状态机法AD传感器驱动检测框架


C语言表驱动法编程实践(精华帖,建议收藏并实践)


回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?


手把手教你在STM32上实现OLED视频播放(很简单也很硬很肝!)


一些值得被定义为常用C语言头文件库的漂亮宏定义(值得收藏,以备使用参考)

目录
相关文章
|
29天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
60 4
ly~
|
1月前
|
网络协议 算法 关系型数据库
C语言的应用
C 语言因其高效性和对硬件的直接访问能力,在多个领域有广泛应用。在系统软件领域,它被用于开发操作系统(如 Unix 和 Linux 的内核)和嵌入式系统(如汽车电子控制系统)。在游戏开发中,C 语言常用于构建游戏引擎的底层部分(如 Unity 和 Unreal Engine 的核心模块)及性能要求高的独立游戏。此外,C 语言也用于数据库管理系统(如 MySQL 和 PostgreSQL 的核心功能)和网络编程(如 TCP/IP 协议栈和网络服务器的核心模块)。
ly~
33 3
|
1月前
|
Java Unix Linux
1.3 C语言的应用范围
C语言自20世纪80年代以来一直是主流编程语言,适用于小型计算机、个人电脑及大型机。因其高效紧凑且易于修改和移植,广泛用于软件开发。尽管后来C++和JAVA流行起来,但C语言仍然是软件行业核心,并在嵌入式系统、科学编程和操作系统开发如Linux中扮演重要角色。即使到现在,掌握C语言仍是一项重要技能。不是必须得是计算机专家才能使用C语言,学习C语言同时也能学到很多C++的知识。
49 8
|
5月前
|
编译器 C语言 C++
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
54 0
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
2月前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
3月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
3月前
|
编译器 C语言
C语言中的浮点数:深入探索与应用
C语言中的浮点数:深入探索与应用
137 1
|
3月前
|
程序员 C语言
位操作在C语言中的解析与应用
位操作在C语言中的解析与应用
90 0
|
3月前
|
程序员 编译器 C语言
C语言中的预处理指令及其实际应用
C语言中的预处理指令及其实际应用
86 0