自编写NorFlash项目的自动化工具链

来源:互联网 发布:数据结构与算法考点 编辑:程序博客网 时间:2024/05/21 17:17
试想,开发人员只需要编护一个配置文件,就可以立即根据配置信息产生最终的源代码文件和可执行文件,这是多么写意的一件事情。。。

最近进行NorFlash U盘项目的开发时,发现市面上的NorFlash型号非常多,因而要为每一款不同的Flash去编写机械而重复的汇编代码。除了汇编代码本身难编写之外,更重要的是支持当型号增多的时候,庞大的代码更是难以维护。

开发过程中发现汇编中的大部分代码是固定的,而不同的Flash只需要更改读写命令及一些控制的方式。为此,产生了写一个自动化工具的想法。首先把每款Flash的信息保存到某个文件,然后编写一个代码产生器,从文件中取得信息并产生代码;由于每款Flash除了最终生成的汇编代码外,还有其他一些配置文件,这些都应该一次性生成。这样,以后只要编护一个信息文件,就可以通过工具生成所有最终使用的文件。生成源代码后再调用汇编器编译程序,生产bin文件,最后可能还要进行一些后期处理。这些都应该自动化一气呵成地完成。

想法出现后立即按步就班实现:

首先把所有的Flash信息保存在一个xml文件中,每种型号的所有配置信息都写在这个文件中,如Flash容量,Secotr的大小,编程、擦除复位等命令及信息。使用xml的原因是因为他有统一简洁的格式,适合于保存任意的数据,而且有很多公开解释xml的源代码。
xml文件例子如下:

<NorFlash>
    <MBM29DL323TD>
        <Byte Version="V1.00" BlockTotal="0x40" SectorPerBlock="0x80" PostWriteDelay="0x00010F00" ZonePerChip="0x02" BlockPerChip="0x40" BootSectors="0x08" ResetTime="0x400" ClearStatus="0x00">
            <Command ReadDelay="3" WriteDelay="4">
                <ReadID cycle="5">
                    <cmd1 operate="write" address="0xAAA" data="0xAA"/>
                    <cmd2 operate="write" address="0x555" data="0x55"/>
                    <cmd3 operate="write" address="0xAAA" data="0x90"/>
                    <cmd4 operate="read" address="0x000" data="ID1"/>
                    <cmd5 operate="read" address="0x002" data="ID2"/>
                </ReadID>
                <Reset cycle="1">
                    <cmd1 operate="write" address="0x000" data="0xF0"/>
                </Reset>
                <SectorErase cycle="6">
                    <cmd1 operate="write" address="0xAAA" data="0xAA"/>
                    <cmd2 operate="write" address="0x555" data="0x55"/>
                    <cmd3 operate="write" address="0xAAA" data="0x80"/>
                    <cmd4 operate="write" address="0xAAA" data="0xAA"/>
                    <cmd5 operate="write" address="0x555" data="0x55"/>
                    <cmd6 operate="write" address="SA" data="0x30"/>
                </SectorErase>
                <ByteProgram cycle="4">
                    <cmd1 operate="write" address="0xAAA" data="0xAA"/>
                    <cmd2 operate="write" address="0x555" data="0x55"/>
                    <cmd3 operate="write" address="0xAAA" data="0xA0"/>
                    <cmd4 operate="write" address="PA" data="PD"/>
                </ByteProgram>
            </Command>
            <BootSector Count="0x08" BeginAddress="0x003F0000" EndAddress="0x00400000" Space="0x2000">
                <!--BootSector的配置情况-->
            </BootSector>
            <EraseStatus Mode="Toggle" Value="6">
                <!--SectorErase的状态检查方式-->
            </EraseStatus>
            <ProgStatus Mode="Verify" Value="Equ">
                <!--ByteProgram的状态检查方式-->
            </ProgStatus>
        </Byte>
        <Word BlockTotal="0x40" SectorPerBlock="0x80" PostWriteDelay="0x00010F00" BootSectors="0x08" PatchTableOffset="0x200" PatchCodeOffset="0x1000" MsciCodeOffset="0x800"/>
</NorFlash>

然后,编写一个代码产生器,读取该xml文件中的信息,据此选择适当的代码模板,组合成汇编的源代码文件。而且,在这个步骤,也根据xml中的信息产生了其他配置文件。
这个代码产生器是一个命令行程序,读取每一款Flash,产生输出文件后再读取下一个款Flash的信息,再产生相应的文件。

最后,编写了一个小的外壳程序,该程序调用代码产生器,然后再调用汇编器编译链接刚产生的汇编文件,并且进行bin文件的后期处理。最终把运行结果显示出来。

虽然此工具链还未尝试支持更多的Flash,但是很容易在xml文件中加入新的配置项,而不影响原来的信息结构。整个工具链初版编写时间不到三天。使用效果还是不错的^o^
原创粉丝点击