1、Fifo.h:
#include "stdarg.h"
……
#define FIFOSizeMax 50
#define FIFOFunPointerMax 10
typedef int32_t (*fifoproc)(int32_t argc,...);
typedef uint8_t DataType; /*FIFO的数据可以是特定的结构体*/
typedef __packed struct
{
uint8_t FifoDTR; /*Fifo设备类型*/
uint8_t pRD ; /*Fifo读指针pRD始终指在第一个有效元素的
uint8_t pWR ; /*Fifo写指针pWR始终指在下一个可以 DataType buff[FIFOSizeMax]; /*Fifo的数据缓存区*/
fifoproc proc[FIFOFunPointerMax]; /*Fifo的委托接口*/
}_s_vxdFIFO;
int32_t GetFifoNOE(int32_t argc, ...);
2、Fifo.c
#include “Fifo.h”
int32_t Fun(int32_t argc, ...)
{
uint8_t i;
va_list arg_ptr; //声明指向参数列表的Pointer
va_start(arg_ptr,argc); //arg_ptr为第一个可变参数列表的Pointer
printf("\n&argc = 0x%.8x \n",&argc);
printf("arg_ptr = 0x%.8x \n",arg_ptr);
for(i=0;i<argc;i++)
{
printf("Input %d para,0x%.8x = ",i,arg_ptr);
printf("( %d )\n",va_arg(arg_ptr,int32_t));
}
va_end(arg_ptr);
printf("agr_ptr = 0x%.8x \n",arg_ptr);
return 520;
}
3、main.c
ps2_Fifo.proc[0] = (fifoproc)GetFifoNOE; //初始化回调函数
retval = ps2_Fifo.proc[0](3,10,1,4);
printf("ps2_Fifo.proc[0] return value =%d\n",retval);
printf("ps2_Fifo Size = %d\n",sizeof(ps2_Fifo));
3.1函数入口参数传递到通用寄存器组,参数传入规则是由右至左;
3.2、压栈
3.3 函数返回
3.4 函数返回现象验证
3.5、验证