拿树莓派学习操作系统,每次新生成的内核文件需要烧到tf卡上,插拔操作频繁,既繁琐又损耗设备。所以用串口实现一个简单的bootloader功能,将新代码加载到内存中运行。
原理比较简单,就是用新代码覆盖原来的代码,之后再重头运行即可。这样可以省去插拔tf卡的过程,不过还是需要冷重启。
实现过程中遇到几个问题:
1、串口设备刚上电有可能数据缓冲区有数据,会对正常的收发产生影响;
2、数据覆盖会把串口代码覆盖掉,导致串口通信失败。
所以程序中要保证串口数据的干净和确定,可以正式通信前清空缓存或者用特殊字符作为通信标识。
要将串口等不变化的代码放到代码段前边,这样新代码加载时与老代码一样,不会对函数功能产生影响。
需要改进:
对代码段没有要求,可任意下载任意代码,包括串口部分代码变动等等;
实现对sd卡固件的回写,将代码固化;
只加载改动的部分,bootloader部分保持不动。
在程序不挂的情况下进入bootloader而不需要冷启动。
......(未完待续)
代码实现:
系统启动后从0地址执行,所以把接收到的新代码放到0地址开始的区域,之后从0地址执行代码。
目前该代码必须放在main函数之前(main函数大小改变),后续完善后不再有这些限制。
默认系统编译把一些串口相关代码放到了代码段末尾,main函数之后,可以在链接文件中修改段分布指定函数存放的位置。
增加了.text.utils :{ *(.text.utils)}段,并在函数实现的地方指定
网友评论