在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3391|回复: 8

[求助] ARM用的编译器是怎么处理LDR伪指令的?

[复制链接]
发表于 2012-11-15 17:05:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
比如 LDR R0,=#12345678H

假设编译器发现该立即数不能通过8位立即数循环移位得到,那么下一步如何做?

编译怎么做的?cpu内核操作有什么特殊操作吗?
发表于 2012-12-3 14:02:41 | 显示全部楼层
不知帮顶
发表于 2012-12-3 16:05:41 | 显示全部楼层
一般会在code区里定义一个word,里面存放这个立即数,然后使用LDR  R0 [code区地址]这条指令来生成这个立即数。
 楼主| 发表于 2012-12-3 17:34:11 | 显示全部楼层
回复 3# free-arm


    感谢,这个code地址应该只有编译器才知道了, 我做了一种处理,你觉得怎样.

       cond 中的  NV 条件 改为 NI(next is  Imm32)  指示下一条指令为32位立即数.比如   


00000100H  :MOVNI  R0                   IF                  ID(sel_off=1&if_vld)     EX(从ROM口中读32位立即数)      
00000104H  :12345678H                                      IF                               ID(被关闭了,sel_off=0)        EX因为ID被关闭,所以不执行

这样用三级流水,只要处理好ID 译码,就能透明的使用32位立即数,当然 一句 MOV R0,12345678H被拆成两句. 但不对后面的语句有任何影响
发表于 2012-12-3 17:39:32 | 显示全部楼层
从rom口读当然没问题,这个改改RTL代码即可实现。
 楼主| 发表于 2012-12-7 11:10:34 | 显示全部楼层
回复 3# free-arm
追问:  Code区指的是ROM中的一块区吧,LDR不是读写RAM的吗?
如果Code区是RAM中的一块,那编译器是写不进不去的.

难道是这样, 编译器先写入ROM中,然后处理器执行指令前 把 ROM里的程序拷贝到RAM中, 代码和数据共存在一块RAM里?
或者是把ROM中的程序放到 ICACHE里,RAM中的数据放到DCACHE里?

大神,你是怎么做的?
发表于 2012-12-7 13:06:25 | 显示全部楼层
是这样的。所有的数据统一编址,从rom_en/rom_addr固然可以访问所有4GB(32位总线对应的地址),从ram_cen也可以访问这些。因此一些常数放在ROM区,也就是0x0开始的地址段内,那么ram_cen只需要把读地址设为0x00??即可访问code区。
 楼主| 发表于 2012-12-8 19:35:35 | 显示全部楼层
回复 7# free-arm


    原来如此,谢谢了!
 楼主| 发表于 2012-12-12 09:19:18 | 显示全部楼层
回复 7# free-arm


    问题又来了,大神的这种做法很明显是把 ROM和RAM分为两条总线同时进行吧.看来要统一起来必须得用CACHE了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 19:22 , Processed in 0.030942 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表