这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 如何将ARM内部Flash中的程序搬运到外部RAM运行?

共9条 1/1 1 跳转至

如何将ARM内部Flash中的程序搬运到外部RAM运行?

菜鸟
2005-11-29 01:11:57 打赏
小弟最近做一个项目,用的是Philips的LPC2292,由于代码比较庞大,ARM内的Flash资源有限,想考虑如何在上电的时候将程序从内部的Flash拷贝的外部的RAM,使它在外部RAM运行,这样子外部RAM配置大一点,就不会出什么问题。 由于对ARM启动方面的知识了解有限,想和各位大虾讨论一下怎么实现。不知道单在编译器ADS中将生成代码的地址修改一下是否就可以了?中断向量(或boot loader)需不需要重新映射到外部RAM。 谢谢!



关键词: 如何 内部 Flash 中的 程序 运到 外部

菜鸟
2005-11-29 06:54:00 打赏
2楼
你参考一下这篇文章吧,也许你有帮助: http://bbs.edw.com.cn/dispbbs.asp?boardID=20&ID=27980&page=2 关于中断向量,你只要保证在地址0X0就可以了。

菜鸟
2005-11-30 04:04:00 打赏
3楼
谢谢!我大概看了一下,感觉需要了解的内容很多,再慢慢琢磨琢磨。也看了您写的关于bootloader的文章,很精辟,以后不懂得地方还望不吝赐教!

菜鸟
2005-11-30 06:20:00 打赏
4楼
twentyone大侠,看了您写的bootloader的文章,有些疑惑,希望赐教。 我想问一下,为什么要把BootLoader也复制到SDRAM中,直接运行在Flash中,把内核搬到0x800000不可以吗?还有,您的内核是直接用ADS编译的吗?这样编译后代码中还包含有BootLoader的信息吗?这样跳到0x800000中执行是不是又会执行BootLoader,这样不就陷入一种循环了吗?这些问题可能比较傻,见笑:)

菜鸟
2005-11-30 18:38:00 打赏
5楼
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来装载内核镜像。

菜鸟
2005-11-30 19:53:00 打赏
6楼
谢谢twentyone大侠,明白您的意思了。 我现在考虑的比较简单,只是想做一个简单的搬运,可以不用操作系统,只是一些初始化程序和用户程序,用的是Windows下的ADS编译器,编译出来是一个整体,然后用JTAG下载到ARM内部的Flash当中,因为Flash的地址是从0x00000000开始的,所以上电后完成硬件时钟、中断等初始化程序后切换到main()就可以运行了。这样子在编译好的映像文件中好像区分不出来那些是初始化程序,那些是用户程序main()了,这样子的简单操作是不是不能实现搬运呀? 还有,您的Linux编译器编译后ARM可以执行吗?是不是只要编译成二进制文件,ARM就能执行,还是必需是针对特定ARM的编译器编译。 对您在百忙之中的回复深表感谢!!!

菜鸟
2005-12-01 05:41:00 打赏
7楼
1. 你可以用两个独立的程序来实现。第一个程序实现初始化,完成后,把第二个程序装载到RAM里运行。第二个程序作为你的应用程序,实现你需要的功能。这两个程序是独立的,你把第二个程序编译好后,生成二进制文件,导到第一个程序里去,让第一个程序装载。 2. 在linux下编译的话,要用ARM的交叉编译工具,以保证编译好的程序能在ARM上运行。因为PC上运行的LINUX是X86平台的,所以需要用ARM-LINUX-GCC或者是ARM-ELF-GCC进行编译,这样就可以在X86平台下编译生成能在ARM平台运行的二进制文件。

菜鸟
2005-12-02 04:01:00 打赏
8楼
万分感谢twentyone大侠的解答。 学到了许多东西!

菜鸟
2005-12-02 20:58:00 打赏
9楼
不客气,相互学习,相互提高。[em01][em01]

共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]