This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28335:28335非法指令执行问题

Guru**** 2569065 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1313506/tms320f28335-28335-illegal-instruction-execution-problem

器件型号:TMS320F28335

大家好、

客户有问题需要您的帮助:

我的程序分为两个部分、一个是引导加载程序、它分配在扇区 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 

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    擦除应用程序后、当我从引导加载程序跳转到应用程序时、此时执行的代码应为0xff、这应该会触发一个非法指令的中断、

    是的。

    Unknown 说:
    但此中断函数也被分配到了已擦除扇区中。 [/报价]

    默认情况下、ITRAP ISR 处于引导 ROM 中。 如果 CPU 尝试执行任何未实现的操作码、这将触发 ITRAP、器件将分支到 ROM 中的 ITRAP ISR、这只是一个无限循环。 如果 WD 没有被禁用、WDCNTR 将溢出并复位器件。 您可以在具有空白闪存的器件上看到此行为。 如果为这样的器件上电、您将看到-XRS 引脚重复脉冲。  

    Unknown 说:
    我发现 xa12 (gpio84)引脚实际上输出低电平信号。 [/报价]

    在引导模式选择阶段、所有4个引脚都是输入引脚。 它们只能被读取、不能被驱动。

    Unknown 说:
    我随后的调查发现,当我在升级应用程序的过程中出现电源故障时,才会出现此问题,而只有在电源缓慢下降时才会发生。
    [/quote]

    这种做法的风险极高、因为它可能会破坏密码位置并永久锁定器件(使用未知密码)。  一旦电源电压降至 Vmin 以下、器件的运行便无法预测、这也可能解释了 GPIO84为何显示为低电平。

    [/quote][/quote]