大家好、
客户有问题需要您的帮助:
我的程序分为两个部分、一个是引导加载程序、它分配在扇区 A 中、另一个是应用部分、 它是在扇区 H 中分配 的。我的问题是、当我在擦除应用程序后从引导加载程序跳转到应用程序时、此时执行的代码应为0xff、这应该会触发非法指令的中断。 但是、此中断函数也会分配在已擦除扇区中。 我想知道这个时候程序是如何执行的、不管是落入一个无限循环、还是继续执行这个非法指令。 在这个过程中、我发现 xa12 (gpio84)引脚实际上会输出一个低电平信号。 此引脚明确用于指示是否跳转到 SCI_BOOT。 它是一个输入引脚。 我的整个计划不涉及这一点。 引脚执行配置和其他操作、没有外部信号来驱动它。 它是如何成为输出和输出低电平的?
我随后的调查发现、当我在升级应用程序的中途断电时、就出现了这个问题、而只是在电源缓慢下降时才出现。 之后、我最初找到运行时的 boot28.asm、然后执行附加代码的第25行。 当 gpio84输出低电平时、因为我不懂汇编语言、所以我仍然不明白它是如何操作 GPIO 端口的。 我看到这段代码应该是用于初始化变量的代码。 我猜是因为初始化表已损坏、它将随机数据写入 GPIO 寄存器。 但是、即使他将0写入 GPIO 寄存器、该寄存器是否仍然具有模式和方向设置? 是否仍然存在寄存器写入保护? 它是如何最终成为一个低电平输出的?
****************************************************************************
* PROCESS CINIT INITIALIZATION TABLE. TABLE IS IN PROGRAM MEMORY IN THE *
* FOLLOWING FORMAT: *
* *
* .word <length of init data in words> *
* .word or .long <address of variable to initialize> *
* .word <init data> *
* .word ... *
* *
* If the variable's address is greater than 65535 (located in 'far' *
* memory), then the address field of the cinit record will be 32-bits *
* instead of the default 16-bits. The length value is negated to tag *
* cinit records for those variables located in far memory. *
* *
* The init table is terminated with a zero length *
* *
****************************************************************************
MOVL XAR7,#cinit ; point XAR7 at start of table
CLRC TC ; reset TC bit used as far flag
B START, UNC ; jump to start processing
LOOP:
MOVB AH,#0 ; zero out upper addr bits
PREAD AL,*XAR7 ; load address of variable to be inited
ADDB XAR7,#1 ; point to initialization data
B GET_DATA,NTC ; get data if variable is not far
CLRC TC ; reset TC bit used as far flag
PREAD AH,*XAR7 ; otherwise, get hi bits of 22-bit addr
ADDB XAR7,#1
GET_DATA:
MOVL XAR6,ACC ; address
RPT AR1 ; repeat length + 1 times
|| PREAD *XAR6++,*XAR7 ; copy data from table to memory
MOVL ACC,XAR7 ; using ACC as temp, point XAR7 to
ADD ACC,AR1 ; next cinit record since PREAD
ADDB ACC,#1 ; doesn't change value of XAR7.
MOVL XAR7,ACC
START:
PREAD AL,*XAR7 ; load length
B GET_ADDR,GEQ ; a length < 0 denotes far data
NEG AL ; negate value to get real length
SETC TC ; flag that the address field is 32-bits
GET_ADDR:
MOVZ AR1,AL ; copy length value to loop register
ADDB XAR7,#1 ; point to address field
BANZ LOOP,AR1-- ; if (length-- != 0) continue
此致、
本