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

iec60335_class_b_cpureg_test_post_iar.s

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