示例#1
0
        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("}");
            }
        }