【问题标题】:What is the significance of sbss2/sdata2?sbss2/sdata2的意义是什么?
【发布时间】:2020-04-20 09:51:53
【问题描述】:

我正在使用基于 GCC 的编译器使用 PPC 微控制器(特别是 e200z4)。如果我们定义的变量的大小小于定义的数字(我的情况是 8),则 PPC EABI 支持小数据分配。我明白了:

  • sdata 用于小型初始化数据,可修改(将位于 RAM 部分)。
  • sbss 与将位于 RAM 上的 sdata 相同,但它用于未初始化或零变量。
  • 这 2 个部分只能由 16 位带符号偏移量 + 基址寄存器引用的一条指令访问。

通过阅读PPC EABI规范,我不知道sbss2sdata2的意义是什么?它们会是 RAM 或 Flash 上的小变量吗?它们是否与 sdatasbss 不同?

【问题讨论】:

  • 常量可以放在那里,因为它们可以保存只读数据。

标签: c gcc linker embedded powerpc


【解决方案1】:

来自EABI

8 字节或更少字节的标量的外部变量,其值可能通过以下方式更改 程序,其值不会在程序之外更改,应作为 .sdata 或 .sbss 条目访问...

当目标文件不是共享目标文件的一部分时,标量的外部变量 8 个或更少的字节,其值不能由程序更改,其值将 不能在程序之外更改,应作为 .sdata2 或 .sbss2 条目访问...

特殊部分 .sdata2 旨在保存初始化的只读小数据,这些数据有助于 程序存储器映像。但是,该部分可用于保存可写数据。特别的 .sbss2 节旨在保存可写入的小数据,这些数据有助于程序存储器映像,其初始值为 0。

【讨论】:

  • .sbss2 不是类似于“程序未初始化的常量变量”吗?这似乎有点没用。看看我以前的 e200 项目,这部分都是空的。
  • 嗯,它的那种友好或不一致的 EABI “其值不能由程序更改,其值不会在程序之外更改,应作为 .sdata2 或 .sbss2 条目访问。 ..”并且有这个“特殊部分.sbss2旨在保存可写的小数据”。
  • 我的看法是 .sdata = 普通数据部分,.sbss = 普通 bss 部分,.data/.bss 相同,但每个变量 > 8 字节,sdata2 = 已初始化常量和sbss2 = 未初始化的常量(空)。
  • 嗯。 e500 甚至有sbss0。我的猜测是这些额外的sbssX(和sdataX,虽然在这里它主要用于常量,但它也可以保存可写数据)与sbss(和sdata)的使用方式相同。由于他们限制为最大 64K 大小,他们可能会发现数量不足并引入了其他这些部分以便能够拥有更多这些部分。主要区别似乎是它们也(显然)使用不同的寄存器作为基础,并且它们不能用于共享对象。
  • 是否可以通过其他方式更改“常量但可以保存可写数据”(例如某些东西重新编程该变量的闪存部分?)
【解决方案2】:

我之前的 e200 项目是这样设置的:

             ROM
         +----------+
         |          |
         | .text    | code
         |          |
   -     +----------+
   ^     |          |
   |     | .sdata2  | constant small initialized data (max 32k)
   |     |          |
max 64k  +----------+   <~~ _SDA2_BASE_ (r2)
   |     |          |
   |     | .sbss2   | constant small not (or zero) initialized data (max 32k)
   v     |          | ALWAYS EMPTY!
   -     +----------+

             RAM
         +----------+
         |          |
         | .data    | normal initialized data
         |          |
   -     +----------+
   ^     |          |
   |     | .sdata   | normal small initialized data (max 32k)
   |     |          |
max 64k  +----------+   <~~ _SDA_BASE_ (r13)
   |     |          |
   |     | .sbss    | normal small not (or zero) initialized data (max 32k)
   v     |          |
   -     +----------+
         |          |
         | .bss     | normal not (or zero) initialized data
         |          |
         +----------+

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 2014-03-30
    • 1970-01-01
    • 2011-08-19
    • 2010-09-08
    • 2011-07-28
    • 2011-06-13
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多