Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXAS21002 FXOS8700Q
TestsGenarator.py
00001 # This script responsible to generate C files. 00002 # The generated C files will create a TestSuite 00003 # for the Stack Usage analyzer. 00004 import os 00005 import shutil 00006 00007 00008 SCRIPTDIR = os.path.dirname(os.path.realpath(__file__)) 00009 TEMPLATEFILE = os.path.join(SCRIPTDIR, 'Template', 'template.c') 00010 TESTSDIR = os.path.join(SCRIPTDIR, 'Tests') 00011 function_pointer_list = [] 00012 STACK_UNIT_SIZE = 1024 00013 STACK_UNIT_NUM = 3 00014 00015 00016 def generate_functions(filename, includes, mainfunction, variables, targetcall): 00017 generated = open(os.path.join(TESTSDIR, filename+'.c'), "a") 00018 generated_header = open(os.path.join(TESTSDIR, filename+'.h'), "a") 00019 template = open(TEMPLATEFILE, "r") 00020 main_added = False 00021 vars_added = False 00022 00023 # insert includes if exist 00024 if len(includes) != 0: 00025 for inc in includes.split(';'): 00026 generated.write('#include \"' + inc + '\"\n') 00027 00028 # insert test main function 00029 for line in template: 00030 if main_added == True and vars_added == False: 00031 if line.strip() == "{": 00032 continue 00033 # insert variables if exist 00034 if len(variables) != 0: 00035 for var in variables.split(';'): 00036 if len(var.strip(' ')) == 0: 00037 continue 00038 generated.write("\t"+var.strip(' ')+";\n") 00039 generated.write(line) 00040 vars_added = True 00041 continue 00042 00043 if line.strip() == "int stackUsage_Template()": 00044 generated_header.write("int "+mainfunction + "();\n") 00045 generated.write("int "+mainfunction + "()\n{\n") 00046 main_added = True 00047 if mainfunction in function_pointer_list: 00048 print "Error! This function already exist in the functions vector\n" 00049 raise Exception('This function: "'+ mainfunction + '" is already exist in the functions vector') 00050 function_pointer_list.append(mainfunction) 00051 elif line.strip() == "Template_Func();": 00052 generated.write("\t"+targetcall+"\n") 00053 00054 else: 00055 generated.write(line) 00056 generated.write('/***********************************************************************/\n') 00057 generated.write("\n\n") 00058 generated.write('/***********************************************************************/\n') 00059 generated.close() 00060 generated_header.close() 00061 template.close() 00062 00063 00064 def generate_new_source_files(filename): 00065 if os.path.exists(TESTSDIR): 00066 shutil.rmtree(TESTSDIR) 00067 00068 os.mkdir(TESTSDIR) 00069 00070 generated_c = open(os.path.join(TESTSDIR, filename+'.c'), "w") 00071 generated_h = open(os.path.join(TESTSDIR, filename+'.h'), "w") 00072 00073 generated_c.write('/* This file was generated automatically */\n') 00074 generated_c.write("#include \""+filename+".h\"\n") 00075 generated_c.write("\n\n") 00076 generated_c.close() 00077 00078 generated_h.write('/**********************************************************************\n') 00079 generated_h.write('* This file was generated automatically and it describes the generated\n') 00080 generated_h.write('* Source file "'+filename+'.c" which contains stack usage test functions\n') 00081 generated_h.write('* for the listed functions in the "TargetFunction.txt" file.\n') 00082 generated_h.write('* Please do NOT edit these files (header and source) for requests please\n') 00083 generated_h.write('* send an email to PAL team leader: Alex.Volinski@arm.com \n') 00084 generated_h.write('**********************************************************************/\n\n') 00085 generated_h.write("#ifndef _FUNCTIONS_VECTOR_H_\n") 00086 generated_h.write("#define _FUNCTIONS_VECTOR_H_\n") 00087 generated_h.write("#include <stdlib.h>\n") 00088 generated_h.write("#include <stdio.h>\n") 00089 generated_h.write("#include <stdbool.h>\n") 00090 generated_h.write("#define STACK_UNIT_SIZE "+ str(STACK_UNIT_SIZE) +"\n") 00091 generated_h.write("#define STACK_UNIT_NUM "+ str(STACK_UNIT_NUM) +"\n") 00092 generated_h.write("char* paintStack();\n\n") 00093 generated_h.close() 00094 00095 00096 def create_functions_struct(filename): 00097 00098 add_comma = False 00099 generated_h = open(os.path.join(TESTSDIR, filename+'.h'), "a") 00100 generated_h.write("\n\n#define BORDER_ARRAY_SIZE 32\n") 00101 generated_h.write("#define FUNC_NUM "+ str(len(function_pointer_list)) +"\n") 00102 generated_h.write("#define PATTERN_SIZE 4\n") 00103 generated_h.write("#define INIT_VALUE 190\n") 00104 generated_h.write("#define MAX_CHAR_VALUE 256\n") 00105 generated_h.write("\ntypedef struct{\n\tint (*fp)();\n\tchar name[64];\n}functionNode;\n") 00106 generated_h.write("\nstatic char memPattern[PATTERN_SIZE] = {0xDE, 0xAD, 0xFA, 0xCE};\n") 00107 generated_h.write("\nstatic functionNode funcArray[FUNC_NUM] = {\n") 00108 00109 for func in function_pointer_list: 00110 if add_comma: 00111 generated_h.write(",\n") 00112 generated_h.write('{'+func+",\""+func[len("StackUsage_"):]+"()\"}") 00113 add_comma = True 00114 00115 generated_h.write("};\n\n") 00116 generated_h.write("#endif //_FUNCTIONS_VECTOR_H_\n") 00117 generated_h.close() 00118 00119 00120 def create_runner_source(vector_filename): 00121 runner_c = open(os.path.join(TESTSDIR, 'TestSuiteRunner.c'), "w") 00122 00123 runner_c.write('/* This file was generated automatically */\n') 00124 runner_c.write("#include \""+vector_filename+".h\"\n\n") 00125 runner_c.write("void main()\n{\n") 00126 runner_c.write("\tint i = 0;\n") 00127 runner_c.write("\tfor (; i < FUNC_NUM ; ++i)\n\t{\n") 00128 runner_c.write("\t\tprintf(\"%s function used: %d bytes in the stack\\n\", funcArray[i].name ,funcArray[i].fp());\n\t}\n") 00129 runner_c.write("\tprintf(\"Test Finished!\\n\");\n") 00130 runner_c.write("}\n") 00131 00132 00133 def create_runner_header(): 00134 generated_h = open(os.path.join(TESTSDIR, 'TestSuiteRunner.h'), "w") 00135 generated_h.write('/**********************************************************************\n') 00136 generated_h.write('* This file was generated automatically and it describes the generated\n') 00137 generated_h.write('* Source file "TestSuiteRunner.c" which contains the test runner function\n') 00138 generated_h.write('* for the listed functions in the "TargetFunction.txt" file.\n') 00139 generated_h.write('* Please do NOT edit these files (header and source) for requests please\n') 00140 generated_h.write('* send an email to PAL team \n') 00141 generated_h.write('**********************************************************************/\n\n') 00142 generated_h.write("#ifndef _TES_SUITE_RUNNER_H_\n") 00143 generated_h.write("#define _TES_SUITE_RUNNER_H_\n") 00144 generated_h.write("\nint TestSuiteRunner();\n\n") 00145 generated_h.write("#endif //_TES_SUITE_RUNNER_H_\n") 00146 00147 00148 def generate_paint_stack(): 00149 runner_c = open(os.path.join(TESTSDIR, 'functionsVector.c'), "a") 00150 runner_c.write("#pragma GCC diagnostic push\n") 00151 runner_c.write("#pragma GCC diagnostic ignored \"-Wreturn-local-addr\"\n") 00152 runner_c.write("/* We can not return the address of the (stackArr) directly, it will be NULL in run-time\n") 00153 runner_c.write("* Therefore new pointer (arrayPtr) required to hold the address of the (stackArr)*/\n") 00154 runner_c.write("char* paintStack()\n{\n") 00155 runner_c.write("\tchar* arrayPtr = NULL;\n") 00156 runner_c.write("\tchar stackArr[STACK_UNIT_NUM*STACK_UNIT_SIZE] = {0};\n") 00157 runner_c.write("\tint i = 0;\n") 00158 runner_c.write("\tfor(i=0; i < STACK_UNIT_NUM*STACK_UNIT_SIZE; ++i)\n\t{\n") 00159 runner_c.write("\t\t// Painting the stack with memory pattern (DEADFACE) XORed running index to make the stack more unique\n") 00160 runner_c.write("\t\tstackArr[i] = memPattern[i%PATTERN_SIZE] ^ (i%MAX_CHAR_VALUE);\n\t}\n") 00161 runner_c.write("\tarrayPtr = stackArr;\n") 00162 runner_c.write("\treturn arrayPtr;\n}\n") 00163 runner_c.write("#pragma GCC diagnostic pop\n\n") 00164 00165 00166 def main(): 00167 generate_new_source_files('functionsVector') 00168 f = open('TargetFunctions.txt', 'r') 00169 for line in f: 00170 if line.strip() == 'List Finished!': 00171 print "Code generation finished successfully" 00172 break 00173 if line[0] == "#" or line[0] == "\n": 00174 continue 00175 print "Reading new line: "+ line 00176 list = line.strip().split('$') 00177 generate_functions('functionsVector', list[0].strip(' '), list[1].strip(' '), list[2].strip(' '), list[3].strip(' ')) 00178 create_functions_struct('functionsVector') 00179 create_runner_source('functionsVector') 00180 generate_paint_stack() 00181 create_runner_header() 00182 if __name__ == '__main__': 00183 main()
Generated on Tue Jul 12 2022 20:21:03 by
