嵌入式软件设计之逻辑控制

在嵌入式软件中,逻辑处理是最基本的操作,如何能使程序简洁清晰?如何能使程序高效运行?下面记录一点自己的心得。

1.基本的逻辑

逻辑的定义就必须是严谨准确的,一段好的逻辑程序应该能够消除歧义,不遗漏任何条件或者重复判断。if/else这种最简单的不用说了,如下程序考虑一个if/else if/else的示例。

if(A)
{
}
else if(B)
{
}
else if(C)
{
}
...
else
{
}

A、B、C的条件必须是无交叉的,确保判断的排他性。

正常情况的处理放在if或者else if中,常用情况的处理放在靠前的位置,else留到最后,可作为错误的处理等。组成else if的完整语句,else是必不可少的,往往在很多实际中有很多else if,强烈建议在最后加上else,即使逻辑已经处理完毕,在else中什么也不做,也应该留下一条空的语句。

对于复杂逻辑的简化处理,有德摩根定律、卡诺图等来辅助分析,就不细说了。

2.余数与倍数的应用

对于周期性的逻辑控制,余数和倍数就能很好的表示了。

考察一个题目,五个灯一排,按下键则顺次闪其中一个灯,利用取余则很好实现这个控制逻辑,逻辑控制如下:

int key=0;
void enter(){
    key++;
}
void control(key){
    key=key%5;
    if(key==1)
    {//turn on light 1
    }
    if(key==2)
    {//turn on light 2
    }
    if(key==3)
    {//turn on light 3
    }
    if(key==4)
    {//turn on light 4
    }
    else
    {//turn on light 5
    }
}

当然上面的实现方式有很多种,但是余数的使用体现了通过一次计算就可以对数进行分组的思想。在处理较大的数字分组时,余数就很有用了。考察题目:今天是周日,一年(365天)后是周几?

只需要365对7取余即可得出。取余结果0,1, 2,3,4,5,6 分别代表周日,周一,周二,周三,周四,周五,周六。365%7=1,因此结果是周一。

倍数的使用就比较简单了,考察一个二层的菜单操作,如何表征菜单状态呢?这里给一个简单的思路。

一级菜单使用0x100,0x200,0x400,0x800,0x100,···,二级菜单在其相应的一级菜单里面自加即可。这里可以有255个子项,需要增加的扩充位数就行,当然自加需要设定一个限定值。如此使用简单的&运算就可以确定菜单状态。

 

2.查表

    当有大量的else if时,程序看起来不简洁,维护也比较麻烦。这里考虑一种表的实现方法。

    考察题目一年中每个月份有多少天?

    一种常见的解决可以是:

int mouth ;
int days;

if(mouth=1)
    days=31;
else if(mouth=2)
    days=28;//暂时不考虑闰月
else if(mouth=3)
    days=31;
else if(mouth=4)
    days=30;
else if(mouth=5)
    days=31;
else if(mouth=6)
    days=30;
else if(mouth=7)
    days=31;
else if(mouth=8)
    days=31;
else if(mouth=9)
    days=30;
else if(mouth=10)
    days=31;
else if(mouth=11)
    days=30;
else if(mouth=12)
    days=31;
else
    ;

    实现这个功能,只需要创建一张表来解决。

int days;
int mouth;
int dayspermouth[]=
{31,28,31,30,31,30,31,31,30,31,30,31};
days=dayspermouth[mouth-1];

    用这种方法,考虑闰年也会比较简单,只需要将这张表改为二维的即可。

    当然在算法中表还可以有很多高级用法,这里暂时不讨论了。

发布了2 篇原创文章 · 获赞 0 · 访问量 48

猜你喜欢

转载自blog.csdn.net/huntenganwei/article/details/104200065