有人可以帮忙吗?

总而言之:声明和初始化变量在 PIC 硬件中不起作用 - 而在模拟中却可以正常工作。此外,如果变量是结构体,这个问题似乎更糟。我在 Explorer 8 板上使用:MPLAB X IDE V3.55、XC8 V1.41、PIC18F26K40 和 PICKIT3 调试器电缆。

细节:

对于一个简单的案例,如:

uint8_t myvar = 0x55;

void main(void)
{
    uint8_t var = myvar;
}

当我在硬件中运行它时,在调试器中使用变量窗口 myvar 始终为零。但是如果我在模拟器中运行相同的代码,一切都OK!

我有:
  • 将问题分解为重现问题的最简单形式
  • 尝试禁用编译器优化 - 这不能解决此问题

  • 检查“文件寄存器”调试器窗口中的值。在硬件中运行时我看不到 0x55——但它在模拟器中(地址 0x21)。

    如果满足以下条件,它确实适用于硬件:
  • myvar 被声明并初始化为 const
  • myvar 在本地(在 main 内)被声明和初始化

  • 现在,如果我使用结构类型而不是简单的 uint8_t ,例如:
    typedef struct {
        uint8_t a;
        char b[8];
    }MYSTRUCT;
    
    MYSTRUCT ms = { 0x55, "HELLO" };
    
    void main(void)
    {
        uint8_t var = ms.a;
    }
    

    ms 变量在模拟中正确初始化,但在硬件中未正确初始化。如果变量在 main 或全局中声明,这一次它不会初始化。同样,声明为 const 确实有效。
    所以这里似乎存在不一致:
                                                    uint8_t     struct type
    global variable declaration and initialisation      N       N
    global const  declaration and initialisation        Y       Y
    local variable declaration and initialisation       Y       N
    

    在调试并逐步执行汇编程序 (.as) 文件后,看起来 myVar 正在尝试初始化,但由于某种原因,硬件中没有。
    请参阅以下 .as 文件中的相关行。关键阶段的地址和值显示为在仿真期间从调试器捕获。您可以在末尾看到“__pdataCOMRAM”(指向 myVar 的 ram 的指针)被分配了 0x55。如果我在硬件中逐步执行此操作,所有步骤都是相同的,但是当我们结束时,'__pdataCOMRAM' 的值不是 0x55,而是 0x00。
                                                        Address Value
    
    global __pdataCOMRAM
    __pdataCOMRAM:
      file  "main.c"
      line  32
    global  _myVar
      myVar:                                            0x21    0x00
       ds      1
        file    "dist/C18_18F87K22/debug\initTest.X.debug.as"
        line    #
    psect   cinit
    ; Initialize objects allocated to COMRAM (1 bytes)
      global __pidataCOMRAM                             0x144   0xff55
      ; load TBLPTR registers with __pidataCOMRAM
      movlw low (__pidataCOMRAM)
      movwf tblptrl
      movlw high(__pidataCOMRAM)
      movwf tblptrh
      movlw low highword(__pidataCOMRAM)
      movwf tblptru
      tblrd*+ ;fetch initializer
      movff tablat, __pdataCOMRAM+0                    0x21     0x55
    

    我在这里做了一些愚蠢的事情还是我缺少编译器选项,或者它是编译器或调试器错误?
    我想了解这个问题,这样我就不会在我的开发过程中陷入任何陷阱。

    干杯,
    史蒂夫

    最佳答案

    似乎存在一个已知的硅问题,在复位后立即停止访问程序存储器。有一个 ERRATA 宏“NVMREG”作为解决方法。具体解决步骤为:
    设置项目选项 'Conf'>'XC8 global options'>'XC8 linker' 选择 'Additional options' 类别,然后将 NVMREG 添加到勘误选项。
    然后一切正常。
    归功于微芯片论坛上的 1and0 !

    关于c - PIC18 变量声明和初始化在硬件中失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43324347/

    10-11 16:13