最近遇到龙芯LS1C0300B win+eclipseCPU 不运行/卡死/编译 问题。
现象:编译完成无报错,烧写进去CPU不运行。
怀疑可能是没移植好。然后就认认真真的排查了各种初始化代码(main.c里面的代码,还有串口初始化),没问题啊;
然后测试电压晶振,都正常;
感觉CPU不应该一点都起不来吧,所以又不得不去看start.S的代码。然后发现CPU运行不正常会打印异常代码的啊,继续查看,发现打印异常代码需要用汇编驱动串口,默认是串口2,修改成串口11(我做的板子上设计的调试口是串口11,在start.S里面修改哦),不会的可以参考下图串口2修改
仿照这两个,写串口11即可。
然后编译,下载。打印出asm uart2 init ok!,然后又继续找这个提示信息,将2改成11,再编译下载,打印出asm uart11 init ok!,证明串口11调通了。
但不打印其他任何信息,证明CPU可以正常跑,肯定是程序不对了。然后将添加的几个文件挨个添加,屏蔽函数,一步一步操作,最后定位:u8 unxxxxx[130]; 数组。屏蔽掉就好了,不屏蔽就不运行。难道是内存满了?正好就差这个数组?那我将130修改为1,编译后也不运行;证明不是内存满的问题;
然后百度mips 的读取。发现个好东西:
(https://www.cnblogs.com/nx520zj/p/5653461.html)
[ 3.MIPS平台的地址对齐。
在 MIPS 平台上,lh 读取一个半字时,存储器的地址必须是 2 的整数倍; lw 读取一个字时,存储器的地址必须是 4的整数倍; sd 写入一个双字时,存储器的地址必须是 8 的整数倍。倘若访存时,目标地址不对齐,则会引起异常,典型的是系统提示“总线错误”后,直接杀死进程。]
原来是4的倍数才行,将130改成4,编译后成功运行,改成256,也是成功运行,因为刚开始是130,2的倍数,不能运行;所以证明的确是4字节对齐的原因。
为什么是4字节对齐?可能是mips本身架构的原因,也可能是编译优化的原因。编译后将变量存储到了奇数的地址或者 是一个四字节地址中的第二或者第三字节的位置,那肯定会发生数据错位,那么CPU就可能跑飞了。
龙芯LS1C0300B win+eclipseCPU 不运行/卡死/编译 问题
最新推荐文章于 2023-05-25 16:05:21 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)