28335保存数组到指定内存空间
28335的内存空间比较小,当需要用大数组的时候(比如FFT),经常会提示错误。一般的28335开发板都会外扩RAM,下面将介绍如何将数组保存到指定的外扩RAM中。
1.计算RAM地址
根据原理图计算RAM地址,比如我的原理图中(玻尔电子3XD开发板):
RAM的A18-A0接到28335的XA18-XXA0。XA19经过一个非门后,与XZCS6n通过2输入或门输出到R_CSn引脚,接到RAM芯片的CE引脚。当RAM的CE引脚为0时选通,此时XA19n和R_CS6n都为0,XA19为1,当28335读0x10 0000地址的内存时,R_CS6会自动拉低。XA19要求为1,则读写的地址为0x18 0000到0x1F FFFF时,读写的是RAM芯片。
所以RAM的地址为0x180000到0x1FFFFF。
2.计算RAM空间大小
RAM地址为0x18 0000到0x1F FFFF,一共19根地址线,这空间大小为
,16进制表示为0x08 0000。3.修改CMD文件
按照28335手册和CMD文件格式,添加EXRAM分区:
MEMORY
{
PAGE 0 : /* Program Memory */
......
PAGE 1 : /* Data Memory */
......
RAML_XXXCMD : origin = 0x00BFF0, length = 0x000004
}
......
SECTIONS
{
......
ramdata : > RAML_XXXCMD, PAGE = 1
......
}
下面是我添加的示例:在MEMORY下PAGE 1中添加一个EXRAM_ZONE6(外扩ZONE6下的RAM),首地址为0x18 0000,长度为0x08 0000。
MEMORY
{
PAGE 0 :
PAGE 1 :
EXRAM_ZONE6 : origin = 0x180000, length = 0x080000 /* XINTF zone 6 RAM - space */
}
在SECTIONS中添加一个EXRAM。
SECTIONS
{
EXRAM : > EXRAM_ZONE6, PAGE = 1
}
4.定义数组
在.C文件中,定义一个数组,使用#pragma命令将数组关联到EXRAM中:
#pragma DATA_SECTION(SaveBuffer,"EXRAM");
Uint16 SaveBuffer[1000];
然后对SaveBuffer进行操作即可,SaveBuffer是保存在之前定义的EXRAM中,也就是0x18 0000开始的地址内的。
5.检验
写一个对SaveBuffer初始化的小程序,然后通过断点功能暂停程序,并通过CCS的Expressions和Momory Browser功能查看内存数据,是否与初始化符合。
for(i=0;i<1000;i++)
{
SaveBuffer[i]=i;
}
asm(" ESTOP0");
程序跑起来,停下来后在Expressions功能中,能看见SaveBuffer的地址为0x18 0000。
在Momory Browser中输入0x18 0000,也能看见数据为0,1,2,3…
以上可以说明SaveBuffer数组确确实实是被保存在了RAM中。
7.延伸
将定义的数组由16位修改为32位,看看效果如何
#pragma DATA_SECTION(SaveBuffer,"EXRAM");
Uint32 SaveBuffer[1000];
在Momory Browser查看数据,可以分析出,数据的高位放在了地址的高位,比如02的数据,是0002 0000。
所以28335的数据保存应该是小端模式,实际上,大部分ARM、DSP都是小端模式,C51是大端模式。
8.问题
在延伸的基础上,将数组的数据类型改为8位整型(unsigned char):
#pragma DATA_SECTION(SaveBuffer,"EXRAM");
unsigned char SaveBuffer[1000];
在Momory Browser查看数据,出现了一个小问题,按理来说,1000的16进制是03E8,最后一个数据是03E7是对的,但是保存的数据格式是8位的整型,为什么会出现03E8呢,最大不应该是00FF么。
值得思考,这个问题,可能得需要对DSP的数据类型进行更深入的了解才能解答。
9.解答
通过查询资料得知,28335的数据是16位对齐的,unsigned char是16位的数据格式,那么也就能说得通上面的问题了。
来源:CSDN
作者:WuZJJJ
链接:https://blog.csdn.net/chouye5700/article/details/104544313