关于数据存储,寻址,内存映射,硬件指针的总结与应用

      最近在做一个测量阻抗心率的算法,背景是基于阻抗测量原理,运用家用人体秤的金属电极片(或者ITO),进行人体心率的检测和测量,达到心率健康检测的目的。应用场景在于家庭健康测量方面。

      在算法设计和调试过程中,因为内存映射理解不深刻,硬件指针应用不熟练,过程中走了很多弯路。比如在内存翻PAGE,翻BANK的问题上,由于对直接寻址和间接寻址的理解误差,导致心率算法版本更新迭代时,花费了较多时间。因此 本文以CSU18MX91为例,对数据存储,寻址,内存映射,硬件指针做一个简单的总结,用以后续项目中,可以快速的进行程序的开发和问题的定位。

       CSU18MX91是一款支持4电极交流测脂,心率测量,高精度人体称重的SOC。


程序存储:

     1. 包含8192*16bit的MTP程序存储;即汇编指令位宽为16bit, 可以存储8M的程序。

其中,指令包含操作数和操作码。但不同功能的指令因实现不同,操作数和操作码的位宽也会不同:

有些指令操作码占用了16位,无操作数:

// 操作码为16位, 误操作数	
ADDPCW	    //查表
CLRWDT	
HALT	
NOP	
RETFIE	
RETURN	
SLEEP	
PUSH	
POP	

有些指令操作码为3bit, 操作数为13bit:

// 操作码为3位,操作数为13位
CALL  k	    //因为地址总线的位宽为13位,因此直接地址跳转的指令的操作数都是13位,剩下的3位为操作码
GOTO  k	

有些指令组成为:1个操作码(4bit)+操作数1(9bit)+操作数2(3bit):

//操作码为4bit, f(Register)为9bit,b为3bit
BCF  f,b	
BSF  f,b	
BTFSC  f,b	
BTFSS  f,b	    //之所以f(Register)为9bit,是因为1个page由两个bank,1个Page总的RAM空间为1FF(两个256)

有些指令组成为:1个操作码(8bit)+1个操作数(8bit) 

//操作码(8bit)+操作数(8bit)
ADDLW  k	    //对work操作的指令,为8bit+8bit;
ANDLW  k	
CLRF    f(7,9)	//直接对寄存器,不论是哪个bank,为7bit+9bit;
IORLW   k	
MOVFW  f(7,9)	
MOVLW  k	
MOVWF  f(7,9)	
RETLW   k	
SUBLW   k	
XORLW   k	
TBLP     k	
MOVP    	
DAW     	

有些指令操作码(6bit)+操作码1(9bit)+操作码2(1bit):

// 
ADDWF  f,d	    
ADDWFC f,d	
ANDWF  f,d	
COMF  f,d	
DECF  f,d	
DECFSZ  f,d	
INCF  f,d	
INCFSZ  f,d	
IORWF  f,d	
RLF   f,d	
RRF  f,d	
SUBWF   f,d	
SUBWFC   f,d	
XORWF  f,d
SWAPF  f,d	

 


数据存储:

 应用是注意:

1)bank分布模式为:

      总共由6个Bank,分别对应page的前256和后256;

2)同一个page的寄存器可以进行直接寻址;

3)不同page的数据传输时,需要进行翻页操作;

4)SFR属于公共区,直接寻址时可以和任何Page和bank的寄存器进行直接数据传输;

5)间接寻址时,需要切bank(可以这么理解,bank的定义就是为了间接寻址), 因此IRP0, SFR, IND0 是成对使用的,IRP1, SFR1, IND1是成对存在的;  

注:IRP0和IRP1只有在间接寻址时会用到,因为直接寻址的位宽为9bit,可以寻址1个page的全部地址, 间接寻址的FSR0/1为8bit,同一时间只能寻址前256byte,或者后256byte。

附直接寻址和间接寻址的理解:

//直接寻址和间接寻址的理解:
直接寻址的对象是显式的,操作数即代表寄存器地址或者寄存器名;
间接寻址的对象是隐式的,实际上是操作一个寄存器的值作为地址取访问该地址的数据;

比如:
通过IND0、IRP0和FSR0或IND1、IRP1和FSR1寄存器可以对数据存储器以及特殊功能寄存器进行间接访问。当从间接地址寄存器(IND0/IND1)
读入数据时,MCU实际上是以FSR0/FSR1中的值作为地址去访问数据存储器得到数据。当向间接寄存器(IND0/IND1)写入数据时,MCU实际上是
以FSR0/FSR1中的值作为地址去访问数据存储器将值存入该地址。

为什么要用间接寻址?
1)因为FSR0/1只有8bit, 寻址不了1个page的全部地址;
2)遇到大规模连续赋值的赋值等操作,直接寻址要写很多行,但间接寻址可以直接对地址进行加减,方便循环的实现;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值