自行构建的“标志位”API

在STM32或者K60这些MCU上进行嵌入式开发时,经常需要用到“标志位”这个东西,它的作用往往是在执行控制时进行状态的切换(无论是有意或者无意)。在参加一些比赛后,我发现这类标志位的定义和使用要么显得过于凌乱,要么没有任何规范性可言。因此,趁着闲暇功夫,我就着手打算写一个API出来,将来在工程应用中可以直接将.c与.h文件加入工程,省去一切烦恼。

在使用标志位的过程中,对于其操作可以归纳创建标志位、设置标志位、重置标志位、取标志位的值四种操作。这里,我们暂时不考虑删除标志位。

我总共写了两个版本的API,各有优劣,要么较为费时,要么较为束缚,见仁见智吧。上代码:

#include <stdio.h>
#include <inttypes.h>

/***********JSP ©copyright***********/
/*******Version 1.0 2018.07.26*******/

typedef enum{
	Flag_1,
	Flag_2,
	Flag_3,
	Flag_4,
	Flag_5,
	Flag_6,
	Flag_7,
	Flag_8,
	Flag_9,
	Flag_10,
	Flag_11,
	Flag_12,
	Flag_13,
	Flag_14,
	Flag_15,
	Flag_16,
	Flag_17,
	Flag_18,
	Flag_19,
	Flag_20,
	Flag_21,
	Flag_22,
	Flag_23,
	Flag_24,
	Flag_25,
	Flag_26,
	Flag_27,
	Flag_28,
	Flag_29,
	Flag_30,
	Flag_31,
	Flag_32,
	Flag_MAX,
}Flag_e;

typedef enum{
	zero = 0x00000000,
	one = 0x00000001,
}Flag_Value_e;

static uint32_t FLAGS = 0x00000000;
static uint8_t FLAGS_COUNT = 0;

void Reset_All_Flags(void){
	FLAGS &= 0x00000000;
}

void Set_All_Flags(void){
	FLAGS |= 0xFFFFFFFF;
}

int Creat_Flag(Flag_e Flag_ID, Flag_Value_e init_value){
	if (FLAGS_COUNT >= 32){
		printf("All the flags has been used out!\r\n");
		return 0;
	}
	else if (Flag_ID >= Flag_MAX){
		printf("The flag ID is too big!\r\n");
		return 0;
	}
	else if (init_value != zero && init_value != one){
		printf("Initial value is not valid!\r\n");
		return 0;
	}
	else{
		FLAGS |= ((0x00000001 & init_value) << Flag_ID);
		FLAGS_COUNT++;
		return 1;
	}
}

int Set_Flag(Flag_e Flag_ID){
	if (Flag_ID >= Flag_MAX){
		printf("The flag ID is too big!\r\n");
		return 0;
	}
	else{
		FLAGS |= (0x00000001 << Flag_ID);
		return 1;
	}
}

int Reset_Flag(Flag_e Flag_ID){
	if (Flag_ID >= Flag_MAX){
		printf("The flag ID is too big!\r\n");
		return 0;
	}
	else{
		FLAGS &= ~(0x00000001 << Flag_ID);
		return 1;
	}
}

int Get_Flag(Flag_e Flag_ID){
	if (Flag_ID >= Flag_MAX){
		printf("The flag ID is too big!\r\n");
		return 0;
	}
	else if (((FLAGS >> Flag_ID) & 0x00000001)){
		return 1;
	}
	else{
		return 0;
	}
}

int main(void){
	Creat_Flag(Flag_1, one);
	Creat_Flag(Flag_5, zero);
	Creat_Flag(Flag_32, zero);
	Set_Flag(Flag_32);
	Reset_Flag(Flag_1);
	printf("%d  %d  %d\r\n", Get_Flag(Flag_1),
		Get_Flag(Flag_5), Get_Flag(Flag_32));
	return 0;
}
#include <stdio.h>

/***********JSP ©copyright***********/
/*******Version 2.0 2018.07.26*******/

#define MAX_FLAG_NUMBERS 50
static int FLAGS_COUNT = 0;

typedef struct{
	char *flag_name[MAX_FLAG_NUMBERS];
	int flag_value[MAX_FLAG_NUMBERS];
}Flag_t;
Flag_t flags;

int Make_Flag(char *flag_name, int flag_value){
	if (FLAGS_COUNT >= MAX_FLAG_NUMBERS){
		printf("All the flags has been used out!\r\nYou can increase the macro definition 'MAX_FLAG_NUMBERS'.\r\n");
		return 0;
	}
	else{
		flags.flag_name[FLAGS_COUNT] = flag_name;
		flags.flag_value[FLAGS_COUNT] = flag_value;
		FLAGS_COUNT++;
		return 1;
	}
}

int Set_Flag_Value(char *flag_name){
	int i = 0;
	for (i = 0; i < FLAGS_COUNT; i++){
		if (flags.flag_name[i] == flag_name){
			flags.flag_value[i] = 1;
			break;
		}
	}
	if (i < FLAGS_COUNT){
		return 1;
	}
	else{
		printf("Not find the flag you set, please check your flag name.\r\n");
		return 0;
	}
}

int Reset_Flag_Value(char *flag_name){
	int i = 0;
	for (i = 0; i < FLAGS_COUNT; i++){
		if (flags.flag_name[i] == flag_name){
			flags.flag_value[i] = 0;
			break;
		}
	}
	if (i < FLAGS_COUNT){
		return 1;
	}
	else{
		printf("Not find the flag you reset, please check your flag name.\r\n");
		return 0;
	}
}

int Get_Flag_Value(char *flag_name){
	int i = 0;
	for (i = 0; i < FLAGS_COUNT; i++){
		if (flags.flag_name[i] == flag_name){
			return flags.flag_value[i];
			break;
		}
	}
	if (i < FLAGS_COUNT){
		return 1;
	}
	else{
		printf("Not find the flag, please check your flag name.\r\n");
		return 0;
	}
}


int main(void){
	Make_Flag("flag_goback", 1);
	Make_Flag("flag_goforward", 1);
	Make_Flag("flag_stay", 1);
	printf("%s  %d  %s  %d  %s  %d\r\n", flags.flag_name[0], flags.flag_value[0], flags.flag_name[1], flags.flag_value[1],
		flags.flag_name[2], flags.flag_value[2]);
	Reset_Flag_Value("flag_goback"); Reset_Flag_Value("flag_goforward"); Reset_Flag_Value("flag_stay");
	printf("%s  %d  %s  %d  %s  %d\r\n", flags.flag_name[0], flags.flag_value[0], flags.flag_name[1], flags.flag_value[1],
		flags.flag_name[2], flags.flag_value[2]);
	Set_Flag_Value("flag_goback"); Set_Flag_Value("flag_goforward"); Set_Flag_Value("flag_stay");
	printf("%s  %d  %s  %d  %s  %d\r\n", flags.flag_name[0], flags.flag_value[0], flags.flag_name[1], flags.flag_value[1],
		flags.flag_name[2], flags.flag_value[2]);
	printf("%d %d %d\r\n", Get_Flag_Value("flag_goback"), Get_Flag_Value("flag_goforward"), Get_Flag_Value("flag_stay"));
	return 0;
}
发布了10 篇原创文章 · 获赞 8 · 访问量 4612

猜你喜欢

转载自blog.csdn.net/ICE_KoKi/article/details/81224957
今日推荐