我目前正在编写一个代码,在液晶屏上逐像素地写。代码运行良好,但是处理代码的速度非常慢。我们的目标只是在液晶屏上写数字,所以我使用带“for loop”的“switch”功能来读取我要激活的每个位。我想知道是否有人能告诉我一个加速我的代码。。。
int*开关库号(int num,int octet)
{
switch(num)
{
case 0 : ;
int number_0 [] = {0x80, 0x08,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, ...};
int * pNumber_0 = &number_0[octet];
return pNumber_0;
break;
case 1 : ;
int number_1 [] = {0x80, 0x08,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, ...};
int * pNumber_1 = &number_1[octet];
return pNumber_1;
break;
}
然后上升到9个,我觉得你不需要把所有的案子都看出来。另外,即使我删除了其中的大部分,我也有522字节的数字。其余代码将作为空闲代码:
int main(void)
{
ADC_Initialization();
SPI_Initialization();
int nombre_octet = 522;
int premier_nombre;
int deuxieme_nombre;
while(1)
{
GPIOA->BSRRL = CS;
for(int i = 0; i < nombre_octet; i++)
{
write_spi(*switch_library_number_1(0, i));
}
GPIOA -> BSRRH = CS;
for(int i = 0; i < 100; i++)
{
}
GPIOA->BSRRL = CS;
for(int i = 0; i < nombre_octet; i++)
{
write_spi(*switch_library_number_2(1, i));
}
GPIOA -> BSRRH = CS;
}
}
最后,这里是write-SPI函数,但由于它的简单性,我认为这不是问题所在。
void write_spi(char data)
{
SPI1->DR = data;
while (!(SPI1->SR & SPI_I2S_FLAG_TXE));
while (!(SPI1->SR & SPI_I2S_FLAG_RXNE));
while (SPI1->SR & SPI_I2S_FLAG_BSY);
}
提前谢谢!
最佳答案
我很喜欢你把代码分成三段的方式。我可以为他们每个人提出改进建议:
开关库编号:
这可能只是一个二维数组,number[][]
,或者如果number_0
,number_1
。。。不是相同的长度,它可能是指向这些的指针数组。需要检查有效的num
和offset
。这可能是一个小的速度改进。
你的number_0
。。。数组当前位于堆栈上,并且是读写的。使它们const
,这样它们就不会使用RAM。
目前,您正在返回一个指向堆栈上的内存位置的指针-这通常不起作用,如果是运气和意外。当您超出定义堆栈数据的范围(函数)时,不应访问堆栈数据。static const
会使它安全,因为它不再在堆栈上。
主回路:
在每次循环迭代中调用switch_library_number_1/2
有点奇怪。你知道你的数据只是一个数组。如果write_spi(number[0][i]);
数组设置正确,则可能会用number
替换。这应该会提高一些速度,因为它非常简化数据获取。
你的循环似乎很忙。这是一个复杂的实践(我敢打赌100
是一个猜测,注意编译器可以优化这个循环)。如果可能,可以使用库提供的延迟函数或计时器来获得精确的延迟。这是SPI从机的实际需求吗?
写入spi(字符数据):char
应该在这里。unsigned char
s可能是有符号或无符号的,因此当您将它们用作字节(不是实际的字符串字符)时,应该指定有符号性。
你似乎在等待每个字节的传输完成,这是安全的,但有点慢。通常,这可以重写为更快的char
,在这里,您只需在发送下一个字节之前等待。请注意,在再次将CS拉回到高位之前,还需要等待字节完全传输。这可能是一个很大的速度改进。
其他需要考虑的事项:
实际的SPI时钟是多少?如果时钟增加,速度可能会有很大的提高。
你是怎么衡量这是“慢”的?它是否指向代码的慢部分(那么这些是什么呢?如果从C看不明显,那么它们的装配目的是什么?)
你有示波器/逻辑分析仪来观察电线上的实际信号吗?这可能会提供有用的数据。
关于c - SPI写STM32的速度很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55130404/