![]() |
Energy Micro IEC60355 Library Project 1.037 GCC-Version
IEC60355 Library documentation and API
|
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