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

iec60335_class_b_cpureg_test_bist_gcc.asm

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