瑞萨建立数据表格及查表指令求助
| SMOVB.size | 按地址减小的方向,依次将一段内存的数据逐个传送到另一段内存中。其中,被传送数据的源地址为由R1H和A0构成的20位地址,目的地址在A1中,传送次数存在R3中 |
| SMOVF.size | 按地址增加的方向,依次将一段内存的数据逐个传送到另一段内存中。其中,被传送数据的源地址为由R1H和A0构成的20位地址,目的地址在A1中,传送次数存在R3中 |
先想想下面的问题:
数据为什么要放在RAM中呢?一般来说RAM的资源比ROM更稀缺,如果是固定数据,最好放在ROM中,如果希望提高访问速度,那就放在地址 < 10000H德Data Flash中。只是因为在同样的情况下,使用MOV(64K以内的寻址)指令的时间 < 使用LDE(>64K的寻址)指令。
好吧,假设你的数据需要随时修改,并且要求速度快,那么就放在RAM中吧。
那么现在来看第二个问题(先不管你是使用C还是汇编,呵呵):
如何把ROM的数据放在RAM中。
1 假设你只是在初始化的时候放数据。那就简单了,因为初始化不需要考虑时间。直接用C更直观。 for ( i = 0; i < 1000; i ++ ) * RAM ++ = * ROM ++;
2 假设你需要在程序中常常完成搬运。那么你有3种方案。
a 和1一样,这种方案的特点是速度慢,但是由于其优先基低没有什么其他限制,非常方便。
b 使用SMOVF和SMOVB指令,特点是速度快,缺点也很明显,需要使用汇编语言,这对于C的构架很麻烦,不过幸好,瑞萨的编译器提供这2个汇编语句的宏函数!但是在这个过程会被中断终止。所以需要屏蔽中断先。
c 如果你觉得速度很重要而中断又不能被屏蔽。那么没有办法,你只能用DMA了。这个优点就多了,速度快,优先级高,比中断和CPU都高。缺点是需要占用DMA,初始化麻烦。
好了,现在假设你已经把数据放在乐RAM中,为了叙述方便,放在400H处吧。(特别注意,为了尽可能的提高速度,请放在偶数地址。没办法,M16C/60是16位机!)那么如何快速查表呢?
为了快速查表,我们需要把表的位置等信息映射在CPU内部,但是CPU的寄存器在正常程序中也要使用,这个时候使用第二组寄存器就体现优势了(M16C有2组CPU寄存器)。
先初始化:
FSET B ;切换寄存器组
MOV.W #0, A0 ;A0指向数组表起始
MOV.W #XXX,A1 ;A1指向目的地址
好了,如果需要查表,就如下写。
FSET B
MOV.W #400[A0], [A1]
FCLR B
回复
| 有奖活动 | |
|---|---|
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
我要赚赏金打赏帖 |
|
|---|---|
| 以启明云端ESP32P4开发板实现TF卡读写功能被打赏¥28元 | |
| 【分享开发笔记,赚取电动螺丝刀】树莓派5串口UART0配置被打赏¥25元 | |
| 【STM32F103ZET6】17:分享在Rtos项目中断管理的使用经验被打赏¥23元 | |
| 【STM32F103ZET6】16:分享在中断中恢复串口任务,遇到的问题被打赏¥31元 | |
| 在FireBeetle2ESP32-C5上实现温度大气压检测及显示被打赏¥21元 | |
| 【分享开发笔记,赚取电动螺丝刀】SAME51双串口收发配置被打赏¥27元 | |
| Chaos-nano操作系统在手持式VOC检测设备上的应用被打赏¥37元 | |
| 【分享开发笔记,赚取电动螺丝刀】关于在导入第三方库lib时,wchart类型冲突的原因及解决方案被打赏¥30元 | |
| 在FireBeetle2ESP32-C5上实现温湿度检测和显示被打赏¥20元 | |
| 在FireBeetle2ESP32-C5上实现光照强度检测及显示被打赏¥21元 | |
我要赚赏金
