列表 上一篇 下一篇

code中的逻辑判断

简介

如果代码中没有条件判断、循环或者任何其他的控制流语句(switch、sleep_on()、wakeup()、schedule()、INT、time_before()、mutex_lock()等等也算是控制流),那么它的可读性会很好。而跳转和分支等困难部分则会很快地让代码变得混乱。

从条件、循环说起

刚刚接触程序设计的时候,还以为if/else语句再难也就是多个if/else的嵌套,以为这都是小菜。还有for循环也是那样的简单。程序语言本身是很简单,但是用在不同的地方,分析程序本身要表达的意思就不那么简单了。就像基础的门电路原理很简单,但是分析一个集成电路就有难度了,更别说复杂的CPU。

即使弄清楚了程序中某处的if、while的逻辑,其背后用到的思想也不一定能意会到。

#define FLAG1 (1<<2) #define FLAG2 (1<<3) #define SET 1 void main() { int a,b; if(a==b);/*做一件事*/ else;/*做另一件事*/ if(a==1);/*做一件事*/ else;/*做另一件事*/ if(a==SET);/*做一件事*/ else;/*做另一件事*/ if(a);/*做一件事*/ else;/*做另一件事*/ if(!a);/*做一件事*/ else;/*做另一件事*/ if(a&(FLAG1|FLAG2)==SET);/*做一件事*/ else;/*做另一件事*/ if(a&(FLAG1|FLAG2));/*做一件事*/ else;/*做另一件事*/ if(!(a&(FLAG1|FLAG2)));/*做一件事*/ else;/*做另一件事*/ }

看看上面的代码,很简单,但是来挖掘一下起背后的思想吧。

条件的种类:

1.一个整数与另一个整数比较,a==b
2.一个整数与一个特殊的整数比较,这个整数就是1,a==1、a==SET或者a
3.几个位与一个特殊的整数比较,这个数就是1,a&(FLAG1|FLAG2)==SET或者a&(FLAG1|FLAG2)

从形式上要接受三种形式:
1.a==b、a==SET的形式,a等于b
2.a的形式,a等于1、a为真、a置位或者a信号到来
3.!a的形式,a不等于1、a为假、a没有置位、或者a信号没有到来

不同的角度:

1.一般的角度
2.位操作的角度,是否置位,控制状态机
3.信号量同步的角度,信号是否到来,控制状态机

关于信号量

信号量的两个用处:1.共享资源的互斥访问 2.同步操作
可以分别称为互斥信号量(同一个任务获取、释放)、同步信号量(一个任务释放,另一个任务获取)。另外需要注意同步信号量的两种形式:
1.while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
2.while (!(SDIO->STA & (SDIO_FLAG_DBCKEND | SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR)))