PIC18变量声明和初始化在硬件

时间:2017-04-10 13:21:53

标签: c embedded microcontroller pic

有人可以帮忙吗?

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

详细说明:

对于一个简单的案例:

uint8_t myvar = 0x55;

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

使用调试器中的变量窗口myvar在硬件中运行时始终为零。但是如果我在模拟器中运行相同的代码就可以了!

我有:

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

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

如果符合以下条件,它在硬件中有效:

  • myvar被声明并初始化为const
  • myvar在本地声明并初始化(在主要内部)

现在,如果我使用结构类型而不是简单的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。如果我在硬件中逐步执行此步骤,则所有步骤都相同,但是当我们结束时,#pdaCOMRAM' __ 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

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

干杯, 史蒂夫

1 个答案:

答案 0 :(得分:2)

看起来有一个已知的硅问题在重置后立即停止访问程序存储器。有一个ERRATA宏' NVMREG'作为一个出行。要解决的具体步骤是: 设置项目选项' Conf'>' XC8全局选项'' XC8链接器'选择'其他选项'类别,然后将NVMREG添加到勘误表选项。 然后一切正常。 感谢微芯片论坛上1and0 的那个!