为DSP目标处理器编译和链接以下代码:
TEST.C :
static q32 a[15] = {
Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f),
Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f),
Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f)
};
static int b[3] = { 1, 1, 0 };
int main()
{
// ...
return 0;
}
q32
是一个固定点类型,4个字节。
链接代码后,.map
文件告诉我以下内容:
Test.o: .bss 60, .data 12
。
为什么a
(60个字节)最终位于.bss
部分,而b
(12个字节)位于.data
部分?我希望两者都进入.data
。
答案 0 :(得分:1)
应该如何使用.bss。因为它应该表示未初始化的数据(我没有说它包含未初始化的变量!), 让我们说BSS段只保存没有任何值的变量,因此它实际上不需要存储这些变量。因此,BSS是一种优化,使得目标文件只保存单个值,现在就说变量所需的空间。这是15 * 4 = 60。
维基说,
BSS在运行时需要的大小记录在目标文件中,但BSS(与数据段不同)不会占用目标文件中的任何实际空间。
这是让你的可执行文件变小的一种方法。
现在,由于Q31
是一个扩展为((q32)(int)((double)(x)*(double)0x80000000UL
的宏,Q31(1.0f)
在编译时显然仍然无法理解。因此,它被视为未初始化,因此进入.bss。
虽然已知((q32)(int)((double)(x)*(double)0x80000000UL
是一个固定的常量表达式。
尝试输入固定值,您应该在.data段中看到它们。
无论如何,一旦程序加载完成,它在哪个部分无关紧要。
答案 1 :(得分:0)
在某些Q-something格式中,整数部分被固定分配给1或0.如果第一种情况适用于您的格式,q32
仅包含零字节。 bbs段在启动时初始化为零。因此,将q32
放在bbs中会避免一些初始化数据。
答案 2 :(得分:0)
未初始化的全局将进入.bss部分,而具有一些初始值的全局将进入.data部分。如果你有一个全局变量,ititial值为0(零)那么它将进入.bss部分作为优化最终二进制文件大小的方式。如果你的Q31(1.0f)解析为0,如果它的情况比上面的情况是[15]进入.bss部分而不是.data
的原因