RXM简易框架代码

rxm.h文件

#ifndef __RX_M_H__
#define __RX_M_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//最大驱动数量
#define RXM_MAX_DRVCOUNT 		30

//放入到某个段
#define SECTION(x)                  __attribute__((section(x)))

//不被编译器优化
#define RX_USED                     __attribute__((used))

//初始化函数模板
typedef void (*init_fn_t)(void);


//-1失败,>=0成功
typedef struct 
{
	
	int (*rxm_r1)(int fd);//读函数,1个字节
	
	int (*rxm_w1)(int fd,int buf);//写函数
	
	int (*rxm_r)(int fd,void *buf,int len);//读函数
	
	int (*rxm_w)(int fd,void *buf,int len);//写函数
	
	int (*rxm_wr)(int fd,void *sendbuf,int sendlen,void *recbuf);//发送接受函数
	
	int (*rxm_ls)(int fd,int pos);//偏移
	
	int (*rxm_io)(int fd,int mode,int value);//模式控制
		
}rxm_drv;


///
//
//
//
//
//
//
//
//下面是导出函数



//加入初级初始化段的函数(驱动初始化)
#define DRV_INIT(fn) RX_USED const init_fn_t __rx_init_##fn SECTION(".drv.1.") = fn
//加入初级初始化段的函数(API初始化)
#define API_INIT(fn) RX_USED const init_fn_t __rx_init_##fn SECTION(".api.1.") = fn



//注册驱动R1
extern  int rxm_reg_r1(unsigned char fd,int (*func)(int fd));
//注册驱动W1
extern  int rxm_reg_w1(unsigned char fd,int (*func)(int fd,int buf));
//注册驱动R
extern  int rxm_reg_r(unsigned char fd,int (*func)(int fd,void *buf,int len));
//注册驱动W
extern  int rxm_reg_w(unsigned char fd,int (*func)(int fd,void *buf,int len));
//注册驱动WR
extern  int rxm_reg_wr(unsigned char fd,int (*func)(int fd,void *sendbuf,int sendlen,void *recbuf));
//注册驱动LS
extern  int rxm_reg_ls(unsigned char fd,int (*func)(int fd,int pos));
//注册驱动IO
extern  int rxm_reg_io(unsigned char fd,int (*func)(int fd,int mode,int value));



//读取设备1字节
extern int rxm_r1(unsigned char fd);
//写入设备1字节
extern int rxm_w1(unsigned char fd, int buf);
//读取设备
extern int rxm_r(unsigned char fd, void *buf, int nbytes);
//写入设备
extern int rxm_w(unsigned char fd, void *buf, int nbytes);
//发送接受
extern int rxm_wr(unsigned char fd, void *sendbuf,int sendlen,void *recbuf);
//写入偏移
extern int rxm_ls(unsigned char fd, int pos);
//写控制命令
extern int rxm_io(unsigned char fd,int mode, int value);




typedef struct 
{
	void (*func)(void);//函数指针
  unsigned short maxcount;//计算后的计数器数值
	unsigned short curcount;//当前计数器
}rxm_tim;



//定时器服务需要定时器10ms调用一次
void rxm_time_server(void);
//设置定时触发函数
extern int rxm_addtim(int time,void (*func)(void));
//硬件延时函数
extern void rxm_delay(int time);



typedef struct
{
	void*  base;//基地址
	char*  flag;//是否有数据基地址
	unsigned int unit_size;//队列元素大小
	unsigned int fifo_size;//队列大小
	unsigned int fifo_start;
	unsigned int fifo_end;
	unsigned int fifo_count;
}RXM_FIFO;


//创建一个队列
extern RXM_FIFO* Create_FIFO(int unitsize,int fifosize);

//压入一个数据
extern void PUSH_FIFO(RXM_FIFO* fifo,void* data);

//弹出一个数据
extern void* POP_FIFO(RXM_FIFO* fifo);

//获取队列的大小
extern unsigned int FIFO_Count(RXM_FIFO* fifo);


#endif

rxm.c文件


#include "rxm.h"


#define DRV_INIT_START(fn) RX_USED const init_fn_t __rx_init_##fn SECTION(".drv.0.end") = fn

#define DRV_INIT_END(fn) RX_USED const init_fn_t __rx_init_##fn SECTION(".drv.1.end") = fn

#define API_INIT_START(fn) RX_USED const init_fn_t __rx_init_##fn SECTION(".api.0.end") = fn

#define API_INIT_END(fn) RX_USED const init_fn_t __rx_init_##fn SECTION(".api.1.end") = fn

static void RxDrv_InitStart(void){}

static void RxDrv_InitEnd(void){}

DRV_INIT_START(RxDrv_InitStart);		

DRV_INIT_END(RxDrv_InitEnd);	

static void RxApi_InitStart(void){}

static void RxApi_InitEnd(void){}

API_INIT_START(RxApi_InitStart);		

API_INIT_END(RxApi_InitEnd);	


//初始化所有注册的驱动
void RxDrv_Init(void)
{
	const init_fn_t *fn_ptr;
	for (fn_ptr = &__rx_init_RxDrv_InitStart; fn_ptr <= &__rx_init_RxDrv_InitEnd; fn_ptr++)
	{
			(*fn_ptr)();
	}
}

//初始化所有注册的Api
void RxApi_Init(void)
{
	const init_fn_t *fn_ptr;
	for (fn_ptr = &__rx_init_RxApi_InitStart; fn_ptr <= &__rx_init_RxApi_InitEnd; fn_ptr++)
	{
			(*fn_ptr)();
	}
}


//驱动设备表
rxm_drv rxm_list[RXM_MAX_DRVCOUNT];



int rxm_reg_r1(unsigned char fd,int (*func)(int fd))
{
	if(fd<RXM_MAX_DRVCOUNT)
	{
			rxm_list[fd].rxm_r1=func;
			return fd;
	}
	return -1;
}

int rxm_reg_w1(unsigned char fd,int (*func)(int fd,int buf))
{
	if(fd<RXM_MAX_DRVCOUNT)
	{
			rxm_list[fd].rxm_w1=func;
			return fd;
	}
	return -1;
}


int rxm_reg_r(unsigned char fd,int (*func)(int fd,void *buf,int len))
{
	if(fd<RXM_MAX_DRVCOUNT)
	{
			rxm_list[fd].rxm_r=func;
			return fd;
	}
	return -1;
}

int rxm_reg_w(unsigned char fd,int (*func)(int fd,void *buf,int len))
{
	if(fd<RXM_MAX_DRVCOUNT)
	{
			rxm_list[fd].rxm_w=func;
			return fd;
	}
	return -1;
}


int rxm_reg_wr(unsigned char fd,int (*func)(int fd,void *sendbuf,int sendlen,void *recbuf))
{
	if(fd<RXM_MAX_DRVCOUNT)
	{
			rxm_list[fd].rxm_wr=func;
			return fd;
	}
	return -1;
	
}


int rxm_reg_ls(unsigned char fd,int (*func)(int fd,int pos))
{
	if(fd<RXM_MAX_DRVCOUNT)
	{
			rxm_list[fd].rxm_ls=func;
			return fd;
	}
	return -1;
}


int rxm_reg_io(unsigned char fd,int (*func)(int fd,int mode,int value))
{
	if(fd<RXM_MAX_DRVCOUNT)
	{
			rxm_list[fd].rxm_io=func;
			return fd;
	}
	return -1;
}




int rxm_r1(unsigned char fd)
{
	if(fd< RXM_MAX_DRVCOUNT)
	{
		if( rxm_list[fd].rxm_r1!=NULL)
		{
			return rxm_list[fd].rxm_r1(fd);
		}
	}
	return -1;
}


int rxm_w1(unsigned char fd, int buf)
{
	if(fd< RXM_MAX_DRVCOUNT)
	{
		if( rxm_list[fd].rxm_w1 !=NULL)
		{
			return rxm_list[fd].rxm_w1(fd,buf);
		}
	}
	return -1;
}


int rxm_r(unsigned char fd, void *buf, int nbytes)
{
	if(fd< RXM_MAX_DRVCOUNT)
	{
		if( rxm_list[fd].rxm_r !=NULL)
		{
			return rxm_list[fd].rxm_r(fd,buf,nbytes);
		}
	}
	return -1;
}


int rxm_w(unsigned char fd, void *buf, int nbytes)
{
	if(fd< RXM_MAX_DRVCOUNT)
	{
		if( rxm_list[fd].rxm_w !=NULL)
		{
			return rxm_list[fd].rxm_w(fd,buf,nbytes);
		}
	}
	return -1;
}


int rxm_wr(unsigned char fd, void *sendbuf,int sendlen,void *recbuf)
{
	if(fd< RXM_MAX_DRVCOUNT)
	{
		if( rxm_list[fd].rxm_wr !=NULL)
		{
			return rxm_list[fd].rxm_wr(fd,sendbuf,sendlen,recbuf);
		}
	}
	return -1;
}


int rxm_ls(unsigned char fd, int pos)
{
	if(fd< RXM_MAX_DRVCOUNT)
	{
		if( rxm_list[fd].rxm_ls !=NULL)
		{
			return rxm_list[fd].rxm_ls(fd,pos);
		}
	}
	return -1;
}


int rxm_io(unsigned char fd,int mode, int value)
{
	if(fd< RXM_MAX_DRVCOUNT)
	{
		if( rxm_list[fd].rxm_io !=NULL)
		{
			return rxm_list[fd].rxm_io(fd,mode,value);
		}
	}
	return -1;
}



//定时触发函数
rxm_tim tim[RXM_MAX_DRVCOUNT];
//当前定时触发函数数量
int timcount=0;

//立即触发函数
rxm_tim timzero[RXM_MAX_DRVCOUNT];
int timezerocount=0;


int dcount=0;

//定时器服务
void rxm_time_server(void)
{
	int i=0;
	for(i=0;i<timcount;i++)
	{
		if(tim[i].curcount>0)
		{
			tim[i].curcount--;
		}
	}
	
	if(dcount>0)
	{
		dcount--;
	}
	
}


//注册定时触发
int rxm_addtim(int time,void (*func)(void))
{ 
	if(timcount<10)
	{
		if(func!=NULL)
		{
			if(time==0)
			{
				timzero[timezerocount].func=func;
				timzero[timezerocount].maxcount=0;
				timzero[timezerocount].curcount=0;
				timezerocount++;
			}
			else
			{
				tim[timcount].func=func;
				tim[timcount].maxcount=time/10;
				tim[timcount].curcount=time/10;
				timcount++;
			}
			return 0;
		}
	}
	return -1;
}


void Init_Tim()
{
	int i=0;
		//初始化定时函数结构体
	for(i=0;i<RXM_MAX_DRVCOUNT;i++)
	{
		tim[i].curcount=0xFFFF;
		timzero[i].curcount=0xFFFF;
	}
}

void rxm_delay(int time)
{
	dcount=time/10;
	while(dcount>0);
}

int main(void)
{
	int i=0;
	Init_Tim();
	RxDrv_Init();
	RxApi_Init();

	for (;;)
	{
		
		//立即触发函数
		for(i=0;i<timezerocount;i++)
		{
				timzero[i].func();//触发函数
		}
		
		//延时触发函数
		for(i=0;i<timcount;i++)
		{
			if(tim[i].curcount==0)
			{
				tim[i].curcount=tim[i].maxcount;
				tim[i].func();//触发函数
			}
		}
		
	}
}




RXM_FIFO* Create_FIFO(int unitsize,int fifosize)
{
	void* dataspace =(void*)malloc(unitsize*fifosize);
	char* flagspace =(char*)malloc(fifosize);
	RXM_FIFO* fifo =(void*)malloc(sizeof(RXM_FIFO));
	
	memset(dataspace,0,unitsize*fifosize);
	memset(flagspace,0,fifosize);
	memset(fifo,0,sizeof(RXM_FIFO));
	
	fifo->base=dataspace;
	fifo->flag=flagspace;
	fifo->fifo_start=0;
	fifo->fifo_end=0;
	fifo->fifo_size=fifosize;
	fifo->unit_size=unitsize;
	fifo->fifo_count=0;
	return fifo;
}


void PUSH_FIFO(RXM_FIFO* fifo,void* data)
{
	if(fifo!=NULL)
	{
		unsigned char* fifodata = fifo->base;
		char* flagdata = fifo->flag;
		int end =fifo->fifo_end;
		
		if(flagdata[end]==0)
		{
			flagdata[end]=1;
			fifodata=fifodata+fifo->fifo_end*fifo->unit_size;
			memcpy(fifodata,data,fifo->unit_size);
			
			if(end<(fifo->fifo_size-1))
			{
				end++;
			}
			else
			{
				end=0;
			}
			fifo->fifo_end=end;
			fifo->fifo_count++;
		}
	}
}

void* POP_FIFO(RXM_FIFO* fifo)
{
	static unsigned char data[256];
	if(fifo!=NULL)
	{
		unsigned char* fifodata = fifo->base;
		char* flagdata = fifo->flag;
		int start =fifo->fifo_start;
		
		if(flagdata[start]==1)
		{
			flagdata[start]=0;
			fifodata=fifodata+fifo->fifo_start*fifo->unit_size;
			memcpy(data,fifodata,fifo->unit_size);
			
			if(start<(fifo->fifo_size-1))
			{
				start++;
			}
			else
			{
				start=0;
			}
			fifo->fifo_start=start;
			fifo->fifo_count--;
			return data;
		}
	}
	return NULL;
}

unsigned int FIFO_Count(RXM_FIFO* fifo)
{
	if(fifo!=NULL)
	{
		return fifo->fifo_count;
	}
	return 0;
}




posted @ 2022-05-08 20:08  大高玩子  阅读(69)  评论(0编辑  收藏  举报