private void GenerateStartupFiles(MCUFamilyBuilder mcuFamilyBuilder, StartupFileGenerator.InterruptVector[] vectorTable) { var startupFilesPath = Path.Combine(BSPRoot, mcuFamilyBuilder.Definition.FamilySubdirectory, STARTUP_FILES_FOLDER); Directory.CreateDirectory(startupFilesPath); File.Copy(Directories.RulesDir + "/" + "startup.c", startupFilesPath + "/" + "startup.c", true); using (var fs = File.CreateText(string.Format("{0}\\vectors_{1}.c", startupFilesPath, mcuFamilyBuilder.Definition.Name))) { fs.WriteLine("/*"); fs.WriteLine("\tThis file contains the definitions of the interrupt handlers for {0} MCU family.", mcuFamilyBuilder.Definition.Name); fs.WriteLine("\tThe file is provided by Sysprogs under the BSD license.", mcuFamilyBuilder.Definition.Name); fs.WriteLine("*/"); fs.WriteLine(""); fs.WriteLine(""); fs.WriteLine("extern void *_estack;"); fs.WriteLine("#define NULL ((void *)0)"); fs.WriteLine("#define {0} ((void *){1})", TRIM_VALUE_NAME, TRIM_VALUE); fs.WriteLine(""); fs.WriteLine("void Reset_Handler();"); fs.WriteLine("void Default_Handler();"); fs.WriteLine(""); List<string> tableContents = new List<string>(); for (int i = 2; i < vectorTable.Length; i++) { var interrupt = vectorTable[i]; if (interrupt != null) { if (interrupt.Name != TRIM_VALUE_NAME) { fs.WriteLine("void {0}() __attribute__ ((weak, alias (\"Default_Handler\")));", interrupt.Name); tableContents.Add(string.Format("&{0}", interrupt.Name)); } else { tableContents.Add(string.Format("{0}", interrupt.Name)); } } else { tableContents.Add("NULL"); } } fs.WriteLine(""); fs.WriteLine("void * __vect_table[0x{0:x}] __attribute__ ((section (\".vectortable\"))) = ", vectorTable.Length); fs.WriteLine("{"); fs.WriteLine("\t&_estack,"); fs.WriteLine("\t&Reset_Handler,"); for (int i = 0; i < tableContents.Count; i++) { string comma = (i == tableContents.Count - 1) ? "" : ","; fs.WriteLine("\t{0}{1}", tableContents[i], comma); } fs.WriteLine("};"); fs.WriteLine(""); fs.WriteLine("void Default_Handler()"); fs.WriteLine("{"); fs.WriteLine("\tasm(\"BKPT 255\");"); fs.WriteLine("}"); } }