3.3 了解乘除法函数对寄存器的占用
由于pic片内ram仅几十个字节,空间特别宝贵,而mplab-c编译器对ram地址具有不释放性,即一个变量使用的地址不能再分配给其它变量。如ram空间不能满足太多变量的要求,一些变量只能由用户强制分配相同的ram空间交替使用。而mplab-c中的乘除法函数需借用ram空间来存放中间结果,所以如果乘除法函数占用的ram与用户变量的地址重叠时,就会导致出现不可预测的结果。如果c程序中用到乘除法运算,最好先通过程序机器码的反汇编代码(包含在生成的lst文件中)查看乘除法占用地址是否与其它变量地址有冲突,以免程序跑飞。mplab-c手册并没有给出其乘除法函数对具体ram地址的占用情况。例5是乘法函数对0×13、0×14、0×19、0×1a地址占用情况。
例5
| 部分反汇编代码 | |||
| #include |
01a7 | 081f | movf 1f,w |
| #include |
01a8 | 0093 | movwf 13 |
| ;借用 | |||
| unsigned long value @0x1 | 01a9 | 0820 | movf 20,w |
| char xm @0x2d; | 01aa | 0094 | movwf 14 |
| ;借用 | |||
| void main() | 01ab | 082d | movf 2d,w |
| {value=20; | 01ac | 0099 | movwf 19 |
| ;借用 | |||
| xm=40; | 01ad | 019a | clrf1a |
| ;借用 | |||
| value=value*xm | 01ae | 235f | call 035fh |
| ;调用乘法函数 | |||
| …… | 01af | 1283 | bcf 03,5 |
| } | 01b0 | 009f | movwf 1f |
| ;返回结果低字节 | |||
| 01b1 | 0804 | movf 04,w | |
| 01b2 | 00a0 | movwf 20 | |
| ;返回结果高字节 | |||
4 对芯片重复编程
对无硬件仿真器的用户,总是选用带eprom的芯片来调试程序。每更改一次程序,都是将原来的内容先擦除,再编程,其过程浪费了相当多的时间,又缩短了芯片的使用寿命。如果后一次编程的结果较前一次,仅是对应的机器码字节的相同位由“1”变成“0”,就可在前一次编程芯片上再次写入数据,而不必擦除原片内容。
在程序的调试过程中,经常遇到常数的调整,如常数的改变能保证对应位由“1”变“0”,都可在原片内容的基础继续编程。另外,由于指令“nop”对应的机器码为“00”,调试过程中指令的删除,先用“nop”指令替代,编译后也可在原片内容上继续编程。
另外,在对带eprom的芯片编程时,特别注意程序保密状态位。厂家对新一代带eprom芯片的保密状态位已由原来的eprom可擦型改为了熔丝型,一旦程序代码保密熔丝编程为“0”,可重复编程的 eprom 芯片就无法再次编程了。使用时应注意这点,以免造成不必要的浪费(microchip 资料并未对此做出说明)。
参考文献
1 micorchip pic16cxx data book
2 mplab-c user’s guide