美文网首页
实现串口下载的简单bootloader

实现串口下载的简单bootloader

作者: gcrisis | 来源:发表于2019-04-28 23:04 被阅读0次

    拿树莓派学习操作系统,每次新生成的内核文件需要烧到tf卡上,插拔操作频繁,既繁琐又损耗设备。所以用串口实现一个简单的bootloader功能,将新代码加载到内存中运行。

    原理比较简单,就是用新代码覆盖原来的代码,之后再重头运行即可。这样可以省去插拔tf卡的过程,不过还是需要冷重启。

    实现过程中遇到几个问题:

        1、串口设备刚上电有可能数据缓冲区有数据,会对正常的收发产生影响;

        2、数据覆盖会把串口代码覆盖掉,导致串口通信失败。

    所以程序中要保证串口数据的干净和确定,可以正式通信前清空缓存或者用特殊字符作为通信标识。

    要将串口等不变化的代码放到代码段前边,这样新代码加载时与老代码一样,不会对函数功能产生影响。

    需要改进:

        对代码段没有要求,可任意下载任意代码,包括串口部分代码变动等等;

        实现对sd卡固件的回写,将代码固化;

        只加载改动的部分,bootloader部分保持不动。

        在程序不挂的情况下进入bootloader而不需要冷启动。

        ......(未完待续)    

    代码实现:

    系统启动后从0地址执行,所以把接收到的新代码放到0地址开始的区域,之后从0地址执行代码。

    目前该代码必须放在main函数之前(main函数大小改变),后续完善后不再有这些限制。

    默认系统编译把一些串口相关代码放到了代码段末尾,main函数之后,可以在链接文件中修改段分布指定函数存放的位置。

    增加了.text.utils :{ *(.text.utils)}段,并在函数实现的地方指定

    相关文章

      网友评论

          本文标题:实现串口下载的简单bootloader

          本文链接:https://www.haomeiwen.com/subject/dpusnqtx.html