社区导航

 

搜索
查看: 1042|回复: 8

[求助] 关于msp430fr2000的内存FRAM的问题!!

[复制链接]

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-3-1 22:06 | 显示全部楼层 |阅读模式
我在使用MSP430FR2000的时候,因为是内存小,价格便宜,引脚少。我们才选择了他,但是现在遇到了他的内存的问题。

我在写程序的时候,引入了ds1302的头文件,但是问题就随之而来了。因为这个单片机的fram只有0.5K.

    FRAM                    : origin = 0xFE00, length = 0x180

ds1302里面有2个地址数组:
static uchar  READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
static uchar  WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};


只要有这2个数组在程序里面,编译就是不通过。提示:profram will not fit into available memory,placement with alignment fails for section
"ALL_FRAM" size 0x376.

我百度过,网上的解决方法好像是手动修改CMD文件里面的FRAM的长度。但是我真不知道该怎么该,有点懵。
我还试过把这个全局变量放到要用的函数里面。也不行,解决不了。

求求大佬帮忙看一下 编译软件是CCSV8.3


R]J4%`CUFR62)8WX7UY~14H.png


回复

使用道具 举报

7491

TA的帖子

4951

TA的资源

博客管理员

Rank: 6Rank: 6

资源大师勋章

发表于 2019-3-2 07:22 | 显示全部楼层
这两个数组是常量吗,如果是,定义成常量,就不占RAM空间了


回复

使用道具 举报

1337

TA的帖子

7

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-3-2 08:44 | 显示全部楼层
1) 如楼上所说,如果RAM太小,程序空间还有空间,可以定义成常量数组或宏定义(宏定义也是常量的一种形式)
2) 另外就是直接在程序中定,当然这样移植可能不太灵活

点评

我现在都已经这样了 void Ds1302ReadTime(void) { uchar n; // for (n=0; n  详情 回复 发表于 2019-3-2 17:22
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-3-2 17:09 | 显示全部楼层
懒猫爱飞 发表于 2019-3-2 08:44
1) 如楼上所说,如果RAM太小,程序空间还有空间,可以定义成常量数组或宏定义(宏定义也是常量的一种形式) ...

我之前直接把全局变量的这2个数组拿到函数里面去过,还是不通过。

方法二。定义为常量数组,
我改成了
const uchar  READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
const uchar  WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

因为这是2个地址数组,只读就行。我就想让他不占那么多空间。结果还是编译报错。

方法三,宏定义法。
我像这样宏定义了一下
//#define READ_RTC_ADDR[0] 0x81
//#define READ_RTC_ADDR[1] 0x83
//#define READ_RTC_ADDR[2] 0x85
//#define READ_RTC_ADDR[3] 0x87
//#define READ_RTC_ADDR[4] 0x89
//#define READ_RTC_ADDR[5] 0x8b
//#define READ_RTC_ADDR[6] 0x8d

但是不能直接用,因为使用这2个数组的函数的形参是uchar形,所以编译就也是不能通过的。

我再尝试看看宏定义法,改一下函数。


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-3-2 17:09 | 显示全部楼层
tiankai001 发表于 2019-3-2 07:22
这两个数组是常量吗,如果是,定义成常量,就不占RAM空间了

改成了
const uchar  READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
const uchar  WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

结果还是不通过


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-3-2 17:22 | 显示全部楼层
懒猫爱飞 发表于 2019-3-2 08:44
1) 如楼上所说,如果RAM太小,程序空间还有空间,可以定义成常量数组或宏定义(宏定义也是常量的一种形式) ...

我现在都已经这样了

void Ds1302ReadTime(void)
{

    uchar n;
//    for (n=0; n<3; n++)
//    {
//        TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
//    }

    TIME[0] = Ds1302Read(0x81);
    TIME[1] = Ds1302Read(0x83);
    TIME[2] = Ds1302Read(0x85);


}

数组也不要了,直接写地址,它还是不通过。。。。


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2019-3-2 18:31 | 显示全部楼层
这个msp430fr2000的内存实在是太小了,我现在已经删掉了这2个数组。只保留了一个必须用的TIME【3】的全局变量。它的FRAM还是超过了它预先在CMD里面的0x180长度,我现在优化到极致只能保持0x2d7的长度,但是还是超过了。

而且还有个问题是,只要主函数使用了ds1302里面的函数,编译就会不通过。而且使用不同的函数还会带来不同的FRAM长度的不同,就是他的意思就是我不能全局变量 且 我不能使用过多的函数,我觉得不管这个芯片有多老,它也不应该连一个全局变量都不能放啊......

反正主函数里面不可以放ds1302的函数,因为ds1302里面的函数提到了TIME【3】,使用的函数次数越多,fram就越大。

以下是我的三个主函数需要用到的函数。

void Ds1302_Init(void)
{
    uchar n;
    Ds1302Write(0x8E,0X00);      //禁止写保护,就是关闭写保护功能
    if(Ds1302Read(0xc1) != 0xaa)
    {
    for (n=0; n<3; n++)//写入7个字节的时钟信号:分秒时日月周年
    {
        Ds1302Write(0x80 + n*2,TIME[n]);
    }


    Ds1302Write(0xc0,0xaa);      //打开写保护功能
//  Ds1302Write(0x8E,0x80);      //打开写保护功能
}
}



void important_Init(void)                //这是用于修改了时间后 对寄存器进行的重新赋值
{
    uchar n;
    Ds1302Write(0x8E,0X00);      //禁止写保护,就是关闭写保护功能
    for (n=0; n<3; n++)//写入7个字节的时钟信号:分秒时日月周年
    {
        Ds1302Write(0x80 +n*2,TIME[n]);
    }




    Ds1302Write(0x8E,0x80);      //打开写保护功能
}



void Ds1302ReadTime(void)
{

    uchar n;
    for (n=0; n<3; n++)//读取7个字节的时钟信号:分秒时日月周年
    {
        TIME[n] = Ds1302Read(0x81 + n*2);
    }
}




回复

使用道具 举报

905

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-3-3 09:02 来自手机 | 显示全部楼层
本帖最后由 大秦正声 于 2019-3-3 09:06 编辑

通过指针直接把数据放在备份存储器里边,可以保存32个字节!估计可以解决了的。


回复

使用道具 举报

2983

TA的帖子

262

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

荣誉会员勋章测评达人

发表于 2019-3-5 22:18 | 显示全部楼层
debug文件夹里面有个MAP文件,里面是你编译后各种资源的分配情况(如变量、常量等)。在里面可以查到资源的使用起始地址及占用情况。你首要看一下那个资源超出范围了。可以把MAP文件备份一份,然后把数组深度减小或者减少几个变量重新编译,新生成的MAP文件和之前的比较就能很快定位问题。然后需要查看datasheet,看芯片的地址分配图是否还有多余资源可用,适当修改即可。


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-5-24 09:02 , Processed in 0.267539 second(s), 18 queries , Gzip On, MemCache On.

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