highggear不是要讨论如何裸奔更有意义吗?就这么简单的OS程序应用,请您高手用裸奔程序实现。看看不吹牛的highgear裸奔高手肚子里到底有多少水。
写不出来的是“猪涂口红”。上次长除法煞有介事地挑战学生D,结果当了一回猪,原来自己一点不懂。再上一次,跟1952赌1000元,输了就跑。这种人怎么脸皮那么厚,好像什么都没发生过,这回又出来装懂了。 只有一种解释,你主子在后面逼你呢。你不得不脸皮厚。
/*
** 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);
}
}
这不是最简的程序,弄着玩的。 highgear别装懂,你来。 |