先想想下面的问题:
数据为什么要放在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