打印

算法赏析:一个“时间到空间“的算法

[复制链接]
2367|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
highgear|  楼主 | 2009-5-14 23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此程序号称用“裸奔“无法作出来。


冷漠 发表于 2009-3-31 11:36
/*


**  AT89S52

**  此程序是循环花样显示LED灯

**  有三个显示样式,分别对应下面的三个进程

**  下面的算法中用到了“时间到空间”的转换,使得算法简化不少

**  此程序我已在最小系统板上试验通过。

*/

#include <reg51.h>

#include <rtx51tny.h>


const unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80

                                               ,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xFF,0x00};

/*时间到空间的转换,如果table是:

const unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

则算法和代码会多出一倍来。table数组虽然增加了一倍,算法也随之减少了一半,

好处当然不止在这里体现,下面的进程2也减少了一半*/


//进程0 左->右->左

void LED0 (void) _task_ 0

{

     int i;

     os_create_task(1);//创建进程1

     //os_create_task(2);//创建进程2

     while(1)

     {

            for (i = 0; i < 15; i++) 

            {

                      P1 = ~table;

                   os_wait2(K_TMO,10);//等待30*10000微妙 = 0.3秒

            }

            os_send_signal(1);    //发送Signal信号,激活进程1

            os_wait1(K_SIG);   //等待信号

     }

}


//进程1 全亮->全灭->全亮

void LED1 (void) _task_ 1

{

     int i;

     while(1)

     {

            os_wait(K_SIG,0,0);

            for (i = 0; i < 3; i++)

            {

                      P1 = ~table[15];   //全亮

                   os_wait2(K_TMO,10);

                   P1 =~table[16];       //全灭

                   os_wait(K_TMO,10,0);

            }

         os_send_signal(0);

     }

}


//进程2 两边->中间中间->两边

void LED2 (void) _task_ 2

{

     int i;

     while(1)

     {

            os_wait(K_SIG,0,0);

            for (i = 0; i < 8; i++)

            {

                   P1 =~(table |table[i+7]);  //由于table长度多一倍,省去了一个循环,而且算法也简化了。

                   os_wait(K_TMO,30,0);

            }

            os_send_signal(0);

     }

}

相关帖子

沙发
icecut| | 2009-5-15 09:57 | 只看该作者

多思考,少指导....

P1 =~(table |table[i+7]);  //由于table长度多一倍,省去了一个循环,而且算法也简化了。

========================================
更改成这个即可节省数组.
P1 =~(table |table[7-i]); 


虽然你发的帖子感觉你是大侠.但是所有挑战os和非os之间转换的人必将以唉板砖告终.再此先小拍一下.就不对你算法改造了.

==>我背后有大侠.所以我一直敢出来拍.
拍错了我就找大侠摆平...

使用特权

评论回复
板凳
icecut| | 2009-5-15 10:07 | 只看该作者

前面也改

前面改成
P1 = (i > 8) ? ~Table : ~Table[15-i];

这种改法多出来的字节不多.但是,你程序太小,可能显得比例比较大.

临时没keil.没数据说明一下.

使用特权

评论回复
地板
linfulin| | 2011-3-11 23:57 | 只看该作者
“时间到空间“ 这个称呼特有感觉。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

1222

帖子

61

粉丝