Embedded 引导程序问题

Embedded 引导程序问题,embedded,microcontroller,pic,bootloader,pic18,Embedded,Microcontroller,Pic,Bootloader,Pic18,我在PIC18F87J11上的串行引导程序有一个奇怪的问题,这个问题主要与GOTO指令有关。我会进一步解释,首先这是我的十六进制文件 :040C0000E2EFFFF030 :10FFC4000001E5EFFFF0000E956E00D08C8CA30EBF :10FFD400016E550EE82EFED7012EFCD78C9CA30E85 :10FFE400016E550EE82EFED7012EFCD7EFD7EED7C3 :04FFF40000EF06F024 :04FFF800A0

我在PIC18F87J11上的串行引导程序有一个奇怪的问题,这个问题主要与GOTO指令有关。我会进一步解释,首先这是我的十六进制文件

: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