[技术问答] N76E003 SRAM只有128 BYTE?

[复制链接]
5800|21
 楼主| wing_yes 发表于 2017-9-7 17:00 | 显示全部楼层 |阅读模式
本帖最后由 wing_yes 于 2017-9-7 19:45 编辑

规格书写着: N76E003提供丰富的特殊功能模块,包括: 256字节SRAM, 768字节XRAM

– 256字节片内直接存取RAM.
– 额外768字节片内间接存取RAM(XRAM)通过MOVX指令读写.

但实际上我超过128 byte就开始报错了。有知道怎么回事的吗?

Build target 'BLDC_SENSORLESS'
linking...
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   DATA   
    SEGMENT: ?DT?IT
    LENGTH:  0002H
Program Size: data=131.0 xdata=0 code=1633
Target not created

去掉一个32位的变量后:
Build target 'BLDC_SENSORLESS'
compiling motor_drive.c...
linking...
Program Size: data=127.0 xdata=0 code=1627
creating hex file from ".\Output\Bldc_sensorless"...
".\Output\Bldc_sensorless" - 0 Error(s), 0 Warning(s).
rgjinxuan 发表于 2017-9-7 17:20 | 显示全部楼层
不会,我用500  个没问题
l4157 发表于 2017-9-7 17:24 | 显示全部楼层
本帖最后由 l4157 于 2017-9-7 17:29 编辑

内存模式设置的问题,设置成 Small 只能用128字节,Compact可以用256,Large可以用1KB
 楼主| wing_yes 发表于 2017-9-7 19:20 来自手机 | 显示全部楼层
l4157 发表于 2017-9-7 17:24
内存模式设置的问题,设置成 Small 只能用128字节,Compact可以用256,Large可以用1KB ...

是在哪里设置?keil里面设吗?
 楼主| wing_yes 发表于 2017-9-7 19:27 来自手机 | 显示全部楼层
Keil Cx51编译器提供三条编译模式控制命令:SMALL,COMPACT,LARGE,它们对变量存储器空间的影响如下。  SMALL:所有变量都被定义在8051单片机的片内RAM中,对这种变量的访问速度最快。另外,堆栈也必须位于片内RAM中,而堆栈的长度是很重要的,实际栈长取决与不同函数的嵌套深度。采用SMALL编译模式与定义变量时指定data存储器类型具有相同效果。  COMPACT:所有变量被定义在分页寻址的片外XRAM中,每一页片外XRAM的长度为256字节:即所有变量存储在片外XRAM的某一页中。这时对变量的访问是通过寄存器间接寻址(MOVX @R0,MOVX @R1)进行的,变量的低8位地址由R0和R1确定,变量的高8位地址由P2口确定。采用这种模式时,必须适当改变配置文件STARTUP.A51中的参数:PDATASTART和PDATALEN;同时还必须对uVision2的“Options选项/BL51 Locator 标签页/Pdata框”中键入合适的地址参数,以确保P2口能输出所需要的高8位地址。采用COMPACT编译模式与定义变量时指定pdata存储器类型具有相同效果。  LARGE:所有变量被定义在片外XRAM中(最大可达64KB),使用数据指针DPTR来间接访问变量(MOVX @DPTR),这种编译模式对数据访问的效率最低,而且将增加程序的代码长度。采用LARGE编译模式与定义变量时指定xdata存储器类型具有相同效果。  Note: 1、在程序中定义的变量,若不指定其存储区域(data、idata、xdata等),则系统自动存放到上述编译模式指定的存储区。 2、在指定编译器编译模式情况下,要想将变量存放在其他区域,可指定变量修饰类型。(假设指定为small模式,则默认变量存储在片内RAM区,此时可指定变量为idata类型,即可将其存放在片外RAM中) 3、同一段代码,在不同编译模式下,编译出的代码code大小为:small < compact < large。 4、同一编译模式下,变量存储区域不同,编译出的代码code大小为:data < idata < xdata
l4157 发表于 2017-9-7 19:36 | 显示全部楼层
wing_yes 发表于 2017-9-7 19:20
是在哪里设置?keil里面设吗?

keil
project/Options for T****
alt+F7
Target下面有个memory Model 选项,下拉选择Large:variables in XDATA

评论

困扰一周问题,在这里找到答案了。万分感谢。  发表于 2019-6-19 09:34
 楼主| wing_yes 发表于 2017-9-7 19:44 来自手机 | 显示全部楼层
l4157 发表于 2017-9-7 17:24
内存模式设置的问题,设置成 Small 只能用128字节,Compact可以用256,Large可以用1KB ...

设置成large的话,那是不是所有变量都用movx 寄存器间接寻址?
捉虫天师 发表于 2017-9-7 20:27 | 显示全部楼层
有利有弊,还有设计时候不要超过128不就行了
捉虫天师 发表于 2017-9-7 20:27 | 显示全部楼层
先规划好用到的变量,然后excel里进行区间划分
l4157 发表于 2017-9-7 21:58 | 显示全部楼层
本帖最后由 l4157 于 2017-9-7 22:01 编辑
wing_yes 发表于 2017-9-7 19:44
设置成large的话,那是不是所有变量都用movx 寄存器间接寻址?

keil可以自己定义变量放在哪的, 用idata 和xdata等关键字
在51系列中data,idata,xdata,pdata的区别:
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。

https://bbs.21ic.com/icview-1170450-1-1.html


mintspring 发表于 2017-9-10 17:04 来自手机 | 显示全部楼层
没搞过这些,都是自己按需配置,没发现不够用的事情
a105865094 发表于 2017-9-11 10:16 | 显示全部楼层
变量可以用idata data xdata bdata关键词进行修饰,如unsigned char idata x;,默认的small模式不加修饰的变量其实是data
data:定义的变量在00H~7FH的RAM,128byte范围,变量可读写,直接寻址速度
idata:定义的变量在00H~FFH的RAM,256byte范围,变量可读写,简介寻址
bdata:定义的变量在20H~2FH的RAM,16byte范围,变量可读写。字节和位混合
xdata:定义的变量在扩展的外部存储区,64Kbyte范围,变量可读写,速度满
xixi2017 发表于 2017-9-11 19:49 | 显示全部楼层
做这个设计最好做出来个内存分配表,我听高人的建议做好个表,用起来相当嗨皮。
whtwhtw 发表于 2019-3-18 14:58 | 显示全部楼层
keil设置成SMALL模式,变量根据需求声明一下内存空间,比如unsigned char idata test[20]就是放置在idata存储空间中,unsigned char xdata test[20]就是放置在xdata存储空间中。默认的变量和堆栈就放置在RAM低128位空间
desertsailor 发表于 2019-6-20 10:51 | 显示全部楼层
128字节idata,128字节pdata,其余为xdata
zhuomuniao110 发表于 2019-6-21 11:35 | 显示全部楼层
方法错了。
zhuomuniao110 发表于 2019-6-21 11:36 | 显示全部楼层
定义类型时候要选对
zhuotuzi 发表于 2019-6-21 20:42 | 显示全部楼层
定义变量的类型要选择位置。
zhuotuzi 发表于 2019-6-21 20:43 | 显示全部楼层
这个版块之前有人问过这个问题,也有人帮忙解答,很完美的,这个是51,51有几个特别的关键字,你要知道。
wahahaheihei 发表于 2019-6-22 23:47 | 显示全部楼层
用idata 和xdata等关键字试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部