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