private void OutputSectionDefinitions(StreamWriter sw) { sw.WriteLine("SECTIONS"); sw.WriteLine("{"); Dictionary<string, bool> referencedMemories = new Dictionary<string, bool>(); string initializedDataSectionLabel = null; foreach (var section in _ScriptTemplate.Sections) { if ((section.Flags & SectionFlags.InitializerInMainMemory) != SectionFlags.None) { string nameAsID = section.Name.TrimStart('.').Replace('.', '_'); initializedDataSectionLabel = "_si" + nameAsID; } } for (int i = 0; i < _ScriptTemplate.Sections.Count; i++) { var section = _ScriptTemplate.Sections[i]; OutputSectionDefinition(sw, "\t", section); referencedMemories[section.TargetMemory] = true; if (initializedDataSectionLabel != null && i < (_ScriptTemplate.Sections.Count - 1)) { bool lastFLASHSection = (section.TargetMemory == _MainFLASH.Name) && (_ScriptTemplate.Sections[i + 1].TargetMemory != _MainFLASH.Name); bool nextSectionIsMainDataSection = (_ScriptTemplate.Sections[i+1].Flags & SectionFlags.InitializerInMainMemory) != SectionFlags.None; if ((lastFLASHSection || nextSectionIsMainDataSection) && !RedirectMainFLASHToRAM) { sw.WriteLine("{0}. = ALIGN(4);", "\t"); //Align initializer data to DWORD boundary as it's copied DWORD-by-DWORD OutputDefinition(sw, initializedDataSectionLabel, ".", "\t"); initializedDataSectionLabel = null; } } } sw.WriteLine("\tPROVIDE(end = .);"); sw.WriteLine(""); foreach (var kv in _Memories) { if (kv.Value == _MainFLASH || kv.Value == _MainRAM) continue; if (referencedMemories.ContainsKey(kv.Key)) continue; string baseName = "." + kv.Key.ToLower() + "_text"; var section = new Section { TargetMemory = kv.Key, Flags = SectionFlags.DefineShortLabels, Name = baseName, Inputs = new List<SectionReference> { new SectionReference { Flags = SectionReferenceFlags.AddPrefixForm } } }; //This is currently not supported until we decide how to initialize those memories based on customer feedback //OutputSectionDefinition(sw, "\t", section); } if (_ScriptTemplate.SectionsAfterEnd != null) { foreach (var section in _ScriptTemplate.SectionsAfterEnd) OutputSectionDefinition(sw, "\t", section); } sw.WriteLine("}"); sw.WriteLine(""); }
void OutputSectionDefinition(StreamWriter sw, string padding, Section section) { string nameAsID = section.Name.TrimStart('.').Replace('.', '_'); string targetMemory; if (RedirectMainFLASHToRAM && section.TargetMemory == _MainFLASH.Name) targetMemory = _MainRAM.Name; else targetMemory = section.TargetMemory; if (_Memories.ContainsKey(targetMemory)) { string loadBase = null; if ((section.Flags & SectionFlags.InitializerInMainMemory) != SectionFlags.None && !RedirectMainFLASHToRAM) { loadBase = "_si" + nameAsID; //OutputDefinition(sw, loadBase, ".", padding); } string modifiers = ""; if ((section.Flags & SectionFlags.NoLoad) != SectionFlags.None) modifiers += " (NOLOAD)"; if (loadBase != null) sw.WriteLine("{0}{1}{2} : AT({3})", padding, section.Name, modifiers, loadBase); else sw.WriteLine("{0}{1}{2} :", padding, section.Name, modifiers); sw.WriteLine(padding + "{"); int alignment = _ScriptTemplate.SectionAlignment; if (section.Alignment != 0) alignment = section.Alignment; if (alignment != 0 && !section.IsUnaligned) sw.WriteLine("{0}\t. = ALIGN({1});", padding, alignment); string startLabel = "."; if ((section.Flags & SectionFlags.InitializerInMainMemory) != SectionFlags.None && RedirectMainFLASHToRAM) startLabel = OutputDefinition(sw, "_si" + nameAsID, startLabel, padding + "\t"); if ((section.Flags & SectionFlags.DefineShortLabels) != SectionFlags.None) startLabel = OutputDefinition(sw, "_s" + nameAsID, startLabel, padding + "\t"); if ((section.Flags & SectionFlags.ProvideLongLabels) != SectionFlags.None) sw.WriteLine("{0}\tPROVIDE(__{1}_start__ = {2});", padding, nameAsID, startLabel); if ((section.Flags & SectionFlags.ProvideLongLabelsLeadingUnderscores) != SectionFlags.None) sw.WriteLine("{0}\tPROVIDE(__{1}_start = {2});", padding, nameAsID, startLabel); if ((section.Flags & SectionFlags.DefineMediumLabels) != SectionFlags.None) sw.WriteLine("{0}\t_{1}_start = {2};", padding, nameAsID, startLabel); if (!string.IsNullOrEmpty(section.CustomStartLabel)) sw.WriteLine("{0}\t{1} = {2};", padding, section.CustomStartLabel, startLabel); if (section.Inputs != null) { foreach (var input in section.Inputs) { string namePattern = input.NamePattern; if (string.IsNullOrEmpty(namePattern)) namePattern = section.Name; OutputSectionReference(sw, padding + "\t", namePattern, input.Flags); } } if (section.CustomContents != null) { foreach (var line in section.CustomContents) sw.WriteLine(padding + "\t" + line); } if (section.Fill != null) { sw.WriteLine("{0}\tFILL(0x{1:X8});", padding, section.Fill.Pattern); sw.WriteLine("{0}\t. = 0x{1:x};", padding, section.Fill.TotalSize); } if (alignment != 0 && !section.IsUnaligned) sw.WriteLine("{0}\t. = ALIGN({1});", padding, alignment); string endLabel = "."; if ((section.Flags & SectionFlags.DefineShortLabels) != SectionFlags.None) endLabel = OutputDefinition(sw, "_e" + nameAsID, ".", padding + "\t"); if ((section.Flags & SectionFlags.ProvideLongLabels) != SectionFlags.None) sw.WriteLine("{0}\tPROVIDE(__{1}_end__ = {2});", padding, nameAsID, endLabel); if ((section.Flags & SectionFlags.ProvideLongLabelsLeadingUnderscores) != SectionFlags.None) sw.WriteLine("{0}\tPROVIDE(__{1}_end = {2});", padding, nameAsID, endLabel); if ((section.Flags & SectionFlags.DefineMediumLabels) != SectionFlags.None) sw.WriteLine("{0}\t_{1}_end = {2};", padding, nameAsID, endLabel); if (!string.IsNullOrEmpty(section.CustomEndLabel)) sw.WriteLine("{0}\t{1} = {2};", padding, section.CustomEndLabel, endLabel); sw.WriteLine(padding + "}" + " > " + targetMemory); } else sw.WriteLine(padding + "# {0} not defined in {1}", targetMemory, _MemoryTemplate.DeviceName); sw.WriteLine(""); }