【发布时间】:2011-05-17 20:29:43
【问题描述】:
下面的函数使用 read_page(pageIter, pageArr, PAGESIZE) 一次读取一页图像,并在 DOUT 和 CCLK 引脚上输出数据。
有人告诉我它效率低下,但我似乎找不到让它更快的方法。它基本上是一个管道,在 64 针 uProcessor 上运行,位于两个内存空间之间。一个持有图像,另一个接收图像。
我使用了 register 关键字,删除了数组索引并用指针算术替换,但它需要更快。
谢谢!
/*
Port C Pin Out
*/
#define BIT0 0x01 // CCLK
#define BIT1 0x02 // CS_B
#define BIT2 0x04 // INIT_B
#define BIT3 0x08 // PROG_B
#define BIT4 0x10 // RDRW_B
#define BIT5 0x20 // BUSY_OUT
#define BIT6 0x40 // DONE
#define BIT7 0x80 // DOUT (DIN)
/*
PAGE
*/
#define PAGESIZE 1024 // Example
void copyImage(ulong startAddress, ulong endAddress)
{
ulong pageIter;
uchar *eByte, *byteIter, pageArr[PAGESIZE];
register uchar bitIter, portCvar;
portCvar = PORTC;
/* Loops through pages in an image using ulong type*/
for(pageIter = startAddress ; pageIter <= endAddress ; pageIter += PAGESIZE)
{
read_page(pageIter, pageArr, PAGESIZE);
eByte = pageArr+PAGESIZE;
/* Loops through bytes in a page using pointer to uchar (pointer to a byte)*/
for(byteIter = pageArr; byteIter <= eByte; byteIter++)
{
/* Loops through bits in byte and writes to PORTC - DIN ANC CCLK */
for(bitIter = 0x01; bitIter != 0x00; bitIter = bitIter << 1)
{
PORTC = portCvar | BIT0;
(bitIter & *byteIter) ? (PORTC = portCvar & ~BIT7) : (PORTC = portCvar | BIT7);
PORTC = portCvar & ~BIT0;
}
}
}
}
【问题讨论】:
-
我在这个循环中错过了什么微妙之处:
for(pageIter = aAddress ; pageIter <= eAddress ; pageIter += PAGESIZE)?这根本不是一个循环,是吗? -
@Chris:我修正了一点缩进,如果您不喜欢它,请随时回滚更改。
-
@bitmask:这是一个完全有效的循环,它从
aAddress到eAddress迭代内存,步长为PAGESIZE。 -
啊,抱歉,我得矫正视力了,我把
eAddress误读成了aAddress——所以差值就是0(因此说它毫无意义)。 -
改为 startAddress 和 endAddress 以提高可读性
标签: c image optimization embedded