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