打印
[ZLG-ARM]

存放code 的ram区域设置为no cach吗?

[复制链接]
1891|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ma1986|  楼主 | 2009-10-30 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
hanhui03| | 2009-10-30 23:00 | 只看该作者
程序执行的空间是可以被 CACHE 的! 以提高效率, 但是使用时要注意:

1: 如果是使用 ARM720T 之类的 CPU (冯诺依曼结构). 直接把代码从 ROM 搬到 RAM 然后修改 PC
    就可以运行了, 因为这类 CPU 只有统一的 CACHE, 指令数据共享一个 CACHE 所以不会有什么问题

2: 如果是使用 ARM920T (或更高)之类的 CPU(哈佛结构). 直接把代码从 ROM 搬到 RAM 然后修改 PC
    程序是不能正常运行的!!! 因为 CPU CACHE 分为两部分: 指令和数据. 两个 CACHE 的操作是完全独立
   的. 你把代码当作数据搬到 RAM 实际使用的是 D-CACHE(数据 CACHE). 其实还有一部分没有搬到实
   际的 RAM 中(仅存在在D-CACHE中). 所以运行可能会出现问题!!!

    使用CPU拷贝代码并运行, 正确的步骤如下:
    1: 将代码拷贝到 RAM  
   2: 将 D-CAHCE 没有回写的数据回写内存(同时记得清楚写缓冲器)
    3: 将 I-CACHE(指令CACHE)设置为无效(访问不命中)
    4: 跳转程序执行 RAM 代码即可!!!

    使用DMA拷贝代码并运行, 正确的步骤如下:
    1: 将 D-CAHCE 没有回写的数据回写内存(同时记得清楚写缓冲器)
    2: 操作 DMA 搬运代码!
    3: 如果等待 DMA 搬运的过程中没有 RAM 操作. 直接将 D-CACHE 无效!
    4: 将 I-CACHE(指令CACHE)设置为无效(访问不命中)
    5: 跳转程序执行 RAM 代码即可!!!

    以上方法默认 MMU 将所有的地址都设置为 CACHE 模式. (当然有了页表的配合, 还有很多更优的方法)
    期待你的发现!!!

    祝你好运!

好久没上了! 都变样了!

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ma1986 + 1
板凳
linhai1986| | 2009-10-30 23:03 | 只看该作者
学习了

使用特权

评论回复
地板
ma1986|  楼主 | 2009-10-31 10:25 | 只看该作者
2# hanhui03

谢谢你的答复。。另外,我想请假一个问题,就是一般什么情况下发生 未定义指令异常和data abort异常呢???异常的时候,我发现我的svc的sp超过我分配的空间。

我将ROM里面的代码和数据映射到了bank6上。。
base of rom: 0x0c050000
top of rom:  0x0c087ed4
base of bss: 0x0c087ed4
base ofzero: 0x0c08b67c
end of bss:  0x0c090878

^ (DRAM_END - 0x800);//0xc800000-0x800
这样是不是程序的临时变量只能在0x0c090878~~0x0c7ff800里面任意定义呢???
^用来表示该空间不可以用来存放临时变量吗???
会不会发生这种情况:我在0x0c090878~~0x0c7ff800里面存放的临时变量很少,但是有时候就偏偏存放在该区域的最末尾,正好此时我的svc的sp溢出,覆盖了svc是stack,当他出栈的时候,比如取出数据到pc的时候,发现不在我映射的代码段中,或者按照pc指向的数据当成指令进行处理的时候,发生了未定义指令。。。我分析的对吗???

使用特权

评论回复
5
desert_hawk| | 2009-10-31 19:42 | 只看该作者
二楼所说的要拷贝的部分指令遗留在DCache的问题,把所要拷贝到的目的RAM区域设置为非回写模式就可以解决了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

101

帖子

1

粉丝