我打算使用Arduino可编程板.它们的闪存存储量非常有限,范围在16到128 kB之间,用于存储编译的C或C++代码.
有没有办法估计它代表多少(标准)代码?
我想这很模糊,但我只是在寻找一个数量级.
size
命令的输出是一个很好的起点,但不会提供您需要的所有信息.
$ avr-size program.elf text data bss dec hex filename
图像的大小通常比文本和数据部分的总和略大.bss部分基本上是压缩的,因为它全是0.可能还有其他相关部分未按大小列出.
如果您的构建系统设置为我以前用于AVR微控制器的构建系统,那么您最终将获得*.elf文件以及*.bin文件,并且可能是*.hex文件.*.bin文件是存储在处理器程序闪存中的实际图像,因此您可以检查其大小,以确定程序在编辑时的增长方式.*.bin文件是使用objdump命令从*.elf文件中提取的,还有一些我现在还记不住的标志.
如果你想知道如何猜测你的C或C++代码在编译时会产生多少,那就更难了.当我尝试使用uint64_t而不是uint32_t时,我已经观察到函数中有10倍的爆炸,而我所做的只是递增它(这是我认为的代码的5倍左右).这主要与gcc的avr优化不是最好的有关,但代码大小的较小变化可能会从看似无辜的代码中蔓延开来.
这可能会因使用C++而放大,而C++往往会隐藏更多变成代码的东西而不是C语言.C++隐藏的主要内容是析构函数调用和许多指针解除引用,它与this
对象中的指针以及许多对象对其虚函数表和类静态变量的秘密指针有关.
在AVR上,所有这些指针的东西很可能真的加起来,因为指针是寄存器的两倍,并且需要加载多个指令.此外,AVR只有几个可用作指针的寄存器对,这导致许多移动进出这些寄存器.
关于AVR的小程序的一些提示:
尽可能使用uint8_t
而int8_t
不是代替int
.您也可以使用uint_fast8_t
,int_fast8_t
如果您希望您的代码可移植.这可能导致许多操作只占用一半的代码,因为这int
是两个字节.
非常了解字符串和结构常量和文字以及它们存储的方式/位置.
如果您不害怕,请阅读AVR组装手册.您可以了解指令的类型,并从中了解轻松映射到这些指令的C代码类型.使用那种C代码.