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.
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 Mon Aug 29 2022 19:53:42 by
