打印
[AVR单片机]

一点技巧,希望对大家有用。

[复制链接]
1837|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51avr|  楼主 | 2010-1-27 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在我使用m128开发的软件当中,我将软件分成三部分:app+resource(多国语言部分相关)+bootloader.

bootloader放在后8K当中,其中的代码可以读写前面120K的flash。
app+resouce放在前120K当中,resouce是一个数组,绝对定位在一个固定地址如 0xa00, app提供菜单选择,然后调用bootloader中的程序,以修改resource的内容。

bootloader与app+resource是分别建立工程开发的。那么app如何调用bootloader中的程序呢?我选择了最简单的办法:分析bootloader的map文件,找到写flash函数的绝对地址比如是0x1F352,然后在app中直接call就可以了。需要注意以下几点:
1. bootloader中的服务函数(及其调用的其他函数)只能使用局部变量。也可用其他办法。
2. app如何传递参数:假如bootloader中的服务函数的原型是 void func(char c);则在app中可以这样调用:
   void call_bootloader_func(char c){
        asm("call 0x1F352");
    }

app工程的链接命令为:
-Z(CODE)SEG_RESOURCE=0xa00
-Ointel-extended,(CODE)=.hex
-Ointel-extended,(XDATA)=.eep

resouce的数组定义如下:
__hugeflash unsigned char cResource[1024*38U] @"SEG_RESOURCE" =
    {
#include "..\Resource\Resource.txt"
    };


弊端:bootloader程序更新或重新编译后,服务函数的地址会变化,那我的app也需要升级了。

可行的方案:在bootloader中通过链接控制指定服务函数的地址。则bootloader升级,而app不用升级。进一步思考,如果avr单片机能提供类似arm的软件中断功能,实现起来更方便了,就如同linux app调用kernel提供的系统服务的方式。

以上讲的比较杂乱,不清楚的地方可以大家讨论。

相关帖子

沙发
lamb-unsilent| | 2010-1-27 20:11 | 只看该作者
学习了,谢谢

使用特权

评论回复
板凳
end2000| | 2010-1-28 15:25 | 只看该作者
在我使用m128开发的软件当中,我将软件分成三部分:app+resource(多国语言部分相关)+bootloader.

bootloader放在后8K当中,其中的代码可以读写前面120K的flash。
app+resouce放在前120K当中,resouce是一个数组,绝 ...
51avr 发表于 2010-1-27 11:40


你的思路有了,但方法还是比较初级。
请自己用关键词“Opaque pointer”上网研究研究,你应该会有收获的。

使用特权

评论回复
地板
51avr|  楼主 | 2010-1-29 09:30 | 只看该作者
首先要谢谢end2000的指点。我觉得opaque pointer 在面向对象编程和信息隐藏方面有很多好处,但应该是在同一个project中好使。
在单片机中,两个project中的函数互相调用,end2000有其他好办法吗?

期待您的指点!

使用特权

评论回复
5
51avr|  楼主 | 2010-1-29 09:43 | 只看该作者
用opaque pointer技术设计功能函数库应该是个好主意。

使用特权

评论回复
6
英雄无敌5| | 2010-1-29 09:52 | 只看该作者
可以在bootloader里面把函数地址写到EEPROM中,app调用EEPROM。

使用特权

评论回复
7
wangwo| | 2010-1-29 14:53 | 只看该作者
踩踩

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

73

帖子

2

粉丝