【问题标题】:Memory map shows space allocated to mystery variables _powers_ and _npowers_内存映射显示分配给神秘变量 _powers_ 和 _npowers_ 的空间
【发布时间】:2015-02-14 16:07:54
【问题描述】:

我一直在查看我的代码的内存映射(用 c 编写并由 XC16 编译器编译),并看到分配给 powersnpowers 的大量空间, 和 .data 段中的 dpowers。

有人知道这个分配是做什么用的吗?

我的代码使用浮点库以及 printf/scanf - 这可能是这些函数的工作空间吗?

这是地图文件中的两个 sn-ps:

section                    address      alignment gaps    total length  (dec)
-------                    -------      --------------    -------------------
...
.data._powers_              0x20b2                   0            0xb0  (176)
.data._npowers_             0x2162                   0            0xb0  (176)
.data.dpowers               0x2212                   0           0x140  (320)

...和...

.data._powers_      0x20b2         0xb0
.data._powers_
                    0x20b2         0xb0 c:/program files (x86)/microchip/xc16/v1.24/bin/bin/../../lib\libc-coff.a(powers.epo)
                    0x20b2                  _powers_

.data._npowers_
                    0x2162         0xb0
.data._npowers_
                    0x2162         0xb0 c:/program files (x86)/microchip/xc16/v1.24/bin/bin/../../lib\libc-coff.a(powers.epo)
                    0x2162                  _npowers_

.data.dpowers       0x2212        0x140
.data.dpowers      0x2212         0xa0 c:/program files (x86)/microchip/xc16/v1.24/bin/bin/../../lib\libc-coff.a(doprnt_cdfFnopsuxX.EPo)
.data.dpowers      0x22b2         0xa0 c:/program files (x86)/microchip/xc16/v1.24/bin/bin/../../lib\libc-coff.a(doprnt.epo)

【问题讨论】:

  • 浮点和格式化 I/O 在内存和 CPU 负载方面都很昂贵。格式化 I/O 在支持浮点时特别昂贵。大多数嵌入式库都可以选择从 stdio 中删除浮点支持,并且浮点运算通常可以替换为定点代码。
  • 你说得对,这些是代码/内存密集型例程,但我预计大部分 RAM 需求将从堆栈中获得,并且查找表/常量可以保留在 ROM 中。后者会消耗更多的代码来进行 PSV 访问的页面切换(正如您所指出的,这些例程已经很慢了),但 RAM 节省会相当可观。
  • 我同意您希望库实现是最佳的,但这不是给定的。这对提高我对 Microchip 的所有事情已经很低的看法没有任何帮助。

标签: c embedded microchip xc16


【解决方案1】:

您必须查看 libc 版本的源代码才能获得明确的答案。我确实查看了一个源,发现在那个实现中,dpowers 是一个用于输出 (doprnt) 的常数表(10 的幂)。我怀疑其他人是相似的。

注意 - 虽然是常量,但由于语言限制,它们不在只读部分中。

【讨论】:

  • 这里的“语言限制”是什么?
  • 我记得,基本 C 没有 const。
  • 确实如此,并且至少从 1989 年开始就有。但是将const 放在 ROM 中并不是语言要求。一些编译器需要扩展或特定指令来指导编译器在 ROM 中定位数据。
  • @Clifford 我正在使用的 dcPIC33E 系列具有允许直接访问 ROM 常量数据的库切换方法 (PSV)。即使您的例程不能那样工作,您仍然需要在初始化期间将 const 数据从 ROM 复制到 RAM。
  • @DrC 感谢您的调查。看来我的猜想是对的。
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 2014-06-05
  • 2019-10-15
  • 2023-03-25
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多