有人可以帮忙吗?
总结:声明和初始化变量在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)。
如果符合以下条件,它在硬件中有效:
现在,如果我使用结构类型而不是简单的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
我在这里做了一些愚蠢的事情,还是有一个我缺少的编译器选项,还是编译器或调试器错误? 我想了解这个问题,所以在开发过程中我不会陷入任何陷阱。
干杯, 史蒂夫
答案 0 :(得分:2)
看起来有一个已知的硅问题在重置后立即停止访问程序存储器。有一个ERRATA宏' NVMREG'作为一个出行。要解决的具体步骤是: 设置项目选项' Conf'>' XC8全局选项'' XC8链接器'选择'其他选项'类别,然后将NVMREG添加到勘误表选项。 然后一切正常。 感谢微芯片论坛上1and0 的那个!