|
图像采集的时候为了能尽可能多的采点,需要给从IO口读回来的数尽快地保存到数组中,有几种方法.
##############pooorfoool######
1. 汇编.(没有研究过该单片机的汇编指令和内存分配)
2. 将for循环拆开例如
For(i=0;i<3;i++)
{
a=PORTA;
}
可以用
a[0]=PORTA;
a[1]=PORTA;
a[2]=PORTA;
代替,速度大大提高,但是代码量也相应增大很多。
3.使用for循环,速度慢,代码量小。现在要在此基础上优化。
使用for循环也后好几种方法
假设图像存储在二维数组中:unsigned char pic[2][10];
1. 直接保存到二维数组,
row为当前行
每次行中断中采集
void gather(void)
{
char i;
for(i=0;i<100;i++)
{
pic[row]=PORTA;
}
row++;
}
速度慢,仿真了一下,大约要240条指令。
2. 先保存到一维数组中,有时间再转存到二维数组中。
假设有temp[10]一维数组
void gather(void)
{
char i;
for(i=0;i<100;i++)
{
temp=PORTA;
}
row++;
}
大约110条指令,转存的时间没有算,不过应该不多。
3. 使用指针。也是有两种用法。
1) unsigned char (*ptr)[10];
ptr=pic;
void gather(void)
{
char i;
for(i=0;i<100;i++)
{
(*ptr)=PORTA;
}
ptr++;
}
大约140条指令。使用简单。注意,经过在电脑上查看汇编(并不是codewarrior上,看不懂,vc上看的),unsigned char (*ptr)[10];并没有多分配空间,仅仅是分配了一个指针的空间,后面的10只是说明ptr每次前进几个存储单位(我猜的)你可以在电脑上用ptr自加前后printf(“%d”,ptr)看一下ptr变了多少。
2)
2) unsigned char (*ptr)[10];
unsigned char *pp;
ptr=pic;
void gather(void)
{
char i;
pp=*p
for(i=0;i<100;i++)
{
*(pp++)=PORTA;
}
ptr++;
}
大约99条指令,比一维数组还要快。这个里面相当于一维数组使用了指针(p指向一维数组的指针)
代码不严谨,没有判断指针有没有超界。这仅仅是在xs128上的结果,在51上,我查看了一下生成的汇编,发现代码条数是一维数组<二维数组<二维指针<一维指针,感觉是51寄存器太少,倒来倒去的造成的,没有具体分析。 |
|