完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
AT91SAM系列的ARM内置了一片bootrom, 如果选择了合适的BMS电平(高电平), 那么芯片启动后会将bootrom映射到0x0地址. 启动bootrom后会从外面的的NVM(dataflash, nandflash..)中去寻找是否存在"合法"的固件程序. 如果有就将这个固件拷贝到内部SRAM中来运行. 而这个固件程序我们一般放置的就是bootstrap. 再由它去完成u-boot和kernel等等的搬移.
顺序如下: bootrom (ROM) -> bootstrap (SRAM) -> u-boot (SDRAM) -> kernel (SDRAM) 对于dataflash和nandflash的NVM, ATMEL很巧妙的将第6个向量处放置的内容当做Bootstrap的大小.但是打开AT91bootstrap的源码, 发现第6个向量处有2种写法. 1) B . (或弄一个标号, 跳转本身) 2) .word _edata 第一种是直接放了一跳ARM跳转本身的指令在此位置, 转换为机器码之后是一个非常大的数. 远远超出了SRAM的大小. 第二种是用了汇编器的一个预留关键字_edata, 它是指向数据段的结尾. 按道理应该是和编译出来的bin同样大小才对. 但是自己通过将bin文件打开查看第6个向量确不相等. 后来才觉悟是由于基地址并不是0x0导致, 由于bootstrap最终是在SRAM里运行, 以SAM9260为例,SRAM基地址是0x20000. 所以是_edata=0x20000+程序大小,还是无法满足要求. 这两种方式都不正确,那BOOTROM是怎么知道要拷贝多大的长度呢?我一开始猜想是不超过最大的长度就OK了,即SRAM大小减去BOOTROM程序本身所需的堆栈,这是一个合理的解释,不过实际操作起来会浪费很多时间。而真正的内幕是: 原来SAM-BA软件中有一个send boot file的操作,这个操作暗地里读取文件大小将其写入第六个向量再写入0地址,所以bootstrap必须用SAM-BA的send boot file的方式烧写,如果自己从0地址send file是启动不了的,大家可以做实验验证。 |
|
相关推荐
|
|
625 浏览 0 评论
948 浏览 0 评论
3801 浏览 1 评论
2273 浏览 0 评论
【资料分享】Xilinx Zynq-7010/7020工业核心板规格书(双核ARM Cortex-A9 + FPGA,主频766MHz)
4747 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 粤ICP备14022951号 )
GMT+8, 2023-8-20 01:56 , Processed in 0.572008 second(s), Total 56, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:粤 B2-20160233 工商网监 湘ICP备2023018690号