你好!欢迎来到深圳市颖特新科技有限公司!
语言
当前位置:首页 >> 技术中心 >> 单片机入门 >> 如何实现对PIC芯片ROM中的程序地址的精确定位?

如何实现对PIC芯片ROM中的程序地址的精确定位?

关键字:PIC ROM 芯片 程序 作者:admin 来源:不详 发布时间:2018-05-19  浏览:0

如何实现对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,自然应该没有问题了吧。呵呵。

扩展阅读:关于PIC24的DISI禁止中断指令

编辑:admin  最后修改时间:2018-05-19

联系方式

0755-82591179

传真:0755-82591176

邮箱:vicky@yingtexin.net

地址:深圳市龙华区民治街道民治大道973万众润丰创业园A栋2楼A08

Copyright © 2014-2023 颖特新科技有限公司 All Rights Reserved.  粤ICP备14043402号-4