共9条
1/1 1 跳转至页
如何将ARM内部Flash中的程序搬运到外部RAM运行?
3楼
谢谢!我大概看了一下,感觉需要了解的内容很多,再慢慢琢磨琢磨。也看了您写的关于bootloader的文章,很精辟,以后不懂得地方还望不吝赐教!
4楼
twentyone大侠,看了您写的bootloader的文章,有些疑惑,希望赐教。
我想问一下,为什么要把BootLoader也复制到SDRAM中,直接运行在Flash中,把内核搬到0x800000不可以吗?还有,您的内核是直接用ADS编译的吗?这样编译后代码中还包含有BootLoader的信息吗?这样跳到0x800000中执行是不是又会执行BootLoader,这样不就陷入一种循环了吗?这些问题可能比较傻,见笑:)
1. 把BOOTLOADER也搬到SDRAM里面去的一个原因是为了实现REMAP。在REMAP以前,FLASH @ 0-2M SDRAM @ 2-18M,REMAP后,SDRAM @ 0-16M FLASH @ 16-18M. REMAP后,为linux的运行创建好环境。如果在你的应用当中不能REMAP或者不需要REMAP,你可以不拷贝FLASH的。
2. 我的内核是用linux编译的。我用到的内核镜像是不包括BOOTLOADER的,所以不会重复执行BOOTLOADER。你可以简单的认为BOOTLOADER和内核镜像两个独立的程序,BOOTLOADER的运行地址是=0x0,内核的运行地址=0x8000。通过BOOTLOADER来装载内核镜像。
6楼
谢谢twentyone大侠,明白您的意思了。
我现在考虑的比较简单,只是想做一个简单的搬运,可以不用操作系统,只是一些初始化程序和用户程序,用的是Windows下的ADS编译器,编译出来是一个整体,然后用JTAG下载到ARM内部的Flash当中,因为Flash的地址是从0x00000000开始的,所以上电后完成硬件时钟、中断等初始化程序后切换到main()就可以运行了。这样子在编译好的映像文件中好像区分不出来那些是初始化程序,那些是用户程序main()了,这样子的简单操作是不是不能实现搬运呀?
还有,您的Linux编译器编译后ARM可以执行吗?是不是只要编译成二进制文件,ARM就能执行,还是必需是针对特定ARM的编译器编译。
对您在百忙之中的回复深表感谢!!!
1. 你可以用两个独立的程序来实现。第一个程序实现初始化,完成后,把第二个程序装载到RAM里运行。第二个程序作为你的应用程序,实现你需要的功能。这两个程序是独立的,你把第二个程序编译好后,生成二进制文件,导到第一个程序里去,让第一个程序装载。
2. 在linux下编译的话,要用ARM的交叉编译工具,以保证编译好的程序能在ARM上运行。因为PC上运行的LINUX是X86平台的,所以需要用ARM-LINUX-GCC或者是ARM-ELF-GCC进行编译,这样就可以在X86平台下编译生成能在ARM平台运行的二进制文件。
共9条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |