【问题标题】:What will be the size of pointer on a 8 bit microcontroller like 8051?像 8051 这样的 8 位微控制器上的指针大小是多少?
【发布时间】:2016-12-05 15:00:39
【问题描述】:

我们知道指针的大小取决于地址总线,那么像 8051 这样的 8 位微控制器上的指针大小是多少?

【问题讨论】:

  • 这取决于您使用的编译器、编译命令以及目标操作系统架构。此外,指针的大小是 32 位还是 64 位取决于我提到的内容,而不取决于您提到的内容。
  • 8051有一个16位地址总线和一个16位指针寄存器DPTR
  • @DMaster 不,真的没有。在任何 8051 实现中,指针始终为 16 位。阅读问题,也许吧。
  • @Lundin 感谢您的指正。我忘记了 16 位拱门也存在 :)
  • 我曾经使用过一个 8051 编译器,其中 char * 是 3 个字节。 (17 个值位)

标签: c pointers embedded memory-address 8051


【解决方案1】:

8051 不是 C 友好型处理器。

它有几个地址空间。我广泛使用了 Keil 8051 编译器,它有几种指针类型。

  • 指向内部内存空间或内部间接空间的 8 位指针。
  • 一个 16 位指针,指向外部 RAM 或代码空间。
  • 可以指向任何地方的“智能”24 位指针。基本上是一个标签,后跟 16 位。

所有这一切都没有增加银行转换方案的复杂性,使事情变得更加“有趣”。

应该避免的智能指针,因为它们又大又慢。

【讨论】:

  • 你好,你有没有见过一个处理器在 N 条线上有一条总线,其中 C 编译器没有使用所有 N 条物理线来实现 C 抽象机,并且总线的一些 N 条线是执行 C 程序期间的 dummy ?
  • 实际上是的,8051。这不是“C”问题。这是一个 8051 问题。给定一个很好的指向 XDATA 的 16 位指针,该指针没有将访问 DATA 或 IDATA 或 CODE 空间的值。为此,您需要不同类型的指针或所谓的慢速、大型、智能指针。要理解这一点,您需要深入了解 8051。这留给读者作为练习 ;-)
  • 针对标准的相同对象类型的不同指针大小。因此,基本上“智能指针”将是唯一兼容的指针类型(具有所有隐含的障碍)。但我同意这是高级语言最糟糕的架构之一,如果没有非标准扩展,应该考虑使用不同的架构或使用良好的汇编语言。我更喜欢第一个选项; 8051 已经过时了超过 20 年(该架构从发布之日起就已经过时,仅以紧凑性和价格为理由,并且从未用于 HLL)。
  • 有许多可用于 8051 的 C 编译器,C 经常用于它们。首先要做的是意识到您可能不想在一个上编写 ANSI 或 ISO 标准 C。一方面,类型提升规则是 8 位的性能杀手。
【解决方案2】:

兼容的 C 编译器要求 SIZE_MAX 至少为 65535 (0xFFFF)。这意味着对象指针必须至少为 16 位。

鉴于8051 架构,它不可能有更宽的指针,但可以。它取决于编译器,不仅取决于处理器,还取决于目标平台及其内存。扩展的 8051 系列确实包括 32 位机器。

请注意,对象指针和函数指针可能有不同的宽度。

【讨论】:

  • 指针的大小不必与size_t 相同。事实上,这就是(u)intptr_t 存在的原因。除了(u)intptr_t 足够大足够之外,指针宽度与任何整数宽度之间没有关系。
  • “指针不必具有与 size_t 相同的大小”是正确的,但在这里无关紧要,因为此答案断言对象指针需要 至少 大小为 size_t
  • 这正是我的观点,这个断言是错误的。一个很好的指针可以小于size_t
  • @Olaf 如果第一条评论使用“较小”的声明会更好,因为它可以更好地详细说明您的观点。如果您有一个投诉 C 示例,表明您声称的对象指针小于 size_t,我很乐意删除此答案。我们的各种经验当然是广泛的,但没有遇到过这样的平台,即使理论上是可能的,也导致这种考虑并不具有实际意义。
【解决方案3】:

stdint.h 施加的限制在独立实现和托管实现 (4. Conformance, ISO/IEC 9899:) 中都包含常量 INTPTR_MIN/INTPTR_MAX

来自7.18 Integer types <stdint.h>

7.18.2.4 Limits of integer types capable of holding object pointers
— minimum value of pointer-holding signed integer type
INTPTR_MIN                           −(2^15 − 1)
— maximum value of pointer-holding signed integer type
INTPTR_MAX                            2^15 − 1
— maximum value of pointer-holding unsigned integer type
UINTPTR_MAX                           2^16 − 1

如果你有一个地址总线为 8 的特殊处理器,你不能在它上面实现 C,但这样的处理器肯定不存在。

如果您有一个总线宽度为 16 且数据总线为 3 位的处理器,则可以实现 C 抽象机强加的数据类型,但每次操作使用多次提取。

此外,在外来架构上,抽象 C 机器的位与物理线路之间的位之间不是直接对应(同构)。有些电线可能不使用,其他电线可以保留校正码,其他电线可能会生成陷阱表示。在这样的架构上,实现 C 语言更加困难。

【讨论】:

  • 但是 8051 的 C 编译器很少兼容 - 这样做将无法利用其架构,或者同情其严格的限制。 8051 使用哈佛架构,具有独立的代码、外部数据、内部数据和位可寻址覆盖区域。 IDATA 空间为 256 字节,(位区域为 256 位);编译器确实会为这些空间生成 8 位指针 - 可以使用更多“冗余”位以符合要求,但鉴于这种方法的缺点,它不太可能成为解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-06-19
  • 2011-10-08
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多