搜索
bottom↓
回复: 32

各位高手:winavr+gcc,avr单片机在运行的过程中怎么操作“flash”空间呢?在某个flash地

[复制链接]

出0入0汤圆

发表于 2009-7-21 14:06:40 | 显示全部楼层 |阅读模式
在论坛了翻了半天,好多帖子都是修改makefile,这样定义的flash 变量的地址就从makefile中的地址开始……,然后编译,下载到单片机中,相应的flash地址中就会有相应的内容,读出就用pgm_read_xxxx(adress)之类的函数即可,不过这只适合事先确定好的内容……,

当我们需要在单片机运行的过程中来向flash空间,某个地址(绝对地址)写入某些数据的时候,该如何操作呢?

环境是winavr+gcc。这个不行的话其它比如cvavr,iccavr,iar哪个可以呢?

论坛上好多关于这个问题都没有合理的解答,期盼高手到来!3ks (上述表达某些细节可能不准确,我反复研读了12遍,大体逻辑还是对的哈哈)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-7-21 14:31:26 | 显示全部楼层
大体方法:
1.绝对定位一个数组,占据FLASH空间某一页或者某几页。
2.所有对这段FLASH擦除,写入的函数(包括调用的子函数),全部定位到BOOT区。
3.所有对这段FLASH擦除,写入的函数(包括调用的子函数),关闭中断。
4.配置合适的熔丝位,允许FLASH擦出,写入。

出0入0汤圆

 楼主| 发表于 2009-7-21 15:06:20 | 显示全部楼层
一~好论坛里面有好人,顶级论坛里面有高手,呵呵
看到上官友回复,感谢,明白了一点,虽然未豁然开朗,但至少我知道您肯定是做过类似的事情,并成功了,呵呵

能这样理解么?您的上述4步其实是flash空间的“自编程”过程?类似于单片机调试过程向flash空间写hex文件,按页操作可以理解,我用过msp430单片机,也是要按页操作,要想写入得先页擦除,否则写入失败。

但是,有没更灵活的方法呢?比如哈:定义个指针:unsigned char *p = adress,(这个adress就指向flash中的某个单元),然后,*p = content,对应flash空间adress的内容就变成content,然后呢,想修改的时候,再次*p=content2;对应flash空间adress的内容就变成content2了,不用再次定义变量,(定义变量只能在程序编制的时候,运行时不能定义变量吧?呵呵)

出0入0汤圆

发表于 2009-7-21 15:07:57 | 显示全部楼层
lz当flash是ram吗?

读flash可以用指针,写flash受硬件限制,必须按要求来

出0入0汤圆

发表于 2009-7-21 15:30:25 | 显示全部楼层
430写flash很方便  avr就有点麻烦了,可以用eeprom

出0入0汤圆

 楼主| 发表于 2009-7-21 15:33:55 | 显示全部楼层
哈哈,又引来一高手,我描述的有夸张的成分哈,要敢于想嘛,没有做不到只有想不到,呵呵,“我的意思就是简便一些,前提是按照规则”,现在实现不了没关系,那咱就按部就班的来,呵呵,早晚有一天会像我描述的一样,单片机内部flash的操作和ram一样……

楼上也用过430吧,我之所以想这样来操作,就是因为冥冥之中我用过430单片机,然后写入flash存储器没那么麻烦啊,记得当时就是写之前要先擦除这小小麻烦了一点儿,其它很简单了,就那么几句话,呵呵

?这是avr和430比起来的不足之处么?看来avr要努力了,

avr顶级论坛的高手有没能缩小下差距呢?(抬头睁眼看着(翘首以盼))……

出0入0汤圆

发表于 2009-7-21 16:53:35 | 显示全部楼层
其实上官大侠曾写过此类操作的解决办法,我也正在测试,已经确认编译器可以声明的数据写入HEX文件中,但现在还存在些问题:并没有固定在想要的绝对地址位置,不过大家一起努力,找出原因就可拉近AVR与430 对FLASH操作的差距。
我再将上官的具体操作重复一下,大家也试试,找出更合适的解决办法。
1、先如下图设置工程的MEMORY项

(原文件名:图.JPG)
2、声明FLASH字串变量sTestStr[]
char sTestStr[] __attribute__((section(".MyFlash1")))="Test12345678";
3、编译
4、查看.map文件

(原文件名:图1.JPG)
由图可以看出,字串sTestStr并不是在图1定义的段0X2000位置,而是在0x0080016b的位置,(还没找到解决办法)
5、把HEX调入缓冲区,如下图,数据是正常了,不过位置却在0x0080016b,很晕,MEGA32FLASH根本没这么大,不知道编译器吃错什么药了

(原文件名:图3.JPG)

出0入0汤圆

发表于 2009-7-21 17:55:31 | 显示全部楼层
楼上吧你的整个工程贴出来。

出0入296汤圆

发表于 2009-7-21 18:11:02 | 显示全部楼层
给你一个ICC下用的Service,用来在运行时刻,写Flash的任意地址
点击此处下载 ourdev_463129.rar(文件大小:25K) (原文件名:Bate.rar)

对于不同的硬件,请修改flash_cfg.h,里面默认配置的是一个ATmega128的设备。
使用方法:
增加包含 hal\driver\flash\flash.h

然后使用下面的函数来操作flash
            Flash_Write(地址,要写入数据的首地址,要写入多少字节)
            Flash_Read(地址,读取数据存放处的地址,要读取多少字节)
操作成功,返回ES_TRUE,失败,返回ES_FALSE

出0入0汤圆

 楼主| 发表于 2009-7-21 20:50:00 | 显示全部楼层
BOSS现身,呵呵,我就琢磨着,这事早晚闹大,呵呵,感谢感谢,傻孩子
下来研究下
就在刚才我自己也去看看datasheet,有点发现,我想实现的功能通过bootloader能实现吧,呵呵,在bootloader段写那么个程序,然后在ipa里面某处需要写指定flash指定地址那跳转到bootloader里面,在这里就可以写flash任意地址了,多了个环节,“想在A里面写的得到B里面去,在B里面去写A”。至于读取怎随意了。不知道我的分析对否?还请各位论坛神人来评阅一下,呵呵,对了就打个勾勾。我自己也要去研究下……

还有啊,就是avr为什么要这样做呢?肯定是有原因的

出0入0汤圆

发表于 2009-7-21 21:53:14 | 显示全部楼层
这个是AVR的高级应用,关注一下。
这个用来加密可能很不错呢!

出0入0汤圆

 楼主| 发表于 2009-7-21 22:16:11 | 显示全部楼层
高级应用?都这么说,呵呵,楼上可以再论坛里面搜索bootloader,然后可以看到几个库贴,也可以看到出没在本贴中的boss级人物的库贴,然后还有通用bootloader……,要学的东西太多啊!高人太多,我们什么时候能看见太阳……呵呵

出0入0汤圆

发表于 2009-7-21 22:25:15 | 显示全部楼层
来了......还挺热闹,呵呵
仔细看了一下,是我理解错LZ的意思了,LZ是要用IAP对FLASH的读写,我说的只是将数据存储到绝对地址并进行读操作,不关写FLASH的事。
TO上官大侠:整个工程与主题无关的东西太多,传上来浪费大家宝贵时间,我另弄个测试传上来吧,试了一下效果一样,仍是将数据存在了0x00800000地址后,应该是section的起始地址设置问题吧,不知在哪里修改

出0入0汤圆

发表于 2009-7-21 22:27:32 | 显示全部楼层
Flash绝对地址测试,设置见前图
点击此处下载 ourdev_463217.rar(文件大小:9K) (原文件名:FlashTest.rar)

出0入0汤圆

发表于 2009-7-21 22:36:57 | 显示全部楼层
楼上,你在avr_studio设置段名是MyFlash1,而程序里面的段名是.MyFlash1。
差了个‘.’。

楼上改一下,把两个段名改成一致就行了。

出0入0汤圆

发表于 2009-7-21 22:44:30 | 显示全部楼层
怪了,原来是加了点了,但出如下问题
d:\WinAVR\bin\..\lib\gcc\avr\3.4.6\..\..\..\..\avr\bin\ld.exe: section .text [00000000 -> 00005795] overlaps section .MyFlash1 [00004000 -> 00004001]
于是就把点去掉了。

但测试这个加上就不出问题。
可能还是程序里面有问题,我再找找。
谢谢.........

出0入0汤圆

发表于 2009-7-21 22:50:16 | 显示全部楼层
试试加上两个参数:
CFLAGS  +=  -ffunction-sections
LDFLAGS +=  -Wl,--gc-sections


(原文件名:Image0071.JPG)




(原文件名:Image0073.JPG)

出0入0汤圆

发表于 2009-7-21 23:05:32 | 显示全部楼层

(原文件名:图1.JPG)
呵呵,编译通过了,每个C文件上都出上面警告,

出0入0汤圆

发表于 2009-7-21 23:11:29 | 显示全部楼层
哈哈,终于可以了,把-ffunction-sections 去掉,留 -Wl,--gc-sections 就行了。
太感谢了,再次代表曾对此问题迷惑的兄弟们对你表示感谢!

出0入0汤圆

发表于 2009-10-23 17:07:48 | 显示全部楼层
重要发现

出0入0汤圆

发表于 2009-11-9 21:53:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-26 15:15:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-26 17:53:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-13 13:07:57 | 显示全部楼层
一定要mark

出0入0汤圆

发表于 2011-3-2 00:18:19 | 显示全部楼层
学习一下。

出0入0汤圆

发表于 2011-8-30 16:58:22 | 显示全部楼层
回复【1楼】void_c
-----------------------------------------------------------------------
我想问的是如何将变量里边的内容写入FLASH,不管开机或关机,只要不是程序要求改动都不能进行修改

出0入0汤圆

发表于 2011-9-12 20:13:19 | 显示全部楼层
回复【26楼】Tom Chen  
回复【1楼】void_c
-----------------------------------------------------------------------
我想问的是如何将变量里边的内容写入flash,不管开机或关机,只要不是程序要求改动都不能进行修改
-----------------------------------------------------------------------

直接写eeprom就是了撒,AVR的flash简直就是鸡肋,会折腾死人的…

出0入0汤圆

发表于 2011-9-13 02:09:16 | 显示全部楼层
收藏备用,谢谢了!

出0入0汤圆

发表于 2011-11-16 16:02:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-23 14:05:36 | 显示全部楼层
本帖最后由 snark 于 2012-8-23 14:13 编辑

在网上搜索到2种方法:
1. 在makefile 中定义section,如下:
LDFLAGS = -Wl,--section-start=.mydatasection=0x001000,-Map=$(TARGET).map,--cref  

然后引用
const unsigned char data[] __attribute__((section(".mydatasection")))={   
0x10,0x20,0x30   
};   

2. 在连接脚本里修改设置.  

在实验方法1
在makefile 中设置
LDFLAGS += -Wl,--section-start=.mydatasection=0x001500
在main.c中引用
const unsigned char mydata[4] __attribute((section(".mydatasection"))) = {'9','1','2','3'};

但是要注意,mydatasection 的定位地址,要是其它段没有用到的才可以,否则会报错,有地址重叠.

纯COPY(htt p://www . u sr.cn/News/74.html,去掉空格),第一个方法试验了可行。不知道那位老大知道FLASH变量的定位地址在其它段也用到的情况下,如何定义。

出0入0汤圆

发表于 2012-9-6 12:29:07 | 显示全部楼层
基本上拿BOOTLOAD来参考即可.
要注意不要把自己给erase掉就行了.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 15:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表