搜索
bottom↓
回复: 16

【求解】在WinAVR中,如何讲数组定义在EEPROM指定地址中

[复制链接]

出0入0汤圆

发表于 2013-6-21 10:52:09 | 显示全部楼层 |阅读模式
我想请教一下如何将数组定义在EEPROM、Flash、SRAM当中,就如同C51的_at_指令一样。

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出70入0汤圆

发表于 2013-6-21 16:42:03 | 显示全部楼层
看编译器手册。

出0入0汤圆

 楼主| 发表于 2013-6-25 15:33:17 | 显示全部楼层
绿茶山人 发表于 2013-6-21 16:42
看编译器手册。

您能直接说下么?

出70入0汤圆

发表于 2013-6-25 15:47:12 | 显示全部楼层
wnwnwn 发表于 2013-6-25 15:33
您能直接说下么?

定义一个变量到eeprom中是这样的 :
unsigned char val1 __attribute__((section(".eeprom")));

数组应该是:
unsigned char arr[10]  __attribute__((section(".eeprom")));

手头上没winavr,在书上找的,你试试。

出0入0汤圆

 楼主| 发表于 2013-6-25 15:53:28 | 显示全部楼层
绿茶山人 发表于 2013-6-25 15:47
定义一个变量到eeprom中是这样的 :
unsigned char val1 __attribute__((section(".eeprom")));

嗯,我也是这样定义的,这样定义是在eeprom首地址开始分配的,我是想请教一下,如何在指定地址定义数组呢?

出70入0汤圆

发表于 2013-6-25 15:54:33 | 显示全部楼层
不过这种方法地址是编译器分配的,也不能完全满足你的要求,有一种比较笨的方法就是把数组元素当变量,写入(读出)指定的EEPROM地址,不过就是有点麻烦。

出70入0汤圆

发表于 2013-6-25 15:58:26 | 显示全部楼层
好像最开始说那样可以进行段再定位;
static unsigned char eep_buffer[3] __attribute__((section(“.eeprom”)))={1,2,3};
在连接选项中可指定段的开始地址,如下的选项将.noinit 段指定位到RAM 存储器
0X2000 地址处。
avr-gcc ... -Wl,--section-start=.noinit=0x802000

这本书很不错,希望能帮助你

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-6-25 16:48:02 | 显示全部楼层
绿茶山人 发表于 2013-6-25 15:58
好像最开始说那样可以进行段再定位;
static unsigned char eep_buffer[3] __attribute__((section(“.eepr ...

谢谢您,开始看了是讲gcc编译原理的。

出0入0汤圆

 楼主| 发表于 2013-6-26 16:29:41 | 显示全部楼层
绿茶山人 发表于 2013-6-25 15:58
好像最开始说那样可以进行段再定位;
static unsigned char eep_buffer[3] __attribute__((section(“.eepr ...

我觉得这不是我想要的答案,.eeprom是一个独立的段定义在0x810000中,我的意思是把数组定义在这段的指定地址中。

出0入0汤圆

 楼主| 发表于 2013-6-26 16:31:40 | 显示全部楼层
绿茶山人 发表于 2013-6-25 15:58
好像最开始说那样可以进行段再定位;
static unsigned char eep_buffer[3] __attribute__((section(“.eepr ...

哦,我明白了,可以指定.eeprom的开始地址。我试试看,嘿嘿

出70入0汤圆

发表于 2013-6-26 16:54:27 | 显示全部楼层
wnwnwn 发表于 2013-6-26 16:31
哦,我明白了,可以指定.eeprom的开始地址。我试试看,嘿嘿

应该是那样的,我没平台试,你也还是学生吧,你大几了?

出0入0汤圆

 楼主| 发表于 2013-6-26 19:20:47 | 显示全部楼层
绿茶山人 发表于 2013-6-26 16:54
应该是那样的,我没平台试,你也还是学生吧,你大几了?

不是,我已经工作了,你呢?

出70入0汤圆

发表于 2013-6-27 08:12:20 | 显示全部楼层
wnwnwn 发表于 2013-6-26 19:20
不是,我已经工作了,你呢?

还有几天领证,做了半年多实习生了....... 命苦呀!

出0入0汤圆

发表于 2013-6-27 09:10:15 | 显示全部楼层
我都是直接用eeprom.h中的函数操作的,什么eeprom_read_byte,eeprom_write_byte之类的

出0入0汤圆

 楼主| 发表于 2013-6-27 19:13:14 | 显示全部楼层
zhujinliang2124 发表于 2013-6-27 09:10
我都是直接用eeprom.h中的函数操作的,什么eeprom_read_byte,eeprom_write_byte之类的 ...

嗯,我是在做一道练习题里面要用到eeprom_read_block,eeprom_write_block读写地址从0x0001开始的数据,应该是我思路不对。

我的想法是先把数组储存在0x0001的地址中

出0入0汤圆

 楼主| 发表于 2013-7-9 09:21:09 | 显示全部楼层
绿茶山人 发表于 2013-6-26 16:54
应该是那样的,我没平台试,你也还是学生吧,你大几了?

我在eclipse当中加入-Wl,--section-start=.noinit=0x810010这条指令,链接出错。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-9-27 10:19:42 | 显示全部楼层
unsigned char sz[] EEMEN ={'A','B','V','G'};  用JTAG 仿真调试,WATCH 里面看的SZ 显示是SRAM变量 怎么回事?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 03:25

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

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