查看: 6627|回复: 10

atmel128,如何往Flash中写大量常数.比如100K字节常数

[复制链接]
  • TA的每日心情
    奋斗
    2015-2-7 08:32
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2015-2-5 10:16:40 | 显示全部楼层 |阅读模式
    分享到:
    最近我在做一个LCD显示键盘,采用atmel128芯片,当我往Flash中放汉字句模时,总是提示错误,“lit”area too large >64K bytes.我查看手册,发现128KFlash的寻址要通过RAMPZ这个来设置。但我没有搞清楚,如何分开的往Flash中写大量数据?希望论坛里的前辈能够进行指导和帮助,不甚感激!
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-1 10:07
  • 签到天数: 1617 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-2-5 10:58:18 | 显示全部楼层
    没有试过定义大于64K的数组,你是怎样定义的?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-2-7 08:32
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2015-2-6 13:48:50 | 显示全部楼层
    shaoziyang 发表于 2015-2-5 10:58
    没有试过定义大于64K的数组,你是怎样定义的?

    形如:
    const char ex1[100][200]={0};//20K字节
    然后多定义了类似的数组。
    我今天发现了一种方式可以解决,就是自己做一个头文件,比如我做LCD中文显示时,需要几十K字节的句模(都是定义成const类型),我将做好的句模放在头文件中,然后引用,发现可以解决大量定义常数的问题。
    但又出现另一个现象:LCD显示不正常,我查看手册,在Atmel128手册中第10页提到,128只能寻址64K字节,通过RAMPZ的值可以访问低64K字节和高的64K字节,但如何正确切换使用,还不太清楚。。。目前就是遇到这个问题。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-1 10:07
  • 签到天数: 1617 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-2-6 14:20:14 | 显示全部楼层
    晚上我试一试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-2-7 08:32
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2015-2-6 15:06:32 | 显示全部楼层
    shaoziyang 发表于 2015-2-6 14:20
    晚上我试一试。

    嗯!谢谢前辈呀,那个问题不知道我描述是否清楚,简单来说,就是我目前Flash中有大于64K字节的数据的时候,程序执行有类似跑飞的现象,运行不正常。最近3天都没有解决这个问题,心里太纠结了。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-1 10:07
  • 签到天数: 1617 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-2-7 17:46:38 | 显示全部楼层
    我试了一下,没有遇到你这样的问题啊。你用的是什么编译器?我使用AVR toolchain。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-1 10:07
  • 签到天数: 1617 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-2-7 19:53:39 | 显示全部楼层
    需要把你的现象说的更详细一点。的确不能定义太大的数组,但是可以定义多个小一点的数组。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-2-7 08:32
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2015-2-9 08:39:04 | 显示全部楼层
    shaoziyang 发表于 2015-2-7 17:46
    我试了一下,没有遇到你这样的问题啊。你用的是什么编译器?我使用AVR toolchain。 ...

    我使用的是从网上下载的ICCAVR 7.22破解版
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-2-7 08:32
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2015-2-9 08:57:16 | 显示全部楼层
    shaoziyang 发表于 2015-2-7 19:53
    需要把你的现象说的更详细一点。的确不能定义太大的数组,但是可以定义多个小一点的数组。 ...

    我已经把那个现象放到优酷里。我解释一下,在视频前10s的时间段里,我将头文件中的  
    constant ex[100][640] (64K数组)未参加编译,这时占用Flash约25%,程序很快的下载到我的板中,同时LCD显示正常;当我将那个64K数组参加编译时,这时占用Flash约75%,由于程序大,所以下载慢,但此时LCD直接不显示了。我分析了一下,可能是128的寻址能力有关,程序无法运行。就如在128的手册中11页提到,有一个RAMPZ的寄存器提到寻址能力,但这个到底有如何使用,我现在还无法搞清楚。前辈要不你看一下,能不能帮我理解一下。优酷视频地址如下:
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-12-1 10:07
  • 签到天数: 1617 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2015-2-9 09:58:53 | 显示全部楼层
    向前辈学习 发表于 2015-2-9 08:57
    我已经把那个现象放到优酷里。我解释一下,在视频前10s的时间段里,我将头文件中的  
    constant ex[100][64 ...

    我没有用过ICCAVR,一直用的是AVRGCC。在AVRGCC中,不能直接定义太大的数组,但是可以分别定义几个小一点的数组。访问数组时,没有遇到你的这个问题,估计是编译器自动处理了。

    如果是RAMPZ的问题,可能需要自己判断一下地址,然后设置寄存器。为了确定数组的地址,不能让编译器自动分配,在AVRGCC中通常是需要设置一个用户段,然后将数组指定到这个段中,这样就可以清楚知道数组每个成员的具体位置了。

    如:

    先在项目属性中定义段varx到0x1000,

    #define VARXPOS __attribute__((section("varx")))

    VARXPOS uint8_t sz[1000];
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 20:15 , Processed in 0.197412 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.