<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      嵌入式工具集

      嵌入式工具集

      Modbus協議生成器

      --
      暫無記錄

      Modbus CRC16 計算器

      等待計算...

      32位Bit位選擇器

      0

      16進制計算器

      等待計算...

      電阻計算器

      并聯: --
      串聯: --

      字節序轉換工具

      大端: --
      小端: --

      進制/編碼轉換工具

      --
      --
      --
      --

      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  大高玩子  閱讀(82)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲一区成人av在线| 亚洲国产精品一区二区第一页| 久久一区二区中文字幕| 国产精品国产三级国快看| 伊人激情一区二区三区av| 久久精品娱乐亚洲领先| 成人天堂资源www在线| 国产精品天天看天天狠| 中文字幕少妇人妻精品| 波多野结衣一区二区三区高清av | 99久久无色码中文字幕| 香港日本三级亚洲三级| 国产av一区二区不卡| 国产玖玖玖玖精品电影| 日韩av一区二区三区在线| 亚洲精品韩国一区二区| 91亚洲国产成人久久精| 野花在线观看免费观看高清| 亚洲日韩久热中文字幕| 人妻加勒比系列无码专区| 99er热精品视频| 桃花岛亚洲成在人线AV| 国产精品小视频一区二页| 日本久久久免费高清| 国产中文字幕精品视频| 天天躁夜夜躁天干天干2020| av资源在线看免费观看| 欧美成人精品手机在线| 精品日韩色国产在线观看| 九九热视频在线免费观看| 国产成人午夜福利院| 久久精品国产亚洲av品| 午夜激情福利一区二区| 四虎永久精品免费视频| 亚洲码与欧洲码区别入口| 亚洲国产色播AV在线| 人妻日韩人妻中文字幕| 日韩精品一区二区av在线| 久久久久人妻精品一区三寸| 欧美三级中文字幕在线观看 | 亚洲一区二区三区自拍麻豆|