IDE编译器平台:IAR 3.10.4
芯片:STM8S207C8
应用此款单片机在产品设计当中需要过UL1998认证,从官网提供的class B函数库用来做自检程序中碰到问题:
1. 当程序调用到如下函数时,不能返回:
/*--------------------------------------------------------------------------*/
/*------------------- CPU registers and Flags Self Test --------------------*/
/*--------------------------------------------------------------------------*/
/* WARNING: all registers destroyed when exiting this function */
/* Initializes counter for control flow monitoring */
CtrlFlowCnt = CPU_POR_CALLER;
CtrlFlowCntInv = 0xFFFFu;
#ifdef STL_INCL_POR_CPU
if (STL_StartUpCPUTest() != CPUTEST_SUCCESS) ////标注的红色函数调用后不能返回
{
fail_safe_assert( 0x00u, "Start-up CPU Test Failure\n\r");
}
else /* Test OK */
{
/* If else statement is not executed, it will be detected by control flow monitoring */
CtrlFlowCntInv -= CPU_POR_CALLER;
#ifdef STL_VERBOSE_POR
printf("\n\rStart-up CPU Test OK\n\r");
#endif /* STL_VERBOSE_POR */
}
#endif /* STL_INCL_POR_CPU */
STL_StartUpCPUTest()为汇编语言编定的函数,程序运行到ret语句,报硬fault: ILLOPF置位。
2.当程序调用到如下函数时,不能返回:
#ifdef STL_INCL_POR_RAM
#if defined (EVAL_BOARD_CONTROL)
BSP_LED_On(LED_VLM);
#endif /* EVAL_BOARD_CONTROL */
/* WARNING: All the stack space is zero-initialized when exiting from this routine */
if (STL_FullRamMarchC() != FULL_RAM_OK) ////标注的红色函数调用后不能返回
{
fail_safe_assert( 0x03u, "RAM Test Failure");
}
#ifdef STL_VERBOSE_POR
printf("Full RAM Test OK\n\r");
#endif /* STL_VERBOSE_POR */
/* Note, control flow variables are cleared inside the RAM test routine and */
/* re-initialized before return to check correct passing of the test */
#if defined (EVAL_BOARD_CONTROL)
BSP_LED_Off(LED_VLM);
#endif /* EVAL_BOARD_CONTROL */
#else /* test is not included */
CtrlFlowCnt = 0u; /* reinit control flow variables */
CtrlFlowCntInv = 0xFFFFu;
#endif /* STL_INCL_POR_RAM */
问题点:其它用C编写的自检函数,调用后无异常,此两处需要调用到的这两个用汇编语言编写的自检函数无论如何均不能返回。感觉只要是调用汇编编写的自检函数,都无法ret!因为产品要做认证时需要用到自检程序,希望ST的FAE能提供协助,万分感谢!


楼主
|
回复于 2018-09-07
沙发
运行到 STL_StartUpCPUTest() 程序无法返回, STL_StartUpCPUTest()是汇编代码
if (STL_FullRamMarchC() != FULL_RAM_OK)
运行到 STL_FullRamMarchC() 程序无法返回, STL_StartUpCPUTest()是汇编代码
-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
楼主
|
回复于 2018-09-07
4#
public STL_StartUpCPUTest
extern CtrlFlowCnt
extern CtrlFlowCntInv
extern FailSafe
section .text:code
STL_StartUpCPUTest:
LDW X,CtrlFlowCnt
ADDW X,#3 ; CtrlFlowCnt += CPU_INIT_CALLEE
LDW CtrlFlowCnt,x
; If X is not functional, corruption will be detected later
;
; Check flags of code condition register
CLR A ; Set Z(ero) Flag
JRNE ErrorCPU ; Fails if Z=0
LD A,#1 ; Reset Z Flag
JREQ ErrorCPU ; Fails if Z=1
;
SUB A,#2 ; Set N(egative) Flag (A=0xFF)
JRPL ErrorCPU ; Fails if N=0
ADD A,#2 ; Reset N and set C Flags (Res=0x101)
JRMI ErrorCPU ; Fails if N=1
;
RCF ; Reset C(arry) Flag
JRC ErrorCPU ; Fails if C=1
SCF ; Set C(arry) Flag
JRNC ErrorCPU ; Fails if C=0
;
ADD A,#0FH ; Set H(alf) carry Flag (A=0x10)
JRNH ErrorCPU ; Fails if H=0
ADD A,#0FH ; Reset H(alf) carry Flag (A=0x1F)
JRH ErrorCPU ; Fails if H=1
;
LD A,#80H
ADD A,#80H ; Set V (oVerflow) Flag (Res=0x100)
JRNV ErrorCPU ; Fails if V=0
RVF ; Reset V Flag
JRV ErrorCPU ; Fails if V=1
;
SIM ; Set interrupt mask
JRNM ErrorCPU ; Fails if I0=0
RIM ; Reset I0 bit
JRNM skip ; If I0=O, skip next instruction
ErrorCPU:
LDW X,#0 ; Error Code if spurious return
JP FailSafe
skip:
SIM ; Set I0 bit (mask interrupts)
;
; Check CPU register: A, X, Y
LD A,#0AAH
CP A, #0AAH
JRNE ErrorCPU
LD A,#55H
CP A,#55H
JRNE ErrorCPU
LD A,#11H
;
LDW X,#0AAAAH
CPW X,#0AAAAH
JRNE ErrorCPU
LDW X,#5555H
CPW X,#5555H
JRNE ErrorCPU
LDW X,#1234H
;
LDW Y,#0AAAAH
CPW Y,#0AAAAH
JRNE ErrorCPU
LDW Y,#5555H
CPW Y,#5555H
JRNE ErrorCPU
LDW Y,#5678H
;
; Verify ramp pattern
CP A,#11H
JRNE ErrorCPU
CPW X,#1234H
JRNE ErrorCPU
CPW Y,#5678H
JRNE ErrorCPU
;
; Check Stack pointer
LDW Y,SP ; Save current stack pointer in Y
LDW X,#5555H
LDW SP,X
LDW X,SP
CPW X,#5555H
JRNE ErrorCPU
LDW X,#0AAAAH
LDW SP,X
LDW X,SP
CPW X,#0AAAAH
JRNE ErrorCPU
LDW SP,Y ; Restore stack pointer
;
Exit:
LDW X,CtrlFlowCntInv
SUBW X,#3 ; CtrlFlowCntInv -= CPU_INIT_CALLEE
LDW CtrlFlowCntInv,X
LD A,#1 ; Returns success
RET
;
END
-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
回复于 2018-09-07
6#
-
- xiaomiking
-
1147 发帖6357 回复18609 积分
- 私信他 +关注
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖