Embedded 引导程序问题
我在PIC18F87J11上的串行引导程序有一个奇怪的问题,这个问题主要与GOTO指令有关。我会进一步解释,首先这是我的十六进制文件Embedded 引导程序问题,embedded,microcontroller,pic,bootloader,pic18,Embedded,Microcontroller,Pic,Bootloader,Pic18,我在PIC18F87J11上的串行引导程序有一个奇怪的问题,这个问题主要与GOTO指令有关。我会进一步解释,首先这是我的十六进制文件 :040C0000E2EFFFF030 :10FFC4000001E5EFFFF0000E956E00D08C8CA30EBF :10FFD400016E550EE82EFED7012EFCD78C9CA30E85 :10FFE400016E550EE82EFED7012EFCD7EFD7EED7C3 :04FFF40000EF06F024 :04FFF800A0
:040C0000E2EFFFF030
:10FFC4000001E5EFFFF0000E956E00D08C8CA30EBF
:10FFD400016E550EE82EFED7012EFCD78C9CA30E85
:10FFE400016E550EE82EFED7012EFCD7EFD7EED7C3
:04FFF40000EF06F024
:04FFF800A0F4C0FFB2
:00000001FF
如您所见,第一个地址是0C00(第1行),然后它写入以下E2EF、FFF0和剩余FFFF,直到达到64个“是”。从另一方面来说,这就是我写在记忆中的东西
Programming Flash Memory Addresses 0C00 - 0C3F with the following 64 bytes of machine code
EFE2 F0FF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
现在,当我在写入PIC后从PIC读取程序内存时,GOTO指令与具有地址FFC4的十六进制文件的第二行不同
1537 00C00 EFE2 GOTO 0x1FFC4 (should be 0x0FFC4)
1538 00C02 F0FF NOP
现在,我的十六进制文件的接下来几行转到下面的地址,如下所示
Programming Flash Memory Addresses FFC4 - FFFF with the following 64 bytes of machine code
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF 6E01 0E55 2EE8 D7FE 2E01 D7FC
9C8C 0EA3 6E01 0E55 2EE8 D7FE 2E01 D7FC
D7EF D7EE EF00 F006 F4A0 FFC0 FFFF FFFF
这是我写了上面的数据后从程序存储器中读取的
32739 0FFC4 FFFF NOP
32740 0FFC6 FFFF NOP
32741 0FFC8 FFFF NOP
32742 0FFCA FFFF NOP
32743 0FFCC FFFF NOP
32744 0FFCE FFFF NOP
32745 0FFD0 FFFF NOP
32746 0FFD2 FFFF NOP
32747 0FFD4 FFFF NOP
32748 0FFD6 FFFF NOP
32749 0FFD8 6E01 MOVWF config, ACCESS
32750 0FFDA 0E55 MOVLW 0x55
32751 0FFDC 2EE8 DECFSZ WREG, F, ACCESS
32752 0FFDE D7FE BRA 0xFFDC
32753 0FFE0 2E01 DECFSZ config, F, ACCESS
32754 0FFE2 D7FC BRA 0xFFDC
32755 0FFE4 9C8C BCF LATD, 6, ACCESS
32756 0FFE6 0EA3 MOVLW 0xA3
32757 0FFE8 6E01 MOVWF config, ACCESS
32758 0FFEA 0E55 MOVLW 0x55
32759 0FFEC 2EE8 DECFSZ WREG, F, ACCESS
32760 0FFEE D7FE BRA 0xFFEC
32761 0FFF0 2E01 DECFSZ config, F, ACCESS
32762 0FFF2 D7FC BRA 0xFFEC
32763 0FFF4 D7EF BRA 0xFFD4
32764 0FFF6 D7EE BRA 0xFFD4
32765 0FFF8 EF00 GOTO 0x1E0C00
32766 0FFFA FF06 NOP
32767 0FFFC A0F0 BTFSS INTCON3, 0, ACCESS
32768 0FFFE C0F4 MOVFF 0xF4, TOSU
现在,为什么地址00C00指向1FFC4(转到0x1FFC4),而不是0FFC4,十六进制文件的其余部分实际写入到该地址
我真的希望我能在这里得到一些帮助,因为上周我一直在尝试解决这个问题。谢谢
更新
我开始认为问题与应用程序代码的十六进制文件有关。我使用的十六进制文件是从教程中提到的批处理文件生成的,但是由mplab xc8生成的十六进制文件有些不同。我将包括更多的信息,希望有一些东西可以吸引别人的眼球
这是批处理文件中写入的内容
@echo off
set cfile=%1
set hexfile=%cfile:.c=.hex%
rem Check if the c file has been updated and needs to be compiled
FOR /F %%i IN ('DIR /B /O:D %cfile% %hexfile%') DO SET NEWEST=%%i
IF "%NEWEST%"=="%cfile%" (ECHO xc8 --chip=18F87J11 --CODEOFFSET=00c00h %cfile%
xc8 --chip=18F87J11 --CODEOFFSET=00c00h %cfile%
) ELSE ( echo No changes to %cfile% since last compiled. Skipping to download...
)
rem Only program the pic if the c file compiled successfully
FOR /F %%i IN ('DIR /B /O:D %cfile% %hexfile%') DO SET NEWEST=%%i
IF "%NEWEST%"=="%hexfile%" (echo serialprog %hexfile%
serialprog %hexfile%
)
:040C0000E2EFFFF030
:020000040001F9 <---- I deleted this line because it didn't seem needed
:10FFC4000001E5EFFFF0000E956E00D08C8CA30EBF
:10FFD400016E550EE82EFED7012EFCD78C9CA30E85
:10FFE400016E550EE82EFED7012EFCD7EFD7EED7C3
:04FFF40000EF06F024
:04FFF800A0F4C0FFB2
:00000001FF
这是由批处理文件生成的十六进制文件
@echo off
set cfile=%1
set hexfile=%cfile:.c=.hex%
rem Check if the c file has been updated and needs to be compiled
FOR /F %%i IN ('DIR /B /O:D %cfile% %hexfile%') DO SET NEWEST=%%i
IF "%NEWEST%"=="%cfile%" (ECHO xc8 --chip=18F87J11 --CODEOFFSET=00c00h %cfile%
xc8 --chip=18F87J11 --CODEOFFSET=00c00h %cfile%
) ELSE ( echo No changes to %cfile% since last compiled. Skipping to download...
)
rem Only program the pic if the c file compiled successfully
FOR /F %%i IN ('DIR /B /O:D %cfile% %hexfile%') DO SET NEWEST=%%i
IF "%NEWEST%"=="%hexfile%" (echo serialprog %hexfile%
serialprog %hexfile%
)
:040C0000E2EFFFF030
:020000040001F9 <---- I deleted this line because it didn't seem needed
:10FFC4000001E5EFFFF0000E956E00D08C8CA30EBF
:10FFD400016E550EE82EFED7012EFCD78C9CA30E85
:10FFE400016E550EE82EFED7012EFCD7EFD7EED7C3
:04FFF40000EF06F024
:04FFF800A0F4C0FFB2
:00000001FF
事实上,你需要这条线
:020000040001F9 <---- I deleted this line because it didn't seem needed
04
扩展线性地址记录修改所有后续记录,直到遇到另一条04
记录
04
记录的数据有效负载为0001
,这意味着所有后续地址都应位于00010000-0001FFFF
块中。十六进制文件:10FFC4…
中的下一行不是指向0000FFC4
,而是指向0001FFC4
因此,
GOTO
格式正确,并正确指向0001FFC4
,问题在于引导加载程序没有识别04
记录。有什么天才吗?你是如何构建和链接它的?我完全遵循了以下教程,但因为我使用的是不同的PIC系列,我必须做一些修改,这是最新的。如果您还有任何问题,请告诉我。@CarlNorum我添加了更多信息,请检查更新。操作码EFE2 F0FF
是否应该无条件跳转到地址0FFE2
?