共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 跳转至页
回复
打赏帖 | |
---|---|
嵌入式LinuxC语言程序调试和宏使用技巧被打赏50分 | |
让代码中包含最新的编译时间信息被打赏50分 | |
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】mcxa156使用低功耗定时器适配硬件RTC框架被打赏26分 | |
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 |