alphal 发表于 2013-3-5 22:44

请教一个高难度问题

我们的DSP程序(无OS)最近要做一个bootloader程序(可用来更新应用程序的程序),有个比较xx的想法:bootloader程序和应用程序放到一个工程中,生成一个.out文件,据说能方便生产。我的理解是,这样做相当于把两个程序(bootloader和应用程序)链接到一起,但各自程序空间完全独立,各自代码完全不能有调用关系,只是bootloader程序运行完后jump到应用程序。我觉得烦的地方在于在进入mian函数之前的一段启动代码(初始化c语言运行环境,常量,堆栈初始化)的安置:1、首先这段启动代码是在哪个文件中,rts2800.lib还是某asm文件里?怎么将其定位到特定地址空间?2、如果这两个程序在一个工程中,只有一个mian函数,并这个启动代码只有一个。显然在更新应用程序的时候应该将应用程序相关的启动代码也更新掉,那么这个启动代码应该定位到应用程序区(能和应用程序一道被更新掉),貌似要按这样的路径才行:假如解决了启动代码的定位问题,那么bootloader程序的启动代码又如何算呢,怎样能使bootloader与启动代码无关呢,或者在bootloader程序中实现启动代码功能? 撇开这个方案如何BS/SB,大家先告诉我有什么法子能实现吧。

电子学习员 发表于 2013-3-6 12:44

等待大师解决。。。

jlass 发表于 2013-3-6 15:12

你的功能很容易实现,就照你的想法做就好了。我就是奇怪一个地方,你的结构没有OS,而且bootloader程序和应用程序放到一个工程中,生成一个.out文件,也就是说你的应用程序是放在芯片内部的,当有新的应用程序的时候你怎么更新?如果用host接口更新的话,干嘛不更新整个.out文件,而要保留bootloader程序,这不是吃饱了撑的么。

初始化c语言运行环境,常量,堆栈初始化
启动代码里面根本就没有这些个玩意儿

alphal 发表于 2013-3-6 21:49

1、“初始化c语言运行环境,常量,堆栈初始化,启动代码里面根本就没有这些个玩意儿”我百度的资料都是说有的,如果不是,那么请问这些初始化代码在哪里?
2、看你前面的回答,表明你并没有理解我的意思。“也就是说你的应用程序是放在芯片内部的,当有新的应用程序的时候你怎么更新?”我现在就是应用程序放在内部Flash,目前就是干解决“新的应用程序的时候你怎么更新”的或。

我的目标是:
只有一个.out文件,里面包含bootloader代码和应用程序代码,更新的时候只跑bootloader程序来更新应用程序代码。

jlass 发表于 2013-3-7 09:17

alphal 发表于 2013-3-6 21:49 static/image/common/back.gif
1、“初始化c语言运行环境,常量,堆栈初始化,启动代码里面根本就没有这些个玩意儿”我百度的资料都是说有 ...

1、用汇编的时候就没有c语言运行环境,不用常量就没有常量,不用堆栈就没有堆栈初始化,启动代码里必须有的是DSP的初始化

2、你的bootloader代码和应用程序代码放在一个.out文件中,那么当你更新程序的时候就要生成一个新的.out文件,此时你是怎么处理的?如果是把.out文件烧写进DSP,那么意味着bootloader代码和应用程序代码都可以被改了(违背了你的初衷),如果使用bootloader代码来更新.out文件,那么这个.out文件放在那里?而且这种做法实际上就是生成两个文件,具有两个main,这是你把两个文件合并到一个.out文件里而已。

3、我做过类似的事情,可以给你一个方案,先编写一段应用程序,生成一个.out文件,再编一个bootloader代码,把刚才生成的.out文件作为数据段存放在bootloader代码中,bootloader代码所干的事情就是把应用程序的数据段拷贝到相应的位置,并跳转过去运行(和你的想法一样吧)。麻烦的地方就是当更新应用程序的时候需要编写两次.out文件,甚至应用程序存放的地址段需要改动时都得改bootloader代码(不是asm文件)。

jlass 发表于 2013-3-7 17:35

版主,不要老是发这种评论,我会不好意思的

refee 发表于 2013-3-7 17:45

佩服佩服,jlassV5……
页: [1]
查看完整版本: 请教一个高难度问题