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;
}

浙公網安備 33010602011771號