| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- /******************************************************************************/
- /* 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
|