编译期对象构造优化 .bss 为 .rodata
内容提要
为了提高性能,作者开发了一个查表法计算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度,使电机运转更加平滑。
延伸解读
内存优化的重要性
在资源受限的MCU上,内存的使用至关重要。作者通过编译期构造和使用constexpr关键字,显著减少了内存占用。这种优化不仅提升了性能,还允许使用更高分辨率的sin表,改善了电机的运转平滑度。
查表法的灵活性
为不同ROM大小的MCU设计多个版本的查表法,展示了查表法在嵌入式系统中的灵活应用。通过调整表的大小和分辨率,开发者可以根据具体需求优化性能,这对于不同应用场景具有重要的实用价值。
自定义数据类型的挑战
使用自定义的定点数类float_number虽然带来了灵活性,但也引发了内存占用的问题。开发者需要在性能和内存使用之间找到平衡,特别是在内存有限的环境中,这种权衡尤为重要。
延伸问答
如何通过查表法计算sin函数以提高性能?
通过为不同ROM大小的MCU设计多个版本的查表,使用查表法计算sin函数可以提高性能。
float_number类如何优化内存使用?
float_number类通过使用定点数替代浮点数,减少了内存占用,特别是在内存有限的MCU上。
添加constexpr关键字后,内存占用减少了多少?
添加constexpr关键字后,内存占用从接近3KB降低到705B。
如何提高sin函数的分辨率?
通过优化查表法,sin的分辨率从2度提升至0.05度,使电机运转更加平滑。
EG6832 MCU的内存限制对开发有什么影响?
EG6832只有8K的RAM,内存限制导致开发者需要优化内存使用,避免内存不足的问题。
编译期构造的优势是什么?
编译期构造可以避免运行时初始化,节省内存并提高性能。