什么是“附近的未签名字符”?


12

我阅读了数据表,发现变量定义为unsigned char near Sample_X。这是什么unsigned char Sample_X?与有何不同?


3
也许允许编译器使用较小的相对偏移量?
Neil_UK

6
根据在DOS中使用x86的部分经验,我希望在某些指针类型和16位环境中使用此功能。然而,OP引用的内容看起来并不像指针,并且数据表链接将暗示某些MCU。在以下两个链接中搜索关键字“ near”:microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
frr

3
应当注意,这是编译器扩展,不是标准C
PlasmaHH '18

1
关键字FYI near存储类说明符的示例。它告诉编译器一些有关如何或在何处分配变量存储的信息。(有关的更多信息,请参见下面的filo的答案near)。
所罗门慢

1
这真的是话题吗?
user541686 '18

Answers:


20

此处指定的MCU是Freescale MC9C08系列,它使用其HC08架构的稍微增强的版本。这是一个8位内核,与其他内核一样,它具有更短的指令和更快的访问“零页”地址的能力。零页地址只有8位长,而不是16位,因此引用它们的指令可以是2个字节而不是3个字节,因此执行时间减少了1个周期

关键字“ near”指示编译器尽可能将变量置于“零页”中,以提高性能。专为嵌入式开发而设计的编译器(例如这种编译器)通常对语言进行这种扩展(在此称为“零页面的C支持”)。


我喜欢这个答案,但是您有信息来源吗?
Clonkex

1
我编辑了答案,以提供更多详细信息和参考。实际上,它来自飞思卡尔的最新HCS08架构,但是与旧的HC08和HC05架构代码兼容。6800和6502(现在很古老)的体系结构也密切相关。
Chromatix

不错,好多了!
Clonkex

因此,它的用法与register关键字非常相似(对于您确实确定需要优化的情况),但是极端程度要少一些吗?
vsz '18

或多或少。差异主要是由于8位CPU通常本身没有寄存器组,只有一个累加器和几个索引寄存器。但这也类似于在x86上使用“近”指针与“远”指针,因为地址大小和完成访问需要多长时间是有区别的。
Chromatix

15

根据CPU体系结构,可能会有不同的指令来访问不同地址的数据。这是Keil为其编译器之一提供的示例

Near访问具有一定的内存限制,因此您可能会提示编译器将一些常用变量放置在较短指令可访问的区域中(显然描述了对32位地址空间的访问大于16位地址的访问)空间)。这可以转换为更小/更快的代码。



5
@AndrewMorton:这个问题涉及farnear指针在很大程度上过时8086体系结构。相同的关键字以相关但不同的方式用于8位微控制器。
supercat

@supercat这个问题只是一般性的询问,尽管答案集中在旧体系结构上。有经验的人应该在上面写一个答案,解释它们如何用于8位微控制器。
curiousdannii

@curiousdannii:所讨论的代码是为8位微型程序编写的。
超级猫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.