赞
踩
前段时间翻出老古董mini2440,欲学个Linux,一番视频刷下来到了硬件裸机这一块
但看视频里的老师验证程序使用的JLINK编程器,想想那玩意卖得贵而且用的少,又想到Bin文件能运行在ram中,于是尝试一波,分享如下
1.使用Mini2440里面的bootload烧写u-boot到Nandflash(这个自行百度或者看光盘里的操作),对于win10等新系统,上位机DNW可能不可用了,这里推荐一个叫SuperVivi-Transfer的软件,另外如果Bootloader是superboot可以自行参考
首先板子里的bootloader是老板的supervivi,后续考虑折腾下如何升级为superboot,
但是supervivi的上位机传输文件一直出错(莫名报错文件太大),所以此处暂时不使用之,
所以暂时使用uboot完成,下载到RAM中运行
uboot一开始烧录普通的例程还能运行通过,但到外部中断那一节就运行不起来的,按下按键触发的不是裸机里的而是U-boot中的测试程序,所以推测中断是跳到别的地方去了。
注意生成Bin文件的配置,fromelf.exe --bin -o .\obj\@p.bin .\obj\@p.axf
注意obj是生成的目标文件夹,在output选项可查看
如果是C工程(包含了启动文件S3C2440A.s或者其他),查看链接脚本(例程里提供了)
上述链接脚本提示:Run in RAM,记住那个加载地址,此处为:0x30000000
Nand启动开发板,串口输入任意进入uboot
输入loadb [下载地址]
其中下载的地址为前面记录的链接起始地址
通过secureCRT的kermit传送Bin文件
输入 go [下载地址] 运行code
一般代码这个时候运行没什么问题,但在中断处理还需要改一些东西
S3C2440中的中断向量表放在0x00000000开始的区域,下面是启动文件S3C2440A.s的中断向量表
显然中断向量表放的跳转指令,但遗憾的是我的程序是下载到RAM中运行的,这里是放在0x300000000开始的地方,这段代码对应Bin文件的开始段,同时uboot运行也会执行第一条指令
继续往下看启动文件,正好放了一个地址,也就是正好跳到了复位函数
某专家在Reset_Handler里面添加了如下代码,拷贝bin中向量表到0x00000000
注:部分例程common文件夹里面有添加
补丁1:光盘里某个例程里有这段,看注释是拷贝大概1K左右,但不知道被谁改成32字节了,这里可以把32改成1K应该也行。
但遗憾的是Keil将向量表编译为以下汇编
显然这是相对寻址,bin文件里跳转是跳到它写的处理函数,它肯定放在0x300000000以后的区域,但是实际机器运行中断时PC指向的为0开始的那块区域,相对寻址是跳不到bin文件里的函数的,所以某种意义上来说前面添加的向量表拷贝操作还不足以实现
这里提供一个简单粗暴的方法:
方法很简单:main函数或者某个地方添加如下处理(注意这里0x300000000是链接的加载地址,若修改之此处也要修改)
至于为什么是4K,可查询S3C2440的nand启动方式
- #include<string.h>
- memcpy(0,(void*)0x30000000,4*1024*1024); //这个放在main函数最开始的地方暂无问题
经测试,按键的例程能运行无误
当然不用担心会损坏Bootload,在nand flash启动下,首先bank0的nor flash无法访问,其次前4k仅写入ram,不会影响flash内容。
当然4K肯定是够了,因为从启动文件可以看到,他们中断向量跳转后执行的是一些简单的中断判断,最终是要跳到一个比较大的区域,下面是外部中断的处理
最后一句执行了某个神奇的跳转指令,跳转的范围很大,
即跳转到最后的中断向量V表,RAM最后的一段,而例程里面就是将中断函数地址赋给这个表
事情到这差不多结束了,无需再深究下去。
我李某真TM是个天才
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。