受到了论坛大佬帖子的启发,也想做个f1c200的快速启动loader看下能不能尽快启动系统。
最近在学习rust,所以正好使用rust来练练手,也算增加点新血液吧。
由于rust没有发现带armv5的target目标,这里就用了下armv5te-unknown-linux-gnueabi的目标。
由于后端链接使用的是arm-none-eabi,所以基本上只用cargo管理项目,rust生成中间代码,gcc生成汇编和C程序
最后用gcc链接便可运行。
目前只实现了最简单的led点亮,和串口输出功能。
内存初始化代码,借用xboot大佬代码使用ffi实现,mmu等参照从写。
目前用release版本大约在3.4k,还是能满足基本,rust抽象还是相当爽的。
目前遇到一个问题,小弟实在没看出来哪里有毛病,系统在初始化mmu后直接跑飞了,我用反汇编看了
实在没看出哪里有毛病。求大神指点迷津,没思路了。
pub fn turn_on(&self) {
mmu_ttb_set(self.base);
mmu_inv_tlb();
mmu_domain_set(3);
mmu_enable();
crate::led_on(); //这里执行不到了
icache_enable();
dcache_enable();
}
源代码项目:https://github.com/shaoxi2010/loader
离线
这个问题我找到原因了,还是自己迁移代码时将MMU的逻辑写错误了,反复对比汇编和ir发现逻辑行为不符合。
挂掉的原因应该是页表初始化问题,访问直接就异常了,目前通过qemu调试已经可以了等下实体机测试下就知道了。
考虑到启动需要解压缩和修改设备树信息,还是觉得优先打开cache要合理的多。
开MMU主要应对之前发现的两个问题
1. SRAM下栈变量和全局变量访问速度很慢,严重的拖慢了高频次操作
2. 不开启cache下DDR下的访问速度也是很难接受的
离线