如何实现对PIC芯片ROM中的程序地址的精确定位?
一个悬而未决的问题,历时4个月终于获解。大块人心。
事情要从4个月前的一场讨论说起。详细情况见:天梯 之 从零开始玩PIC——11.关于FLASH操作的讨论
问题的实质,就是如何实现对ROM中的程序地址的精确定位。因为只有精确定位了,才能通过对FLASH的写操作来修改表格中的数据。(甚至可以修改程序!)。
当时,yewuyi 和martin 参与了讨论。并且,martin给出了一个不太理想的解决方案:在编译器命令行选项中进行设置,让编译器绝对避开某些区域。然后把这块区域开辟为表格。但是这个方案的缺点是,在烧芯片时,无法对表格内容初始化,必须通过串口下载,由单片机程序去修改。
这个问题被悬置了很久,今天,终于在网上看到一篇贴(参见:PICC中如何用指针访问const 数组? ),匠人由此受到启发。找到了问题的解决方案,总结如下:
1、在定义const数组的同时,定义const指针:
const tU08 LED_TAB[]=
{
//。。。。内容略。。。。
};
const tU08 *romPtr; //定义指向ROM 的指针
2、程序中可以对上面的指针变量赋值和实现取数操作:
tU08 i ;
romPtr = LED_TAB;
i=*romPtr++; //取指针指向的一个数,然后指针加1
3、同样的,我们也可以把romPtr 指针值传递给其他变量:
tU16 m;
romPtr = LED_TAB;
m=romPtr;
4、更神奇的是,我们可以通过这种方式,找到任意一个函数的起始PC地址:
romPtr = temp_cnt; //说明:“temp_cnt”为一个函数。
5、找到了地址,再要修改该地址所在的FLASH,自然应该没有问题了吧。呵呵。
评论