请教一下,使用PICC如何自己重定位程序在flash中的位置?

2020-02-10 08:51发布

主要是想在PIC16F886上实现bootloader,但不知道应该如何实现程序位置的定位。

小弟对PICC编译的过程理解不深,猜测是不是只要更改PICC的某个文件,就可以自行规定LINKER的行为?

请教有经验的朋友,究竟应该如何操作,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
joylight
1楼-- · 2020-02-11 07:41
仔细看了您写的方法,但是遇到了一个问题

我写的程序代码4K多一点,用PICC9.5编译后,发现生成的.hex文件不是从头到尾排列的,而是中间空了两块没有程序。

这就很郁闷了,如果我想将两个.hex文件合起来(功能程序和引导程序分别形成一个project编译,再将两个.hex文件手工合起来),那就需要有一块连续的没有写程序的flash。但是现在整个flash空间好像都有代码,而不是将代码从flash的0000位置顺序往下排。请问应该如何处理?

默认情况下PICC编译是如何定位代码在flash中的位置的?有特殊的文件指示编译器如何动作吗?
joylight
2楼-- · 2020-02-11 08:49
即使不手工合成.hex文件,用引导的方式,也需要有一块空的flash用来存放更新后的程序。
但程序一大了,程序在flash中的定位就感觉“乱了”。
joylight
3楼-- · 2020-02-11 11:44
 精彩回答 2  元偷偷看……
joylight
4楼-- · 2020-02-11 16:55
.hex文件应该是搞错了,新情况如下:

1、功能程序无偏移时,从0x0000开始可以正常运行。说明功能程序没有问题,也不存在运行过程中堆栈溢出的问题。
2、引导程序,代码如下,跳转和中断重定位经过测试都是正常的。
3、引导程序+功能程序(分别编译,生成两个.hex文件,手工合成后下载),其中功能程序编译时偏移到0x1000,开始功能程序还能运行一段,一旦使能定时器中断,程序就好像复位了,又从头执行。
难道是新增的引导程序加重了堆栈的负担?但引导的代码中也没有CALL和中断啊,应该不会触发压栈啊。



0x0000-0xFFF的代码如下:
0000  MOVLW 0
0001  MOVWF 0xa
0002  GOTO 0x7
0003
0004  BSF 0xa,0x4
0005  BCF 0xa,0x3
0006  GOTO 0x4
0007  BCF 0xa,0x4
0008  BCF 0xa,0x3
0009  GOTO 0x7f9
.
空白
.
07F9  BSF 0xa,0x4
07FA  BCF 0xa,0x3
07FB  GOTO 0
07FC  CLRF 0x3
07FD  BCF 0xa,0x4
07FE  BCF 0xa,0x3
07FF  GOTO 0
.
空白
.
1000  功能程序

一周热门 更多>