PIC18 变量声明和初始化在硬件中失败
PIC18 variable declaration and initialisation fails in hardware
有人可以帮忙吗?
总结:声明和初始化变量在 PIC 硬件中不起作用——而在模拟中却工作正常。此外,如果变量是结构,这个问题似乎更糟。我正在使用:带有 PICKIT3 调试器电缆的 Explorer 8 板上的 MPLAB X IDE V3.55、XC8 V1.41、PIC18F26K40。
详情:
对于像这样的简单案例:
uint8_t myvar = 0x55;
void main(void)
{
uint8_t var = myvar;
}
在调试器中使用变量 window 当我在硬件中 运行 时,myvar 始终为零。但是如果我在模拟器中运行同样的代码就OK了!
我有:
- 将问题分解为重现问题的最简单形式
- 已尝试禁用编译器优化 - 无法解决此问题
检查“文件寄存器”调试器中的值 window。当在硬件中 运行 时,我看不到 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' select 'Additional options' 类别,然后将 NVMREG 添加到 Errata 选项。
然后一切正常。
感谢微芯片论坛上的 1and0 !
有人可以帮忙吗?
总结:声明和初始化变量在 PIC 硬件中不起作用——而在模拟中却工作正常。此外,如果变量是结构,这个问题似乎更糟。我正在使用:带有 PICKIT3 调试器电缆的 Explorer 8 板上的 MPLAB X IDE V3.55、XC8 V1.41、PIC18F26K40。
详情:
对于像这样的简单案例:
uint8_t myvar = 0x55;
void main(void)
{
uint8_t var = myvar;
}
在调试器中使用变量 window 当我在硬件中 运行 时,myvar 始终为零。但是如果我在模拟器中运行同样的代码就OK了!
我有:
- 将问题分解为重现问题的最简单形式
- 已尝试禁用编译器优化 - 无法解决此问题
检查“文件寄存器”调试器中的值 window。当在硬件中 运行 时,我看不到 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' select 'Additional options' 类别,然后将 NVMREG 添加到 Errata 选项。 然后一切正常。 感谢微芯片论坛上的 1and0 !