编译期对象构造优化 .bss 为 .rodata

💡 原文中文,约1800字,阅读约需5分钟。
📝

内容提要

为了提高性能,作者开发了一个查表法计算sin的函数,并为不同ROM大小的MCU设计了多个版本的查表。通过使用自定义的定点数类float_number,优化了内存使用。最终,添加constexpr关键字后,成功减少了内存占用,并将sin的分辨率从2度提升至0.05度,使电机运转更加平滑。

🎯

关键要点

  • 为了提高性能,作者开发了一个查表法计算sin的函数,并为不同ROM大小的MCU设计了多个版本的查表。
  • 最大的查表包含1800项,分辨率达到了0.05度,使用自定义的定点数类float_number来优化内存使用。
  • 由于float_number类不是内置类型,导致内存占用问题,特别是在内存有限的EG6832 MCU上。
  • 通过编译期构造,作者将sin_table直接存放为已构造的对象,避免了运行时初始化,节省了内存。
  • 添加constexpr关键字后,内存占用从接近3KB降低到705B,sin的分辨率从2度提升至0.05度,使电机运转更加平滑。

延伸问答

如何通过查表法计算sin函数以提高性能?

通过为不同ROM大小的MCU设计多个版本的查表,使用查表法计算sin函数可以提高性能。

float_number类如何优化内存使用?

float_number类通过使用定点数替代浮点数,减少了内存占用,特别是在内存有限的MCU上。

添加constexpr关键字后,内存占用减少了多少?

添加constexpr关键字后,内存占用从接近3KB降低到705B。

如何提高sin函数的分辨率?

通过优化查表法,sin的分辨率从2度提升至0.05度,使电机运转更加平滑。

EG6832 MCU的内存限制对开发有什么影响?

EG6832只有8K的RAM,内存限制导致开发者需要优化内存使用,避免内存不足的问题。

编译期构造的优势是什么?

编译期构造可以避免运行时初始化,节省内存并提高性能。

➡️

继续阅读