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