chifeng0823 发表于 2008-5-7 09:35:43

请教马老师avr128 的地址转移问题关于(BOOTLOAD程序的)!

马老师好
    现在我已经实现了通过boot启动实现通过升级功能,但现在想进一步研究一下希望马老师给予解答。

本人用AVR ATMEGA128L 单片机,一般编辑的程序占FLASH空间的30%,我想把要升级的程序先存放到其他空间上如从0x8000开始存入,而原来的程序还保留,应该如何编译呢?或者说用什么语句可以实现呢?

    另外有个问题想问问就是正常单片机跑程序都是从地址0x0000开始跑,如果我想把我想编辑的程序存到自己想放的地址里(例如地址0x8000)然后经过BOOT重启把程序通过串口下到0x8000开始的空间里。不知应该用哪个语句呢? 是不是直接用JMP +地址就可以了呢?

    开始用 MOV 和MOVW 都不好用,不知这个简单的汇编语句应该如何编写,希望马老师赐教一二谢谢拉! 我用的是ICC编辑的。

chifeng0823 发表于 2008-5-8 09:09:31

有人能帮忙解释下吗?

ATMEGA_007 发表于 2008-5-8 09:29:27

你思路有点模糊,我想马老师也帮不了你,你得再仔细看书

首先要了解C语言编译源文件,将它编译成目标文件,使用的是再定位段

如何确定程序运行地址是靠编译连接器控制的,需要编译连接指令控制,不同的编译器有所不同, 最后生成最终的目标代码,而不是靠什么C语言语句实现的

还有就是AVR中断向量在0x0000或boot区前端,你认为改动程序运行首地址,中断怎么处理?

还是仔细看看书,研究研究其机理吧

machao 发表于 2008-5-8 09:39:15

有时间再详细解释.

machao 发表于 2008-5-9 20:29:57

AVR上电后只有2种可能:1,从0000H执行程序,2.从BOOT区执行程序.

按你的要求,可以这样设计:
1.每次上电后只能从BOOT区开始执行BOOT程序.
2.BOOT程序中进行判断,如果不需要更新程序,那么跳到8000H执行程序.
3.如果需要更新程序,将程序从8000H开始写入(BOOT程序可以实现的),然后再跳转到8000H执行程序.

这样做需要认真考虑中断向量放在什么地方.另外,需要采用C和汇编结合编写代码.因此需要对AVR特别熟悉,编程功底厚实才行.

chifeng0823 发表于 2008-5-10 09:40:14

谢谢 马老师的解答很有启发,我开始的初衷也是这样的,现在面临的第一个困难就是如何把要升级的程序先存放到其他空间上如从0x8000开始存入,而原来的程序还保留,应该怎么编译呢?或者说用什么语句可以实现呢?
不知道AVR里用的汇编语句是什么可以实现这个功能呢!

hncsxzj 发表于 2008-5-10 10:35:25

ORG 0x8000

chifeng0823 发表于 2008-5-12 09:51:05

在AVR ICC编辑软件里用汇编的话
不知道这么写对吗?
asm(".org 0x0000 \n"
         "jmpstart;\n"   

         ".org 0x80000\n"
         "      start: \n")

在加C程序函数 void write()............
               ...........
            ..........
执行生成文件时提示.org未定义或是没有这个指令,应该怎么办呢?

machao 发表于 2008-5-13 22:15:32

这个问题不是这么简单的.

chifeng0823 发表于 2008-5-14 14:42:05

马老师能不能用C语言在编程方面具体说说呢或是举个简单的例子启发一下!这个问题都困扰我一个月了就是走不出这第一步十分困扰!请马老师帮忙!
    求救!!!!

chifeng0823 发表于 2008-5-16 09:36:03

再次求救!
./emotion/em046.gif

ATMEGA_007 发表于 2008-5-16 12:14:34

中断迁移如何实现...
Booload和App如何定位.....如何互相调用......
程序最终代码如何定位,如何替换....

书上都有,让你看书你不看,总不能让别人把资料全部收集全给你讲课吧

还有Boot和App程序定位不是靠 类似这种 org 0x80000 伪指令实现的, 也不是靠简单的JMP 实现的, 你需要了解Boot和App的运行机理
而这些不是几句话讲清楚的,是靠看书做试验充分消化吸收理解的...

还有,我说这些话并没看不起你,只是给你建议,请你不要骂我
我记着有一次有人问我,堆栈是单片机的那个脚,我让他先看书再提问,确造来臭骂

chifeng0823 发表于 2008-5-26 16:18:44

ATMEGA_007 之金色代码哥们看来你看的也不透啊!现在我通过C语句的强制定义地址就已经完成了程序的定位,而且告诉你吧就是这条语句还可以实现在BOOT区把程序定义到应用的FLASH区里,就是这么简单.也是在看EEPROM时无意发现的呵呵!
   其实有些事情不用想那么复杂!

mljda 发表于 2008-5-26 20:22:50





segment

chifeng0823 发表于 2008-5-30 11:02:57

不是的
用C语言 #program start ~~:
和          #program end那个语句就可以了
具体的看AVR书上的绝对定义地址就知道了!

machao 发表于 2008-5-30 11:40:25

TO 14楼;

真正的开始的第一句指令还是在00000H处的,你的结构应该如下:

00000HJMP START
00002H以下是中断向量


000XXH中断向量结束,下面到08000H为空


START:
08000H你的C代码

你看以下汇编的东西,能满足你的要求吗?

ATMEGA_007 发表于 2008-5-30 17:05:39

楼主到现在还是认为#program start和#program end是C语言..........无语..........

machao 发表于 2008-5-30 18:24:50

#program start和#program end应该是C中的伪指令,不过我在CVAVR的HELP中没有找到.

不知道14楼使用的是什么平台.

ATMEGA_007 发表于 2008-5-30 19:50:17

这并不是什么C语言伪指令,而是编译器的控制指令,严格来说不属于C语言标准范畴,不同的编译器有不同的控制指令,所以无法通用,但是样子类似,绝大多数以#program开头,可以嵌在C语言内部的控制指令一般实现的功能比较简单,例如位域的方向,结构体是否压缩存放,获取目标文件的段参数,简单的段定位,参数定位,这些信息是传递给Link文件的,一般编译器的Link文件支持很多参数的,复杂的要编译器都支持文件输入命令行, 我认为Boot和App属于2个项目的东西,不应该放到一个项目来实现,Boot和App在可以互相调用的前提下,关系越少越可靠,Boot可以更新App, App可以更新Boot, 在系统被人为乱搞或系统乱跑,跑飞的前提下,不能泄露代码又能通过升级文件随时恢复相应代码才是完美的.......
页: [1]
查看完整版本: 请教马老师avr128 的地址转移问题关于(BOOTLOAD程序的)!