/******************************************************************************/ /* test.ini: Initialization file to test the debug functionality */ /******************************************************************************/ /* This file is part of the uVision/ARM development tools. */ /* Copyright (c) 2012-2017 Keil Software. All rights reserved. */ /* This software may only be used under the terms of a valid, current, */ /* end user license from KEIL for a compatible version of KEIL software */ /* development tools. Nothing else gives you the right to use this software. */ /******************************************************************************/ // ensure logging into file is turned off LOG OFF // overall test success flag define int testSuccess; testSuccess = 0; // flags to show which particular tests succeeded define char bpExecSuccess; bpExecSuccess = 0; define char bpReadSuccess; bpReadSuccess = 0; define char bpWriteSuccess; bpWriteSuccess = 0; define char memReadSuccess; memReadSuccess = 0; define char memWriteSuccess; memWriteSuccess = 0; define char regReadSuccess; regReadSuccess = 0; define char regWriteSuccess; regWriteSuccess = 0; // function to read and write registers FUNC void RegReadWrite(void) { unsigned long VR0, VR1, VR2, VR3, VR4, VR5, VR6, VR7, VR8, VR9; unsigned long VR10, VR11, VR12, VR13, VR14, VR15, VxPSR; unsigned long VR_0, VR_1, VR_2, VR_3, VR_4, VR_5, VR_6, VR_7, VR_8, VR_9; unsigned long VR_10, VR_11, VR_12, VR_13, VR_14, VR_15, V_xPSR; unsigned long bogus; bogus = 0x0badF00D; printf("Register read started\n"); // initialize temporary variables with bogus value VR0 = bogus; VR1 = bogus; VR2 = bogus; VR3 = bogus; VR4 = bogus; VR5 = bogus; VR6 = bogus; VR7 = bogus; VR8 = bogus; VR9 = bogus; VR10 = bogus; VR11 = bogus; VR12 = bogus; VR13 = bogus; VR14 = bogus; VR15 = bogus; VxPSR = bogus; // read and save current register values VR0 = R0; VR1 = R1; VR2 = R2; VR3 = R3; VR4 = R4; VR5 = R5; VR6 = R6; VR7 = R7; VR8 = R8; VR9 = R9; VR10 = R10; VR11 = R11; VR12 = R12; VR13 = R13; VR14 = R14; VR15 = R15; VxPSR = xPSR; // print read register values printf("R0 = 0x%x\n", VR0); printf("R1 = 0x%x\n", VR1); printf("R2 = 0x%x\n", VR2); printf("R3 = 0x%x\n", VR3); printf("R4 = 0x%x\n", VR4); printf("R5 = 0x%x\n", VR5); printf("R6 = 0x%x\n", VR6); printf("R7 = 0x%x\n", VR7); printf("R8 = 0x%x\n", VR8); printf("R9 = 0x%x\n", VR9); printf("R10 = 0x%x\n", VR10); printf("R11 = 0x%x\n", VR11); printf("R12 = 0x%x\n", VR12); printf("R13 = 0x%x\n", VR13); printf("R14 = 0x%x\n", VR14); printf("R15 = 0x%x\n", VR15); printf("xPSR = 0x%x\n", VxPSR); // check if all values differ from bogus value regReadSuccess = (VR0 != bogus) && (VR1 != bogus) && (VR2 != bogus) && (VR3 != bogus) && (VR4 != bogus) && (VR5 != bogus) && (VR6 != bogus) && (VR7 != bogus) && (VR8 != bogus) && (VR9 != bogus) && (VR10 != bogus) && (VR11 != bogus) && (VR12 != bogus) && (VR13 != bogus) && (VR14 != bogus) && (VR15 != bogus) && (VxPSR != bogus); if (regReadSuccess != 0) { printf("Register read passed\n"); } else { printf("Register read failed\n"); // there is no reason to test write if read fails return; } printf("Register write started\n"); // fill all registers with bogus value R0 = bogus; R1 = bogus; R2 = bogus; R3 = bogus; R4 = bogus; R5 = bogus; R6 = bogus; R7 = bogus; R8 = bogus; R9 = bogus; R10 = bogus; R11 = bogus; R12 = bogus; // register R13-R15 and xPSR on hardware do not accept 0x0badf00d, use 0x0 instead R13 = 0x0; R14 = 0x0; R15 = 0x0; xPSR = 0x0; // read back into another array VR_0 = R0; VR_1 = R1; VR_2 = R2; VR_3 = R3; VR_4 = R4; VR_5 = R5; VR_6 = R6; VR_7 = R7; VR_8 = R8; VR_9 = R9; VR_10 = R10; VR_11 = R11; VR_12 = R12; VR_13 = R13; VR_14 = R14; VR_15 = R15; V_xPSR = xPSR; // print the values again printf("R0 = 0x%x\n", VR_0); printf("R1 = 0x%x\n", VR_1); printf("R2 = 0x%x\n", VR_2); printf("R3 = 0x%x\n", VR_3); printf("R4 = 0x%x\n", VR_4); printf("R5 = 0x%x\n", VR_5); printf("R6 = 0x%x\n", VR_6); printf("R7 = 0x%x\n", VR_7); printf("R8 = 0x%x\n", VR_8); printf("R9 = 0x%x\n", VR_9); printf("R10 = 0x%x\n", VR_10); printf("R11 = 0x%x\n", VR_11); printf("R12 = 0x%x\n", VR_12); printf("R13 = 0x%x\n", VR_13); printf("R14 = 0x%x\n", VR_14); printf("R15 = 0x%x\n", VR_15); printf("xPSR = 0x%x\n", V_xPSR); // check if new values are bogus regWriteSuccess = (VR_0 == bogus) && (VR_1 == bogus) && (VR_2 == bogus) && (VR_3 == bogus) && (VR_4 == bogus) && (VR_5 == bogus) && (VR_6 == bogus) && (VR_7 == bogus) && (VR_8 == bogus) && (VR_9 == bogus) && (VR_10 == bogus) && (VR_11 == bogus) && (VR_12 == bogus) && (VR_13 == 0x0) && (VR_14 == 0x0) && (VR_15 == 0x0) && (V_xPSR == 0x0); if (regWriteSuccess != 0) { printf("Register write passed\n"); } else { printf("Register write failed\n"); } // write saved values back into registers // values are required to be written correctly for the rest of the test R0 = VR0; R1 = VR1; R2 = VR2; R3 = VR3; R4 = VR4; R5 = VR5; R6 = VR6; R7 = VR7; R8 = VR8; R9 = VR9; R10 = VR10; R11 = VR11; R12 = VR12; R13 = VR13; R14 = VR14; R15 = VR15; xPSR = VxPSR; } // function to write predefined numbers into test_array1 FUNC void MemWrite(unsigned long address) { unsigned int i; unsigned int val; printf("Memory write started\n"); val = 0x1000; for (i = 0; i < 256; i++) { _WWORD(address, val); val++; address += 4; } printf("Memory write completed\n"); } // function to read from test_array2 and check if write and read was successful FUNC void MemRead(unsigned long address) { unsigned int i; unsigned int val, v; printf("Memory read started\n"); val = 0x1000; memReadSuccess = 1; // assume it is true for (i = 0; i < 256; i++) { v = _RWORD(address); if (v != val) { memReadSuccess = 0; } val++; address += 4; } if (memReadSuccess != 0) { printf("Memory read passed\n"); } else { printf("Memory read failed\n"); } } // check execution breakpoint FUNC void CheckBpExec(unsigned long address) { // PC should be at address and value of bpTestCounter variable should be 9 if ((R15 == address) && (`bpTestCounter == 9)) { bpExecSuccess = 1; } printf("Execution breakpoint (%d): %d\n", `bpTestCounter, bpExecSuccess); } // check breakpoint on read FUNC void CheckBpRead(int test_state) { // PC should be at address if (`test_state == test_state) { bpReadSuccess = 1; } printf("Breakpoint on read: %d\n",bpReadSuccess); } // check breakpoint on write FUNC void CheckBpWrite(int test_state) { // PC should be at address if (`test_state == test_state) { bpWriteSuccess = 1; } printf("Breakpoint on write: %d\n", bpWriteSuccess); } // evaluate test FUNC void EvalSuccess(void) { char success; success = testSuccess && bpExecSuccess && bpReadSuccess && bpWriteSuccess && regReadSuccess && regWriteSuccess && memReadSuccess && memWriteSuccess; exec("LOG >.\\test_results.txt"); // print test results to log file if (success) { printf("Test passed!\n"); } else { printf("Test failed!\n"); } printf("\nIndividual test results:\n"); printf("Execution breakpoint: "); if (bpExecSuccess) { printf("passed\n"); } else { printf("failed\n"); } printf("Breakpoint on read: "); if (bpReadSuccess) { printf("passed\n"); } else { printf("failed\n"); } printf("Breakpoint on write: "); if (bpWriteSuccess) { printf("passed\n"); } else { printf("failed\n"); } printf("Register read: "); if (regReadSuccess) { printf("passed\n"); } else { printf("failed\n"); } printf("Register write: "); if (regWriteSuccess) { printf("passed\n"); } else { printf("failed\n"); } printf("Memory read: "); if (memReadSuccess) { printf("passed\n"); } else { printf("failed\n"); } printf("Memory write: "); if (memWriteSuccess) { printf("passed\n"); } else { printf("failed\n"); } printf("Control flow: "); if (testSuccess) { printf("passed\n"); } else { printf("failed\n"); } exec("LOG OFF"); } LOG >.\\test.log // start logging RegReadWrite(); // check register read/write BK * // remove all existing breakpoints BS \test.c\43, 9 // set execution breakpoint (hit count=9) G // run to break point CheckBpExec(\test.c\43); // check execution breakpoint BK * // remove all existing breakpoints BS READ test_success // set a read access breakpoint G // run to break point CheckBpRead(11); // check breakpoint on read BK * // remove all existing breakpoints BS WRITE test_success // set a write access breakpoint G // run to break point CheckBpWrite(12); // check breakpoint on write BK * // remove all existing breakpoints G,\test.c\61 // run until line 61 MemWrite(&test_array1[0]); // test memory write G,\test.c\69 // run until line 69 memWriteSuccess = `mem_rw_success; // application memory test result MemRead(&test_array2[0]); // test memory read T 3 // step 3 times `test_state -= 16; // modify 'test_state' application variable G,\test.c\88 // run until line 88 testSuccess = `test_success; // read 'test_success' application variable LOG OFF // stop logging EvalSuccess(); // evaluate test results EXIT // exit debug mode