linux下的struct运用

一. struct 与 typedef struct的区别
typedef是C语言的关键字,作用在于为一种数据定义一个新名字。数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct类型等)。使结构体使用更加方便。

1.typedef定义时,声明变量可直接用 goio_stu stu1;(gpio_stu为gpio的别名)
typedef struct gpio
{
char type[10];
int time;
int delay_time;
int pin;
int io_modes;
int value;
}gpio_stu;
2.没有使用typedef定义时,声明变量就需要用stuct gpio gpiuo_stu ;(这里的gpio_stu是变量名)
struct gpio
{
char type[10];
int time;
int delay_time;
int pin;
int io_modes;
int value;
}gpio_stu;

二.在运行过程中动态分配内存 一定要使用对应的头文件#include <stdlib.h>
typedef struct gpio_stu
{
char type[10];
int time;
int delay_time;
int pin;
int io_modes;
int value;
}gpio_stu;
struct gpio_stu * gpio = NULL ;
gpio = (gpio_stu *) malloc(sizeof(gpio_stu) * (2 + MAXSIZE)) ; // (2 + MAXSIZE))是需要struct空间的个数

例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <ct_gpio.h>

int MAXSIZE ;//测多少个gpio
time_t start , end ;
/*******stuct 存数据/
typedef struct gpio_stu
{
char type[10];
int time;
int delay_time;
int pin;
int io_modes;
int value;
}gpio_stu;

struct gpio_stu * gpio = NULL ;
/***********************************读文件 ************************************/
void read_buff(char *fopen_gpio_txt)
{
FILE * fp = NULL ; // 定义文件指针:
int i ;
fp = fopen(fopen_gpio_txt, “r+”) ; // 打开文件
if(NULL == fp)
{
perror(""); //输出错误原因
return ;
}
for (i = 0 ;i<MAXSIZE+2; i++)
{
if( i == 0)
{
fscanf(fp , “%s” , gpio[i].type) ;
printf("--------------------------\n");
printf(“读取到的type为:%s\n” , gpio[i].type) ; //打印读到的type

        	continue ;
   		}
    	
		if(0 == strcmp("normal", gpio[i-1].type ))
    	{
        	fscanf(fp , "%d" , &gpio[i].time) ;
			printf("------------------------------\n");
	    	printf("读取到的time为:%d\n" , gpio[i].time) ;   //打印读到的time测试次数
        	continue ; 
    	}
		else if (0 == strcmp("special", gpio[i-1].type))
    		{
        		fscanf(fp , "%d",&gpio[i].delay_time) ;
	    		printf("读取到的delay_time为:%d\n" , gpio[i].delay_time) ;   //打印读到的delay_time测试时间
        		continue ; 
    		}
		/*else 
			{
				printf("type只能为'normal'or'speical'\n");	
				break ;				
			}
			*/
 	fscanf(fp,"%d %d %d",&gpio[i].pin,&gpio[i].io_modes,&gpio[i].value);
	printf("读取到的pin为:%d,读到的modes为:%d,读到的value为: %d,i:%d\n",gpio[i].pin,gpio[i].io_modes,gpio[i].value,i) ; 
	 
	if(feof(fp))
	{
		break ;
    }
	}

fclose(fp) ;  // 关闭文件

}
/错误值对应输出*************/
void compare_write(FILE * fp , int pins , int error ,int test)
{
char errors[30] ;
if(error == (0))
{
strcpy(errors , “无错误”) ;
}
else if(error == (-1))
{
strcpy(errors , “错误”) ;
}
else if(error == (-2))
{
strcpy(errors , “操作超时”) ;
}
else if(error == (-3))
{
strcpy(errors , “资源满”) ;
}
else if(error == (-4))
{
strcpy(errors , “资源空”) ;
}
else if(error == (-5))
{
strcpy(errors , “内存不足”) ;
}
else if(error == (-6))
{
strcpy(errors , “系统未启动”) ;
}
else if(error == (-7))
{
strcpy(errors , “忙”) ;
}
else if(error == (-8))
{
strcpy(errors , “IO错误”) ;
}
else if(error == (-9))
{
strcpy(errors , “参数列表太长”) ;
}
else if(error == (-10))
{
strcpy(errors , “权限被拒绝”) ;
}
else if(error == (-11))
{
strcpy(errors , “权限被拒绝”) ;
}
else if(error == (-12))
{
strcpy(errors , “魔数不匹配”) ;
}
else if(error == (-13))
{
strcpy(errors , “参数列表太短”) ;
}
else if(error == (-14))
{
strcpy(errors , “取消”) ;
}
else
{
strcpy(errors , “返回值未知”);
}

if (test == 0)
{
	fprintf(fp ,"pin = %d , Init = %s " , pins , &errors) ;  // 写Init
	printf ("pin = %d , Init = %s \n" , pins , &errors);
}
else if(test == 1)
{
    fprintf(fp ,"Set = %s/n " ,  &errors) ;  // 写Set
    printf("Set = %s " ,  &errors) ;
    fprintf(fp , "\n") ;
}
return ;

}
/开始测试************/
//int test_buff(char *fopen_result_txt)
void test_buff(FILE * fp)
{
int i , modes , pins , values ;
int j = 0 , test ;
int Init[MAXSIZE] , Set[MAXSIZE] , val[MAXSIZE] , Init_w[MAXSIZE] , Set_w[MAXSIZE] ;
//int pins_w[MAXSIZE] ;
//char Init_w[14] ;
//char Set_w[14] ;
for (i = 2 ; i < MAXSIZE+2 ; i++)
{
pins = gpio[i].pin;
values= gpio[i].value;
modes = gpio[i].io_modes;
printf(“modes=%d,values=%d,pins=%d\n”,modes,values,pins);
GPIO_MODE mode;
if (modes == 1)
{
mode = GPIO_MODE_IN_NOPULL ;浮空输入
}
else if(modes == 2)
{
mode = GPIO_MODE_IN_PULLUP ; //上拉输入
}
else if(modes == 3)
{
mode = GPIO_MODE_IN_PULLDOWN ; //下拉输入
}
else if(modes == 4)
{
mode = GPIO_MODE_OUT_PP ; //推挽输出
}
else if(modes == 5)
{
mode = GPIO_MODE_OUT_OD ;//开漏输出,不上拉
}
else if(modes == 6)
{
mode = GPIO_MODE_OUT_OD_PULLUP ;//开漏输出,内部弱上拉
}
Init[i-2] = gpioInit(pins , mode , 1); //平台GPIO初始化
Set[i-2] = gpioSet(pins , values); //设置输出模式的GPIO端口高/低电平
val[i-2] = gpioGet(pins); //获取输入模式的GPIO端口高/低电平值
printf (“Init = %d , Set = %d , val = %d”, Init[i-2] , Set[i-2] , val[i-2]) ;
if((values != val[i-2]) || (Init[i-2] != 0) || (Set[i-2] != 0) )
{
test = 0 ;
printf("----------------------------------------------------\n");
printf(“2pins = %d , val = %d , values=%d\n” , pins , val[i-2] , values) ;
Init_w[j] = Init[i-2] ;
compare_write(fp , pins , Init_w[j] , test) ;
Set_w[j] = Set[i-2] ;
test++ ;
compare_write(fp , pins , Set_w[j] , test) ;
j++ ;

	}

}
return;

}
/normal 模式*******************/
void measure_mode_times(FILE * fp)
{
int i , times ;
int timer = 50 * 1000 ; //延时50ms进行下一轮测试
times = gpio[1].time ;
printf(“measure_mode_times time=%d*******************************\n”,gpio[1].time) ;
for ( i = 0; i < times; i++)
{
fprintf(fp , “times=%d\n”,i+1) ;
test_buff(fp);
usleep(timer); //延时50ms
fprintf(fp , “\n”) ;
}
return 0 ;
}
/special 模式*************/
void measure_mode_timing(FILE * fp)
{
int i , delay_times , cost ;
int timer = 50 * 1000 ; //延时50ms进行下一轮测试
delay_times = gpio[1].delay_time ;
printf(“measure_mode_timing time=%d*******************************\n”,gpio[1].time) ;
for ( i = 0;; i++)
{
test_buff(fp);
usleep(timer); //延时50ms
fprintf(fp , “\n”) ;
time(&end);
//printf(“start=%d , end=%d\n”, start ,end);
cost = difftime(end,start);// double difftime(time_t time1, time_t time2) 返回 time1 和 time2 之间相差的秒数 (time1 - time2)
int cost_time = (int) cost ; //cost设置成整形
//printf(“cost_time=%d , delay_times=%d\n”, cost_time ,delay_times);
if (cost_time == delay_times)//
{
printf (“运行了%d秒\n”,cost_time);
break ;
}
}
return 0 ;
}
/main 函数**************/
int main(int argc, char *argv[])
{
MAXSIZE = atoi(argv[3]);
FILE * fp = NULL ;
char *fopen_gpio_txt ;
char *fopen_result_txt ;
time(&start);
// 在运行过程中动态分配内存
gpio = (gpio_stu *) malloc(sizeof(gpio_stu) * (2 + MAXSIZE)) ;

fopen_result_txt = argv[2];
fp = fopen(fopen_result_txt , "w+") ;  //打开文本
if(NULL == fp)
{
	printf("open fiil failed") ;
    return 0 ;
}
printf("--------------------------\n");
fopen_gpio_txt = argv[1];
printf("--------------------------\n");
read_buff(fopen_gpio_txt);
printf("--------------------------\n");
if(gpio[1].time !=0)
{
	measure_mode_times(fp) ; //normal模式
}
else
{
	measure_mode_timing(fp)	; //special模式(/s)
}

 
fclose(fp) ;  //关闭文件  
return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值