硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3421|回复: 5
收起左侧

[开发工具] MDK将工程指定文件设置到RAM中执行的方法,后面RT1052会用到

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2018-3-19 10:31:58 | 显示全部楼层 |阅读模式
参考例子路径:C:\Keil_v474\ARM\Examples\RamFunction
-----------------------------------------------------------------------
重要说明:
The RamFunction program demonstrates how to define a function that
executes in RAM. This may be useful for IAP Flash programming or to
improve to the performance with slow external Flash devices.

Functions that are be executed in RAM should reside in a seperate
source module. Using the 'Options for File' dialog you can simply change
the 'Code / Const' area of a module to a memory space in physical RAM.

Available memory areas are declared in the 'Target' tab of the
'Options for Target' dialog.

In this example the internal RAM area is split into two areas IRAM1, IRAM2.



如下两个地址进行设置:
QQ截图20180319102831.png

QQ截图20180319102936.png


回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
发表于 2018-3-19 16:00:03 | 显示全部楼层
可以通过这种方法直接将整个C文件里的变量都定义到SDRAM吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2018-3-20 00:59:15 | 显示全部楼层
loliko 发表于 2018-3-19 16:00
可以通过这种方法直接将整个C文件里的变量都定义到SDRAM吗

对于MDK来说,大部分的启动初始化都是封装起来的,可以试试在复位中断服务程序里面优先完成SDRAM的初始化试试看。然后系统会有一个加载数据到RAM中的过程。
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
发表于 2018-3-20 08:47:13 | 显示全部楼层
loliko 发表于 2018-3-19 16:00
可以通过这种方法直接将整个C文件里的变量都定义到SDRAM吗

我在LPC4300上这么样不行,因为在SDRAM还没初始化前就开始搬运了,结果可想而知
回复

使用道具 举报

32

主题

187

回帖

283

积分

高级会员

积分
283
发表于 2018-3-21 09:03:32 | 显示全部楼层
eric2013 发表于 2018-3-20 00:59
对于MDK来说,大部分的启动初始化都是封装起来的,可以试试在复位中断服务程序里面优先完成SDRAM的初始化 ...

3333333333.png
好像系统有个外部ram数据初始化的函数
回复

使用道具 举报

0

主题

154

回帖

154

积分

初级会员

积分
154
发表于 2018-3-21 09:30:06 | 显示全部楼层
本帖最后由 unknownuser 于 2018-3-21 09:33 编辑

真正要安全的做好这件事,最好还是自己写linker file,自己写搬运的代码,比如这种:

EXEC_m_ramfunc  m_ramfunc_start m_ramfunc_size { ; execute address = m_ramfunc_start
  * (ramfunc_section)
  
  1. extern uint32_t Load$EXEC_m_ramfunc$Base[];   // Base address for loading ram function
  2. extern uint32_t Load$EXEC_m_ramfunc$Length[]; // Size of ram function
  3. extern uint32_t Image$EXEC_m_ramfunc$Base[];

  4. uint8_t *codeRelocateRomStart;
  5. uint32_t codeRelocateSize;
  6. uint8_t *codeReloocateRamStart;
  7. codeRelocateRomStart = (uint8_t *)Load$EXEC_m_ramfunc$Base;
  8. codeRelocateSize = (uint32_t)Load$EXEC_m_ramfunc$Length;
  9. while (codeRelocateSize)
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 07:56 , Processed in 0.176673 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表