Energy Micro IEC60355 Library Project 1.037 GCC-Version
IEC60355 Library documentation and API

iec60335_class_b_cpureg_test_bist_arm.s

Go to the documentation of this file.
00001 ;/***************************************************************************/
00030     AREA    |.text|, CODE, READONLY
00031     THUMB
00032 ;/* functions exported */
00033     EXPORT          ASMCPUregTestLOW
00034     EXPORT          ASMCPUregTestHIGH
00035     EXPORT          ASMCPUregTestSP
00036     EXPORT          ASMCPUregTestSPEC
00037 
00038 ;/* external struct */
00039     IMPORT          IEC60335_CPUregTestBIST
00040 
00041 ;/* Test structure offset definitions */
00042 testState           EQU     0x0
00043 testResult          EQU     0x4
00044 
00045 ;/* Test pattern definition */
00046 pattern1            EQU     0xAAAAAAAA
00047 pattern2            EQU     0xAAAAAAA8
00048 pattern3            EQU     0x55555555
00049 pattern4            EQU     0x55555554
00050 pattern5            EQU     0xA8000000
00051 pattern6            EQU     0x50000000
00052 pattern7            EQU     0x000000A0
00053 pattern8            EQU     0x00000060
00054 
00055 ;/* test case flags */
00056 TestClear           EQU     0x00000000
00057 TestState_r0        EQU     0x00000010
00058 TestState_r1r7      EQU     0x00000020
00059 TestState_r8r12     EQU     0x00000040
00060 TestStateMSP        EQU     0x00000100
00061 TestStatePSP        EQU     0x00000200
00062 TestStateLR         EQU     0x00000400
00063 TestStateAPSR       EQU     0x00000800
00064 TestStatePRIMASK    EQU     0x00001000
00065 TestStateFAULTMASK  EQU     0x00002000
00066 TestStateBASEPRI    EQU     0x00004000
00067 
00068 ;/* test results */
00069 TestResult_fail     EQU     0
00070 TestResult_pass     EQU     1
00071 
00072 ;/* CPU register test */
00073 ;/*    registers r0-r7 tests */
00074 ASMCPUregTestLOW
00075 ;/* push registers to stack (atomic instruction) */
00076     push    {r0-r12,r14}
00077     movw    r0,  #0x0000
00078 Test_r0
00079 ;/* register r0 test:
00080 ; * r0 is tested first by immediate instructions
00081 ; * r0 is tested first to keep it free for the following tests */
00082 ;/* cmp instruction to compare with immediate values
00083 ; * byte test requires shift to the LSB */
00084 
00085 ;/* load IEC60335_CPUregTestBIST with test state */
00086     ldr     r0,  =TestClear
00087     ldr     r8,  =TestState_r0
00088     ldr     r9,  =IEC60335_CPUregTestBIST
00089     ldr     r10, [r9]
00090     orr     r8,  r8, r10
00091     str     r8,  [r9,#testState]
00092     str     r0,  [r9,#testResult]
00093 
00094 ;/* r0[31:24] */
00095     movw    r0,  #0x0000
00096     movt    r0,  #0xAA00
00097     lsr     r0,  r0, #24
00098     cmp     r0,  #0xAA
00099     bne     Test_r0_Exit
00100 ;/* r0[23:16] */
00101     movw    r0,  #0x0000
00102     movt    r0,  #0x00AA
00103     lsr     r0,  r0, #16
00104     cmp     r0,  #0xAA
00105     bne     Test_r0_Exit
00106 ;/* r0[15:8] */
00107     movw    r0,  #0xAA00
00108     lsr     r0,  r0, #8
00109     cmp     r0,  #0xAA
00110     bne     Test_r0_Exit
00111 ;/* r0[7:0] */
00112     movw    r0,  #0x00AA
00113     cmp     r0,  #0xAA
00114     bne     Test_r0_Exit
00115 
00116 ;/* use inverse pattern */
00117 ;/* r0[31:24] */
00118     movw    r0,  #0x0000
00119     movt    r0,  #0x5500
00120     lsr     r0,  r0, #24
00121     cmp     r0,  #0x55
00122     bne     Test_r0_Exit
00123 ;/* test r0[23:16] */
00124     movw    r0,  #0x0000
00125     movt    r0,  #0x0055
00126     lsr     r0,  r0, #16
00127     cmp     r0,  #0x55
00128     bne     Test_r0_Exit
00129 ;/* test r0[15:8] */
00130     movw    r0,  #0x5500
00131     lsr     r0,  r0, #8
00132     cmp     r0,  #0x55
00133     bne     Test_r0_Exit
00134 ;/* test r0[7:0] */
00135     movw    r0,  #0x0055
00136     cmp     r0,  #0x55
00137     bne     Test_r0_Exit
00138 
00139 ;/* mark r0 as passed by calling next test */
00140 Test_r0_pass
00141 ;/* load IEC60335_CPUregTestBIST with pass result */
00142     ldr     r0,  =TestResult_pass
00143     str     r0,  [r9,#testResult]
00144 ;/* continue with result */
00145     b       Test_r1_r7
00146 
00147 ;/* register r1-r7 test: */
00148 Test_r1_r7
00149 ;/* step 1:
00150 ; * each registers will be written with pattern1 = 0xAAAA.AAAA
00151 ; * each register will be compared to r0 for the test.
00152 ; * step 2:
00153 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00154 ; * register and compared to r0 */
00155 
00156 ;/* load IEC60335_CPUregTestBIST with test state */
00157     ldr     r0,  =TestClear
00158     ldr     r8,  =TestState_r1r7
00159     ldr     r10, [r9]
00160     orr     r8,  r8, r10
00161     str     r8,  [r9,#testState]
00162     str     r0,  [r9,#testResult]
00163 ;/* load pattern1 to r0 */
00164     ldr     r0,  =pattern1
00165 ;/* load pattern1 to r1-r7 */
00166     mov     r1,  r0
00167     mov     r2,  r0
00168     mov     r3,  r0
00169     mov     r4,  r0
00170     mov     r5,  r0
00171     mov     r6,  r0
00172     mov     r7,  r0
00173 ;/* test pattern1 */
00174     cmp     r1,  r0
00175     bne     Test_r1_r7_Exit
00176     cmp     r2,  r0
00177     bne     Test_r1_r7_Exit
00178     cmp     r3,  r0
00179     bne     Test_r1_r7_Exit
00180     cmp     r4,  r0
00181     bne     Test_r1_r7_Exit
00182     cmp     r5,  r0
00183     bne     Test_r1_r7_Exit
00184     cmp     r6,  r0
00185     bne     Test_r1_r7_Exit
00186     cmp     r7,  r0
00187     bne     Test_r1_r7_Exit
00188 
00189 ;/* load pattern3 to r0 */
00190     ldr     r0,  =pattern3
00191 ;/* load pattern3 to r1-r7 */
00192     mov     r1,  r0
00193     mov     r2,  r0
00194     mov     r3,  r0
00195     mov     r4,  r0
00196     mov     r5,  r0
00197     mov     r6,  r0
00198     mov     r7,  r0
00199 ;/* test pattern3 */
00200     cmp     r1,  r0
00201     bne     Test_r1_r7_Exit
00202     cmp     r2,  r0
00203     bne     Test_r1_r7_Exit
00204     cmp     r3,  r0
00205     bne     Test_r1_r7_Exit
00206     cmp     r4,  r0
00207     bne     Test_r1_r7_Exit
00208     cmp     r5,  r0
00209     bne     Test_r1_r7_Exit
00210     cmp     r6,  r0
00211     bne     Test_r1_r7_Exit
00212     cmp     r7,  r0
00213     bne     Test_r1_r7_Exit
00214 
00215 Test_r1_r7_pass
00216 ;/* load IEC60335_CPUregTestBIST with pass result */
00217     ldr     r0,  =TestResult_pass
00218     str     r0,  [r9,#testResult]
00219 ;/* continue with result
00220 ; * or one of the test failed: */
00221 Test_r0_Exit
00222 Test_r1_r7_Exit
00223 ;/* pop the stack back to registers (atomic instruction) */
00224     pop        {r0-r12,r14}
00225 ;/* branch with exchange back */
00226     bx      lr
00227 
00228 
00229 ;/*    registers r8-r12 tests */
00230 ASMCPUregTestHIGH
00231 ;/* register r1-r7 test: */
00232 Test_r8_r12
00233 ;/* step 1:
00234 ; * each registers will be written with pattern1 = 0xAAAA.AAAA
00235 ; * each register will be compared to r0 for the test.
00236 ; * step 2:
00237 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00238 ; * register and compared to r0 */
00239 
00240 ;/* push registers to stack (atomic instruction) */
00241     push    {r0-r12,r14}
00242 
00243 ;/* load IEC60335_CPUregTestBIST with test state */
00244     ldr     r0,  =TestClear
00245     ldr     r5,  =TestState_r8r12
00246     ldr     r6,  =IEC60335_CPUregTestBIST
00247     ldr     r7,  [r6]
00248     orr     r5,  r5, r7
00249     str     r5,  [r6,#testState]
00250     str     r0,  [r6,#testResult]
00251 
00252 ;/* load pattern1 to r0 */
00253     ldr     r0,  =pattern1
00254 ;/* load pattern1 to r8-r12 */
00255     mov     r8,  r0
00256     mov     r9,  r0
00257     mov     r10, r0
00258     mov     r11, r0
00259     mov     r12, r0
00260 ;/* test pattern1 */
00261     cmp     r8,  r0
00262     bne     Test_r8_r12_Exit
00263     cmp     r9,  r0
00264     bne     Test_r8_r12_Exit
00265     cmp     r10, r0
00266     bne     Test_r8_r12_Exit
00267     cmp     r11, r0
00268     bne     Test_r8_r12_Exit
00269     cmp     r12, r0
00270     bne     Test_r8_r12_Exit
00271 
00272 ;/* load pattern3 to r0 */
00273     ldr     r0,  =pattern3
00274 ;/* load pattern3 to r8-r12 */
00275     mov     r8,  r0
00276     mov     r9,  r0
00277     mov     r10, r0
00278     mov     r11, r0
00279     mov     r12, r0
00280 ;/* test pattern3 */
00281     cmp     r8,  r0
00282     bne     Test_r8_r12_Exit
00283     cmp     r9,  r0
00284     bne     Test_r8_r12_Exit
00285     cmp     r10, r0
00286     bne     Test_r8_r12_Exit
00287     cmp     r11, r0
00288     bne     Test_r8_r12_Exit
00289     cmp     r12, r0
00290     bne     Test_r8_r12_Exit
00291 
00292 Test_r8_r12_pass
00293 ;/* load IEC60335_CPUregTestBIST with pass result */
00294     ldr     r0,  =TestResult_pass
00295     str     r0,  [r6,#testResult]
00296 ;/* continue with result
00297 ; * or the test failed: */
00298 Test_r8_r12_Exit
00299 ;/* pop the stack back to registers (atomic instruction) */
00300     pop     {r0-r12,r14}
00301 ;/* branch with exchange back */
00302     bx      lr
00303 
00304 ;/*    registers SP tests */
00305 ASMCPUregTestSP
00306 ;/* MainSP test: */
00307 Test_MSP
00308 ;/* step 1:
00309 ; * select the MSP as stack pointer and
00310 ; * use mov command to read/write with different pattern
00311 ; * compare to r0 for the test.
00312 ; * step 2:
00313 ; * use mrs/msr command to read/write with different pattern
00314 ; * register and compared to r0
00315 ; * MSP[1:0] is always read as zero */
00316 
00317 ;/* disable interrupts */
00318     mov     r0,  #1
00319     msr     PRIMASK, r0
00320 ;/* push registers to stack */
00321     push    {r0-r12,r14}
00322 ;/* save the CONTROL register value */
00323     mrs     r3,  CONTROL
00324 
00325 ;/* load IEC60335_CPUregTestBIST with test state */
00326     ldr     r0,  =TestClear
00327     ldr     r8,  =TestStateMSP
00328     ldr     r9,  =IEC60335_CPUregTestBIST
00329     ldr     r10, [r9]
00330     orr     r8,  r8, r10
00331     str     r8,  [r9,#testState]
00332     str     r0,  [r9,#testResult]
00333 
00334 ;/* set MSP as default stack */
00335     mov     r6,  #0x0
00336     msr     CONTROL, r6
00337 ;/* save current MSP content */
00338     mov     r4,  r13
00339 
00340 ;/* verify MSP as stack pointer */
00341     mrs     r5,  MSP
00342     cmp     r4,  r5
00343     bne     Test_MSP_Exit
00344 ;/* Step1 */
00345 ;/* load pattern2 to MSP */
00346     ldr     r0,  =pattern2
00347     mov     r13, r0
00348 ;/* compare with r0 */
00349     cmp     r13, r0
00350     bne     Test_MSP_Exit
00351 
00352 ;/* load pattern4 to MSP */
00353     ldr     r0,  =pattern4
00354     mov     r13, r0
00355 ;/* compare with r0 */
00356     cmp     r13, r0
00357     bne     Test_MSP_Exit
00358 
00359 ;/* Step2 */
00360 ;/* load pattern2 to MSP and read back r1 */
00361     ldr     r0,  =pattern2
00362     msr     MSP, r0
00363     mrs     r1,  MSP
00364 ;/* compare r1 with r0 (indirect) */
00365     cmp     r1,  r0
00366     bne     Test_MSP_Exit
00367 
00368 ;/* load pattern4 to MSP and read back r1 */
00369     ldr     r0,  =pattern4
00370     msr     MSP, r0
00371     mrs     r1,  MSP
00372 ;/* compare r1 with r0 (indirect) */
00373     cmp     r1,  r0
00374     bne     Test_MSP_Exit
00375 Test_MSP_pass
00376 ;/* restor MSP content */
00377     mov     r13,  r4
00378 ;/* load IEC60335_CPUregTestBIST with pass result */
00379     ldr     r0,  =TestResult_pass
00380     str     r0,  [r9,#testResult]
00381 ;/* continue with result */
00382     b       Test_PSP
00383 
00384 ;/* PSP register test: */
00385 Test_PSP
00386 ;/* step 1:
00387 ; * select the PSP as stack pointer and
00388 ; * use mov command to read/write with different pattern
00389 ; * compare to r0 for the test.
00390 ; * step 2:
00391 ; * use mrs/msr command to read/write with different pattern
00392 ; * register and compared to r0
00393 ; * PSP[1:0] is always read as zero */
00394 ;/* save the CONTROL register value */
00395     mrs     r3,  CONTROL
00396 
00397 ;/* load IEC60335_CPUregTestBIST with test state */
00398     ldr     r0,  =TestClear
00399     ldr     r8,  =TestStatePSP
00400     ldr     r10, [r9]
00401     orr     r8,  r8, r10
00402     str     r8,  [r9,#testState]
00403     str     r0,  [r9,#testResult]
00404 
00405 ;/* set PSP as default stack */
00406     mov     r6,  #0x02
00407     msr     CONTROL, r6
00408 ;/* save current PSP content */
00409     mrs     r4,  PSP
00410 
00411 ;/* verify PSP as stack pointer */
00412     mrs     r5,  PSP
00413     cmp     r4,  r5
00414     bne     Test_PSP_Exit
00415 ;/* Step1 */
00416 ;/* load pattern2 to PSP */
00417     ldr     r0,  =pattern2
00418     mov     r13, r0
00419 ;/* compare with r0 */
00420     cmp     r13, r0
00421     bne     Test_PSP_Exit
00422 
00423 ;/* load pattern4 to PSP */
00424     ldr     r0,  =pattern4
00425     mov     r13, r0
00426 ;/* compare with r0 */
00427     cmp     r13, r0
00428     bne     Test_PSP_Exit
00429 
00430 ;/* Step2 */
00431 ;/* load pattern2 to PSP and read back r1 */
00432     ldr     r0,  =pattern2
00433     msr     PSP, r0
00434     mrs     r1,  PSP
00435 ;/* compare r1 with r0 (indirect) */
00436     cmp     r1,  r0
00437     bne     Test_PSP_Exit
00438 
00439 ;/* load pattern4 to PSP and read back r1 */
00440     ldr     r0,  =pattern4
00441     msr     PSP, r0
00442     mrs     r1,  PSP
00443 ;/* compare r1 with r0 (indirect) */
00444     cmp     r1,  r0
00445     bne     Test_PSP_Exit
00446 
00447 Test_PSP_pass
00448 ;/* load IEC60335_CPUregTestBIST with pass result */
00449     ldr     r0,  =TestResult_pass
00450     str     r0,  [r9,#testResult]
00451 ;/* continue with result */
00452     b       Test_PSP_Exit
00453 
00454 Test_MSP_Exit
00455 ;/* restore CONTROL and MSP */
00456     msr     CONTROL, r3
00457     mov     r13, r4
00458     b       Test_SP_Exit
00459 
00460 Test_PSP_Exit
00461 ;/* restore CONTROL and PSP */
00462     msr     PSP, r4
00463     msr     CONTROL, r3
00464 
00465 Test_SP_Exit
00466 ;/* enable interrupts */
00467     mov     r0,  #0
00468     msr     PRIMASK, r0
00469 
00470 ;/* pop the stack back to registers (atomic instruction) */
00471     pop     {r0-r12,r14}
00472 ;/* branch with exchange back */
00473     bx      lr
00474 
00475 ;/*    CPU SFR registers tests */
00476 ASMCPUregTestSPEC
00477 ;/* chained tests for all SFR registers of the CPU */
00478 ;/* push registers to stack */
00479     push    {r0-r12,r14}
00480 
00481 ;/* LR register test: */
00482 Test_LR
00483 ;/* step 1:
00484 ; * LR registers will be written with pattern1 = 0xAAAA.AAAA
00485 ; * and will be compared to r0 for the test.
00486 ; * step 2:
00487 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the
00488 ; * register and compared to r0 */
00489 
00490 ;/* save the LR register content */
00491     mov     r3,  r14
00492 
00493 ;/* load IEC60335_CPUregTestBIST with test state */
00494     ldr     r0,  =TestClear
00495     ldr     r8,  =TestStateLR
00496     ldr     r10, [r9]
00497     orr     r8,  r8, r10
00498     str     r8,  [r9,#testState]
00499     str     r0,  [r9,#testResult]
00500 
00501 ;/* load pattern1 to LR */
00502     ldr     r0,  =pattern1
00503     mov     r14, r0
00504 ;/* compare with r0 */
00505     cmp     r14, r0
00506     bne     Test_LR_Exit
00507 
00508 ;/* load pattern3 to LR */
00509     ldr     r0,  =pattern3
00510     mov     r14, r0
00511 ;/* compare with r0 */
00512     cmp     r14, r0
00513     bne     Test_LR_Exit
00514 
00515 Test_LR_pass
00516 ;/* restore LR register */
00517     mov     r14, r3
00518 
00519 ;/* load IEC60335_CPUregTestBIST with pass result */
00520     ldr     r0,  =TestResult_pass
00521     str     r0,  [r9,#testResult]
00522 ;/* continue with result */
00523     b       Test_APSR
00524 
00525 Test_LR_Exit
00526 ;/* restore LR register and branch to eror condition */
00527     mov     r14, r3
00528     b       Test_CPU_SFR_fail
00529 
00530 ;/* APSR register test: */
00531 Test_APSR
00532 ;/* step 1:
00533 ; * APSR registers will be written with pattern5 = 0xA800.0000
00534 ; * and will be compared to r0 for the test.
00535 ; * step 2:
00536 ; * the inverse pattern pattern6 = 0x5000.0000 is written to the
00537 ; * register and read back to r1 and compared to r0
00538 ; * IPSR and EPSR are read-only */
00539 
00540 ;/* save the APSR register content */
00541     mrs     r3,  APSR
00542 
00543 ;/* load IEC60335_CPUregTestBIST with test state */
00544     ldr     r0,  =TestClear
00545     ldr     r8,  =TestStateAPSR
00546     ldr     r10, [r9]
00547     orr     r8,  r8, r10
00548     str     r8,  [r9,#testState]
00549     str     r0,  [r9,#testResult]
00550 
00551 ;/* load pattern5 to APSR */
00552     ldr     r0,  =pattern5
00553     msr     APSR, r0
00554 ;/* read and compare with r0 */
00555     mrs     r1,  APSR
00556     cmp     r1,  r0
00557     bne     Test_APSR_Exit
00558 
00559 ;/* load pattern6 to APSR */
00560     ldr     r0,  =pattern6
00561     msr     APSR, r0
00562 ;/* read and compare with r0 */
00563     mrs     r1,  APSR
00564     cmp     r1,  r0
00565     bne     Test_APSR_Exit
00566 
00567 Test_APSR_pass
00568 ;/* restore APSR register */
00569     msr     APSR, r3
00570 
00571 ;/* load IEC60335_CPUregTestBIST with pass result */
00572     ldr     r0,  =TestResult_pass
00573     str     r0,  [r9,#testResult]
00574 ;/* continue with result */
00575     b       Test_PRIMASK
00576 
00577 Test_APSR_Exit
00578 ;/* restore APSR register and branch to eror condition */
00579     msr        APSR, r3
00580     b       Test_CPU_SFR_fail
00581 
00582 ;/* PRIMASK register test: */
00583 Test_PRIMASK
00584 ;/* step 1:
00585 ; * PRIMASK registers [:0] will be written with 0x0000.0000
00586 ; * and will be compared to r0 for the test.
00587 ; * step 2:
00588 ; * the inverse pattern 0x0000.0001 is written to the
00589 ; * register and read back to r1 and compared to r0 */
00590 
00591 ;/* save the PRIMASK register content */
00592     mrs     r3,  PRIMASK
00593 
00594 ;/* load IEC60335_CPUregTestBIST with test state */
00595     ldr     r0,  =TestClear
00596     ldr     r8,  =TestStatePRIMASK
00597     ldr     r10, [r9]
00598     orr     r8,  r8, r10
00599     str     r8,  [r9,#testState]
00600     str     r0,  [r9,#testResult]
00601 
00602 ;/* load pattern to PRIMASK */
00603     mov     r0,  #0
00604     msr     PRIMASK, r0
00605 ;/* read and compare with r0 */
00606     mrs     r1,  PRIMASK
00607     cmp     r1,  r0
00608     bne     Test_PRIMASK_Exit
00609 
00610 ;/* load pattern to PRIMASK */
00611     mov     r0,  #1
00612     msr     PRIMASK, r0
00613 ;/* read and compare with r0 */
00614     mrs     r1,  PRIMASK
00615     cmp     r1,  r0
00616     bne     Test_PRIMASK_Exit
00617 
00618 Test_PRIMASK_pass
00619 ;/* restore PRIMASK register */
00620     msr     PRIMASK, r3
00621 
00622 ;/* load IEC60335_CPUregTestBIST with pass result */
00623     ldr     r0,  =TestResult_pass
00624     str     r0,  [r9,#testResult]
00625 ;/* continue with result */
00626     b       Test_FAULTMASK
00627 
00628 Test_PRIMASK_Exit
00629 ;/* restore PRIMASK register */
00630     msr     PRIMASK, r3
00631     b       Test_CPU_SFR_fail
00632 
00633 ;/* FAULTMASK register test: */
00634 Test_FAULTMASK
00635 ;/* step 1:
00636 ; * FAULTMASK registers [:0] will be written with 0x0000.0000
00637 ; * and will be compared to r0 for the test.
00638 ; * step 2:
00639 ; * the inverse pattern 0x0000.0001 is written to the
00640 ; * register and read back to r1 and compared to r0 */
00641 
00642 ;/* save the FAULTMASK register content */
00643     mrs     r3,  FAULTMASK
00644 
00645 ;/* load IEC60335_CPUregTestBIST with test state */
00646     ldr     r0,  =TestClear
00647     ldr     r8,  =TestStateFAULTMASK
00648     ldr     r10, [r9]
00649     orr     r8,  r8, r10
00650     str     r8,  [r9,#testState]
00651     str     r0,  [r9,#testResult]
00652 
00653 ;/* load pattern to FAULTMASK */
00654     mov     r0,  #0
00655     msr     FAULTMASK, r0
00656 ;/* read and compare with r0 */
00657     mrs     r1,  FAULTMASK
00658     cmp     r1,  r0
00659     bne     Test_FAULTMASK_Exit
00660 
00661 ;/* load pattern to FAULTMASK */
00662     mov     r0,  #1
00663     msr     FAULTMASK, r0
00664 ;/* read and compare with r0 */
00665     mrs     r1,  FAULTMASK
00666     cmp     r1,  r0
00667     bne     Test_FAULTMASK_Exit
00668 
00669 Test_FAULTMASK_pass
00670 ;/* restore FAULTMASK register */
00671     msr     FAULTMASK, r3
00672 
00673 ;/* load IEC60335_CPUregTestBIST with pass result */
00674     ldr     r0,  =TestResult_pass
00675     str     r0,  [r9,#testResult]
00676 ;/* continue with result */
00677     b       Test_BASEPRI
00678 
00679 Test_FAULTMASK_Exit
00680 ;/* restore FAULTMASK register */
00681     msr     FAULTMASK, r3
00682     b       Test_CPU_SFR_fail
00683 
00684 ;/* BASEPRI register test: */
00685 Test_BASEPRI
00686 ;/* step 1:
00687 ; * BASEPRI registers [7:0] will be written with pattern7 = 0x0000.00AA
00688 ; * and will be compared to r0 for the test.
00689 ; * step 2:
00690 ; * the inverse pattern pattern8 = 0x0000.0055 is written to the
00691 ; * register and read back to r1 and compared to r0 */
00692 
00693 ;/* save the BASEPRI register content */
00694     mrs     r3,  BASEPRI
00695 
00696 ;/* load IEC60335_CPUregTestBIST with test state */
00697     ldr     r0,  =TestClear
00698     ldr     r8,  =TestStateBASEPRI
00699     ldr     r10, [r9]
00700     orr     r8,  r8, r10
00701     str     r8,  [r9,#testState]
00702     str     r0,  [r9,#testResult]
00703 
00704 ;/* load pattern7 to BASEPRI */
00705     ldr     r0,  =pattern7
00706     msr     BASEPRI, r0
00707 ;/* read and compare with r0 */
00708     mrs     r1,  BASEPRI
00709     cmp     r1,  r0
00710     bne     Test_BASEPRI_Exit
00711 
00712 ;/* load pattern8 to BASEPRI */
00713     ldr     r0,  =pattern8
00714     msr     BASEPRI, r0
00715 ;/* read and compare with r0 */
00716     mrs     r1,  BASEPRI
00717     cmp     r1,  r0
00718     bne     Test_BASEPRI_Exit
00719 
00720 Test_BASEPRI_pass
00721 ;/* restore BASEPRI register */
00722     msr     BASEPRI, r3
00723 
00724 ;/* load IEC60335_CPUregTestBIST with pass result */
00725     ldr     r0,  =TestResult_pass
00726     str     r0,  [r9,#testResult]
00727 ;/* continue with result */
00728     b       Test_CPU_SFR_Exit
00729 
00730 Test_BASEPRI_Exit
00731 ;    /* Restore the BASEPRI */
00732     msr     BASEPRI, r3
00733     b       Test_CPU_SFR_fail
00734 
00735 Test_CPU_SFR_fail
00736 ;/* returns a positiv test result */
00737     ldr     r0,  =TestResult_fail
00738     str     r0,  [r9,#testResult]
00739 Test_CPU_SFR_Exit
00740 ;/* pop the stack back to registers (atomic instruction) */
00741     pop     {r0-r12,r14}
00742 ;/* branch with exchange back */
00743     bx      lr
00744 ;/* end of CPU SFR registers tests */
00745     NOP
00746     END