CAFrame单片机程序框架

CAFrame是一个适用于8位单片机的C语言程序框架,它采用事件驱动方式简化应用逻辑,将硬件驱动与应用逻辑分离。框架由3个头文件和3个源文件组成,驱动程序在中断中处理硬件,应用逻辑在APP_LEVEL运行。定时器和输入事件是框架的固定事件类型,通用事件由用户自定义。在配置文件中定义事件ID,驱动中断中触发事件,应用层安装事件处理函数。定时任务用于分步操作,通过定时器和延时处理实现复杂的控制流程。

简介

CAFrame 单片机C语言程序开发框架可用于不同的单片机,尤其适合8位小系统的软件开发。 框架将硬件驱动和应用逻辑的实现分开, 以事件驱动的方式编写应用程序, 从而使得应用功能的编写就如同VB6程序那样简单易维护。 框架程序共由三个头文件(CAFrame.h Cfg.h Driver.h)和三个源文件(Driver.c Frame.c App.c) 组成 ,其层次结构如图:

在这里插入图片描述

Driver.c中的代码用于处理与硬件相关的底层驱动,Driver.h文件中声明与硬件相关的一些符号定义和用户自定义驱动函数的声明
驱动程序的编写主要通过修改这两个文件来实现.
CAFrame.h是框架标准符号、结构、函数的声明处,Frame.c是框架的实现文件,无论任何时候都不应该修改这两个文件。
注意: CAFrame.h文件中声明的以[drv_]为前缀的函数是框架所必须的驱动接口函数,这些函数在driver.c中必须实现.
App.c是应用逻辑实现文件,文件需要实现一个固定的函数InitApp,此函数在框架初始化后第一个被调用,在这个函数中设置好所有需要的事件处理函数。作为一个完整的app.c文件,下面的示例说明了开发者需要做些什么

 	#include "CAFrame.h"
 	void TimerEvent(void)//定时器事件处理函数
 	{
   
   
 		LED_FLASH;
 	}
 	void InitApp(void)
 	{
   
   
 		frm_install_timer_event(0,200,TimerEvent);//安装0号定时器事件处理函数,定时触发周期为200ms
 	}

程序运行优先级

CAFrame并非是一个操作系统,而是一个典型的前后台程序结构,程序运行优先级只有中断级(INT_LEVEL)和应用级(APP_LEVEL). driver.c中一部分硬件驱动程序在中断中调用,它们工作在INT_LEVEL级,但这些对于APP来说是透明的,无需考虑的, 所有的接口函数以及用户代码(app.c)均运行在同一个优先级(APP_LEVEL),为此用户程序不会相互中断。

CAFrame配置

CAFrame的配置十分简单,Cfg.h文件中TIMER_MAX_COUNT是指定在APP中用到的最大定时器个数,INPUT_MAX_COUNT是系统输入口个数 EVENT_MAX_COUNT为通用事件ID个数。下面的“通用事件ID定义列表中”列出所用到的所有通用事件ID,值从0递增,但要保证小于EVENT_MAX_COUNT.

	#define	MANAGE_MAIN	1		//主程序托管
	
	//支持定时器个数,在应用程序中定时器编号从0开始小于此值
	#define TIMER_MAX_COUNT	4							//定时器个数
	
	#define INPUT_MAX_COUNT 2							//输入口个数
	
	#define EVENT_MAX_COUNT 2							//通用事件个数
	
	//通用事件ID定义列表
	#define EVENT_ADC_ID 0		
	#define EVENT_UART_ID 1
MANAGE_MAIN 的值决定整个项目入口函数(main)是否托管给框架,如果值是1,就等于用户无需实现main函数,将main函数托管给了框架。
如果MANAGE_MAIN定义为0,称为非托管应用,需要在用户程序中实现一个如下的main函数:
	int main(void)
	{
   
   
		CAFrameInit();//框架初始化
		
		while(1)
		{
   
   
			//..   //主循环中的其它任务
			
			CAFramePoll();	//框架循环
		}
		return 0;
	}	

通用事件应用

事件是框架中驱动层与应用层同步的主要方式,框架支持三种事件,分别是定时器事件、输入事件和通用事件,定时器事件和输入事件是框架固定的
特殊事件,而通用事件是用户编写外设驱动与应用层同步的主要方式,如UART,ADC的中断中可以通过通用事件的方式在应用层触发事件。通用事件运行原理如图: \n
在这里插入图片描述
首先需要在配置文件(cfg.h)中定义事件ID,如

	#define EVENT_UART_ID 1

然后在驱动中断中触发事件:

	ISR
	{
   
   
		...
		frm_set_event(EVENT_UART_ID);
		...
	}

如果在InitApp函数中已经用frm_install_event安装了事件处理函数,那么中断中一触发这个事件,
框架会在中断结束后在后台(APP_LEVEL级)调用事件处理函数。

开关输入接口

开关输入处理方式有两种

事件驱动方式

示例如下(app.c):

	<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值