Energy Micro IEC60355 Library Example Project 1.0 (internal use only!) GCC-Version
Example project demonstrating POST and BIST library functions

iec60335_class_b_cpureg_test_bist_iar.s

Go to the documentation of this file.
00001 ;/***************************************************************************/
00030     SECTION        .text:CODE
00031     THUMB
00032 ;/* functions exported */
00033     PUBLIC         ASMCPUregTestLOW
00034     PUBLIC         ASMCPUregTestHIGH
00035     PUBLIC         ASMCPUregTestSP
00036     PUBLIC         ASMCPUregTestSPEC
00037 
00038 ;/* external struct */
00039     EXTERN         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