执行操作时候只执行一次的标志位逻辑实现(C语言)

155 阅读1分钟

\

背景说明

在做stm32的时候,使用的是前后台的裸机逻辑,没有使用实际的操作系统,而在while循环中,获取到上位机的指令后,需要进行相应的操作,实现操作很简单,但是要保证得到该指令后只能执行一次相应的操作,这就需要使用一个标志位来实现这个功能加以保证,虽然逻辑简单,但是在我初次接触嵌入式和C语音的时候也花了一番力气。借此掘金的征文比赛,予以记录。

实现逻辑

解析中在接收到上位机的指令后,执行操作,处置标志位flag 执行循环中,通过read_Auto_value_flag保证执行一次EEPROM操作。执行一次后就置为1

代码实例

下面是以按键控制的操作中,保证eeprom设备只读写一次的操作。

//1————————进入图像自动模式设置

if(KEY4_count==2)

               {
                        Q1=1;

                        if(KEY1_flag)//+

                        {
                                 read_Auto_value_flag= 0;
                                 //标志位处置0

                                 L1++;

                                 if(L1>2)

                                    L1=0;

                        }

                        if(KEY2_flag)//-

                        {
                                 read_Auto_value_flag= 0;

                                 L1--;

                                 if(L1<0)

                                           L1=2;

                        }       

                        if (L1>2)

                                    L1=0;

                        if(L1<0)

                                           L1=2;

                                                   

                        if(0== read_Auto_value_flag)

                        {
                                 read_Auto_value_flag= 1;
                                   //标志位处置1


                                 EEPROM_DataBuff[0]= L1;//自动 0、1、2对应值1、2、3???

                                 EEPROM_WriteBuffer(AUTO_VAL,EEPROM_DataBuff,1);      //一次将多个参数保存

                                 delay_ms(50);

                                 IR_ReadParameter_EEPROM();

                                

                                 if(L1==1)

                                           SetCameraValue(11,10,1);//发送亮度优化

                                 else

                                           SetCameraValue(11,10,3);//直方图

                                 delay_ms(50);

                                

                                 if(L3==255)

                                 {
                                           SetCameraValue1(1,4,0xfe);//增益

                                 }else

                                 {
                                           SetCameraValue1(1,4,L3);//增益

                                 }

                                 delay_ms(50);

                                                            

                                 if(L1!= 1)

                                 {                                   

                                           if(L4== 255)

                                           {
                                                    SetCameraValue1(0,5,0xfe);//亮度

                                           }else

                                           {
                                                    SetCameraValue1(0,5,L4);//亮度

                                           }

                                           delay_ms(50); 

                                 }

                                

                        }                                                      

                        KEY1_count=0;

                        KEY2_count=0;                           

               }