【问题标题】:Pointer to inline asm label for PIC 16F and Hitech C指向 PIC 16F 和 Hitech C 的内联 asm 标签的指针
【发布时间】:2015-01-20 23:00:50
【问题描述】:

我正在编程 16F886,这是一个内联 asm 的示例:

#asm
psect TxtData,class=CODE,delta=2
global _text1,_text2
_text1:   dw    'T','E','X','T','1',0
_text2:   dw    'T','E','X','T','2',0
#endasm

我需要将 EEADR 和 EEADRH 指向每个标签以读取闪存。 在纯 asm 中,我只会使用低/高操作数来获取每个标签的地址,例如movlw low Text1。 在 C 中,我需要为每个标签提供类似“const 指针”的东西,但我无法让它工作。 我正在为 PIC 10/12/16 使用 Hitech C 编译器。

【问题讨论】:

  • 我的第一个猜测是extern const char *text1;。你试过什么?您收到了哪些错误消息?
  • @user3386109 所说的是正确的方法。此外,您可能想要使用db 指令,而不是dw 指令。前者会将每个字符视为一个字节(如您所愿),后者会将它们视为 16 位字,这对于 C 是不正确的。您还可以在 db 指令之后使用单引号中的纯字符串,例如_text1: db 'TEXT1'
  • 当我写EEADR=&text1 时,我得到“67.14 指针到整数的非法转换”。生成的代码似乎通过了正确的低字节。
  • 我认为您需要发布C代码的相关部分,看看我们可以看到您要做什么。
  • 你试过EEADR= Text1吗?

标签: c assembly inline-assembly pic


【解决方案1】:

感谢大家的支持。 我在 Microchip 论坛上发布了这个问题,几个人尝试了一下。结果发现 10/12/16 mcus 的编译器存在某种错误。在 C18 编译器或 Hitech C18 中,当设置为 18F MCU 时,上述建议的解决方案完美无缺。 我设法找到的唯一解决方法是使用内联汇编来获取 asm 地址标签的高字节并以这种方式设置正确的寄存器。

asm 
    EEADRH EQU  0x10F
    movlw high _text1
    banksel EEADRH
    movwf EEADRH
endasm

【讨论】:

    【解决方案2】:

    字符串标签一个指针——你不必用&指定它的地址。你必须先写地址的MS部分

    unsigned short address = text;
    EEADRH = (address >> 8) & 0xF;
    EEADR = address & 0xFF;
    

    【讨论】:

    • 它不起作用。之前的extern const long text1 使 text1 的行为有所不同。
    • @tcop 说“它不起作用”不是很有帮助。
    • 对不起。它返回与以前完全相同的值。似乎编译器没有保存 16 位地址标签,而是 8 位。如图16F,地址其实是14bit。
    • 我找不到解决方案。我会问Microchip这件事。谢谢。
    猜你喜欢
    • 2012-02-11
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2016-04-03
    • 2015-02-13
    相关资源
    最近更新 更多