keil优化等级影响STM32 GPIO速度变化

keil优化等级设置为Level 0时,增加或删除部分GPIO翻转的指令,发现GPIO翻转的脉宽会变化。

如l优化等级设置为Level 0时,以下高电平时间为80ns,

LL_GPIO_ResetOutputPin(	GPIOA, LL_GPIO_PIN_12);
LL_GPIO_SetOutputPin(	GPIOA, LL_GPIO_PIN_12);
LL_GPIO_ResetOutputPin(	GPIOA, LL_GPIO_PIN_12);

将代码增加到:

LL_GPIO_ResetOutputPin(	GPIOA, LL_GPIO_PIN_12);
LL_GPIO_SetOutputPin(	GPIOA, LL_GPIO_PIN_12);
LL_GPIO_ResetOutputPin(	GPIOA, LL_GPIO_PIN_12);
LL_GPIO_SetOutputPin(	GPIOA, LL_GPIO_PIN_12);
LL_GPIO_ResetOutputPin(	GPIOA, LL_GPIO_PIN_12);

脉宽时间变为200ns。

将keil优化等级设置为Level 1,时间恢复为80ns,问题解决。

查阅相关资料,对于优化等级的说明如下:

不同的优化级别允许您在级别之间进行权衡已编译代码中可用的调试信息以及代码的性能。以下优化级别可用:
-O0应用最小优化:
大多数优化都被关闭,生成的代码具有最佳的调试视图。
-O1应用受限优化:
例如,删除未使用的内联函数和未使用的静态函数。在这个优化级别,编译器还应用自动优化,例如删除冗余代码和重新排序指令以避免互锁情况。生成的代码经过合理优化,具有良好的调试视图。
-O2应用高优化(这是默认设置):
在此级别应用的优化利用了ARM对处理器体系结构的深入了解,利用给定目标的特定于处理器的行为。它生成优化良好的代码,但有限调试视图。
-O3应用最积极的优化:
优化符合用户的-Ospace / -Otime选择。默认情况下,多文件编译是启用,这会导致更长的编译时间,但会提供最高级别的优化。
Optimize for Time
“优化时间”复选框使编译器进行优化,更加注重实现最佳效果检查时的性能(-Otime)或未选中时的最小代码大小(-Ospace)。
取消选中Optimize for Time就意味着选择-Ospace选项,该选项指示编译器执行优化以可能增加的执行时间为代价来减小Image文件大小。例如,使用非内联函数调用而不是大型结构副本的内联代码。 这是默认选项。从中运行编译器时命令行,使用'-Ospace'调用此选项选中Optimize for -Otime选项,该选项指示编译器以最快的速度优化代码执行时间,有可能增加image文件大小。建议编译时间关键部分您的代码使用-Otime,其余使用-Ospace指令。

https://zhuanlan.zhihu.com/p/273445617

猜你喜欢

转载自blog.csdn.net/tjcwt2011/article/details/114268063