C语言实现一个简单的多定时任务功能模块

一.简介

在项目开发中,很多功能模块都会用到定时功能,比如说定时3分钟后点亮一个led灯,定时1个小时后自动关机等,如果项目中只用到了一个应用层级别的定时功能,可能简单的写一下就好了,但是当项目中有多个定时功能需求的话,反而是把定时功能单独拿出来,写成一个功能模块,更简单更清晰。

二.功能实现

创建TimSet.c,TimSet.h,在TimSet.h文件中声明需要用的数据类型,及声明外部文件调用要用的api函数,在TimSet.c中实现api接口函数

2.1在头文件中定义数据类型

//枚举用到定时功能的模块,根据自己需求定义
typedef enum
{
	TSM_HEAT,//加热定时功能
	TSM_SAFE,//安全工作时间定时功能
	//...
	NUM_TSM
}EM_TIMSETMOUDLE;


//枚举定时功能的不同状态
typedef enum
{
    TIMSETSTA_STOP,
	TIMSETSTA_PASUSE,
    TIMSETSTA_RUN,
	TIMSETSTA_END
}EM_TIMSETSTA;


//定义触发定时到达处理函数时的触发方式
#define TSHTYPE_TIMOVER 1 //到达设定时间后触发处理函数
#define TSHTYPE_INTERRUPT 2 //未到达设定时间,中间人为打断

//定义函数指针类型
typedef void (*pFun)(uint8_t);


//定义处理结构体
typedef struct
{    
    pFun handleFun; //定义定时到达后的处理函数
    
    EM_TIMSETSTA curSta;
    EM_TIMSETSTA lastSta;  
    
    unsigned long clkTarget; //秒定时计数

    unsigned long tarTime;  //预计定时时间
    unsigned long timeCnt;     //定时计数器   
}ST_TIMSETDATA;

2.2在头文件中声明api接口函数

//初始化指定功能模块,指定其处理函数
void TimSet_InitOne(EM_TIMSETMOUDLE tarMoudle,pFun handleFun);

//总初始化函数
void TimSet_InitAll(void);

//启动某个具体模块定时功能
void TimSet_Start(EM_TIMSETMOUDLE tarMoudle,unsigned long seconds);

//停止某
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我可以提供一个例子: #include <stdio.h> int main() { int i, j; for(i=0;i<10;i++) { printf("Hello World!\n"); for(j=0;j<i;j++) { printf("\t"); } } return 0; } ### 回答2: C语言嵌入式代码架构是用于实现嵌入式系统功能的程序结构。它的设计目的是使代码组织清晰,易于维护和扩展。以下是一个简单的C语言嵌入式代码架构: 1. 头文件部分:在头文件中定义常量、宏、全局变量和函数原型等。头文件可以分为系统头文件和自定义头文件。系统头文件包括标准库和硬件相关的头文件,自定义头文件则定义嵌入式系统所需要的结构和函数。 2. 主函数部分:程序的入口函数是主函数,它包含了初始化和任务调度等功能。在主函数中,可以设置时钟、端口、中断和外设的配置。然后,创建任务和启动任务调度器。 3. 任务部分:在任务部分,定义各个任务的函数。每个任务都有自己的优先级和周期。任务功能可以根据需求来定义,例如读取传感器数据、处理数据、控制执行器等。任务的执行可以使用定时器、中断或者操作系统的任务调度器。 4. 中断服务程序(ISR)部分:在中断服务程序部分,实现各个中断的处理函数。中断可以是硬件中断,例如定时器中断、外部中断,也可以是软件中断,例如定时中断。中断服务程序通常只需要做最基本的处理,并尽快返回。 5. 驱动部分:在驱动部分,实现与硬件相关的函数。例如,GPIO、ADC、UART等外设驱动都可以在此部分实现。驱动程序负责与硬件进行交互,提供高层的接口给上层的任务调用。 6. 辅助函数部分:在辅助函数部分,定义一些通用的函数,用于辅助任务实现。这些函数可以是数学运算、字符串处理、数据结构等。 以上是简单的C语言嵌入式代码架构。实际的代码架构可能会更加复杂,根据具体的嵌入式系统的要求来设计。重要的是代码的组织结构清晰,易于理解和维护。 ### 回答3: C语言嵌入式代码架构一般包括主控制模块、外设驱动模块和应用程序模块三部分。 主控制模块负责系统的初始化和主循环的调度。在初始化过程中,会对所需的硬件资源进行初始化配置,例如中断向量表、系统时钟、GPIO等。然后进入主循环中,通过轮询或中断方式获取各种外设的状态,并根据需要执行相应的操作。 外设驱动模块负责对各种外设进行初始化和控制。每个外设驱动模块通常由硬件抽象层和驱动程序组成。硬件抽象层包括对硬件资源的定义和管理,例如寄存器映射和相关寄存器的操作函数。驱动程序则负责根据硬件抽象层提供的接口实现对外设的访问和操作,如读取传感器数据、控制执行器的运动等。 应用程序模块是整个嵌入式系统的功能实现部分,包括各种功能模块和业务逻辑。应用程序模块可以根据系统需求进行划分,每个功能模块负责一个具体的功能任务。例如,可以有通信模块负责与其他设备通信,传感器模块负责采集传感器数据,控制模块负责对执行器进行控制等。 在代码架构中,通常会使用模块化编程的方式来实现。每个模块具有独立的接口和功能,通过模块间的接口进行信息交互和协作。这样可以提高代码的可维护性和可重用性,方便对代码进行扩展和调试。 总而言之,C语言嵌入式代码架构包括主控制模块、外设驱动模块和应用程序模块三个主要部分,每个部分有不同的职责和功能。通过模块化编程和合理的接口设计,可以实现代码的高效管理和功能扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值