找回密码
 立即注册
查看: 322|回复: 9

关于AI MCU的RAM编程的问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-18 21:30:53
已绑定手机

4

主题

18

回帖

120

积分

注册会员

积分
120
发表于 2025-3-12 23:04:28 | 显示全部楼层 |阅读模式
新手在刚开始用STC编程,程序莫名奇妙的异常。但是看代码又发现不是代码问题,往往是RAM的内存暴掉导致程序重启,或者在函数嵌套过深导致调出异常(递归或者多接口嵌套封装),结果为0.

我们在使用STC的时候如何避免这样的问题产生呢?在问题发生时,如何及时知道或者排查出是RAM空间满导致的问题呢?
在51编程时,使用全局变量的时候,idata,xdata,code这些关键字又对应哪些作用,是否有一些编程方向的经验指导呢?应该是在什么时候使用,什么时候不用再意。
函数的每次调用都在入栈,我们这个栈的空间对应RAM的空间,如果空间满了怎么办,是应该约束编程呢还是通过修改配置的方式去解决呢?

各个STC型号的芯片应该如何去选他们的MemoryMode呢?


STC15W框图

STC15W框图

memoryMode

memoryMode

AI8051框图

AI8051框图
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-12 23:08:00 | 显示全部楼层
在使用STC单片机进行编程时,RAM管理是确保程序稳定运行的关键。以下是一些建议和经验指导:<br><br>1. **避免RAM溢出**:<br>   - **函数嵌套控制**:避免过深的函数嵌套和递归调用,以减少栈空间的使用。<br>   - **栈空间监控**:通过调试工具监控栈空间使用情况,确保栈空间不会溢出。<br>   - **内存分配优化**:合理分配全局变量和局部变量,避免不必要的内存占用。<br><br>2. **RAM空间排查**:<br>   - **调试工具**:使用调试工具(如STC-ISP)监控RAM使用情况,及时发现内存溢出问题。<br>   - **内存检查**:在程序关键点插入内存检查代码,检测RAM使用情况。<br><br>3. **关键字使用**:<br>   - **idata**:用于指定内部RAM,速度快,但空间有限。<br>   - **xdata**:用于指定外部RAM,空间较大,但速度较慢。<br>   - **code**:用于指定程序存储器,通常用于存储常量数据。<br><br>4. **编程方向经验**:<br>   - **全局变量**:尽量减少全局变量的使用,避免不必要的内存占用。<br>   - **局部变量**:在函数内部使用局部变量,减少内存占用。<br>   - **内存管理**:合理规划内存使用,避免内存碎片和浪费。<br><br>5. **栈空间管理**:<br>   - **栈空间约束**:在编写程序时,考虑栈空间的大小,避免栈空间溢出。<br>   - **栈空间优化**:优化函数调用,减少栈空间的使用。<br><br>通过以上措施,可以有效避免RAM溢出问题,确保程序的稳定运行。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-18 21:30:53
已绑定手机

4

主题

18

回帖

120

积分

注册会员

积分
120
发表于 2025-3-12 23:22:17 | 显示全部楼层
国芯人*** 发表于 2025-3-12 23:08
在使用STC单片机进行编程时,RAM管理是确保程序稳定运行的关键。以下是一些建议和经验指导:1. **避免RAM溢 ...

关于栈空间溢出,有什么具体的监控手段吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-18 21:30:53
已绑定手机

4

主题

18

回帖

120

积分

注册会员

积分
120
发表于 2025-3-12 23:38:21 | 显示全部楼层
写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。
在51系列中data,idata,xdata,pdata的区别:

data:固定指前面0x00-0x7F的128字节的RAM,可以用ACC直接读写,速度最快,生成的代码也最小。

idata:固定指前面0x00-0xFF的256个RAM,其中前128字节和data的128字节完全相同,只是访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx(补充:c中idata做指针式的访问效果很好)

xdata:外部扩展RAM,一般指外部0x0000-0xFFFF空间的64K字节,用DPTR访问。

pdata:外部扩展RAM的低256个字节,地址出现在A0-A7上时读写,PDATA 段只有256 个字节,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。pdata的优点:对PDATA 和XDATA 的操作是相似的,但是对PDATA 段寻址比对XDATA 段寻址要快,因为对PDATA 段寻址只需要装入8 位地址,而对XDATA 段寻址需装入16 位地址。

单片机C语言unsigned char code table[] code 是什么作用?

code的作用是告诉单片机,我定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改,对应的还有data是存入RAM的意思。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2025-05-01 12:18:53

10

主题

143

回帖

348

积分

中级会员

积分
348
发表于 2025-3-13 03:02:11 | 显示全部楼层
airg*** 发表于 2025-3-12 23:38
写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。与ANSI-C稍有不同,它只分SAMLL、CO ...

idata的低128个就是data,pdata就是xdata的低256个,位置重合,但是data比idata访问快,xdata是最慢,pdata貌似有有问题,code只能做全局声明,并且要声明的时候一起赋值。不能先声明,把它放到等号左边来赋值。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2025-05-01 12:18:53

10

主题

143

回帖

348

积分

中级会员

积分
348
发表于 2025-3-13 03:27:29 来自手机 | 显示全部楼层
还有编译器一旦检测data超过128个,就报空间不足的。要不在声明的时候一起把区域给它分配了,要不在软件中设置下,自动分配的变量直接放在xdata中,(扳手-再第二页中-memory mode中直接选择xdata)。idata中高128个压根不声明就不会去用,况且用idata声明后一般是先用低128个。不要把data区别定死全部用完,虽然设置让变量直接放在xdata区域,编译器也会自动用data区域的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-03-18 21:30:53
已绑定手机

4

主题

18

回帖

120

积分

注册会员

积分
120
发表于 2025-3-13 08:56:24 | 显示全部楼层
有没有简单好记的方法来用,是不是我大数组,大变量结构体用xdata就对了;如果是const类型/只读类型数据,写code就对了。其它的不那么重要对吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-05-02 08:15:40
已绑定手机

13

主题

1257

回帖

2975

积分

金牌会员

积分
2975
发表于 2025-3-13 09:14:03 | 显示全部楼层
huh*** 发表于 2025-3-13 03:27
还有编译器一旦检测data超过128个,就报空间不足的。要不在声明的时候一起把区域给它分配了,要不在软件中 ...

编译器会把statck自动分配到idata的高128字节,我一般不会声明使用idata
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-13 09:33:26 | 显示全部楼层
memory mode选small(8位)或xsmall(32位),大数组放xdata
DebugLab
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-3-13 10:26:13 | 显示全部楼层
airg*** 发表于 2025-3-13 08:56
有没有简单好记的方法来用,是不是我大数组,大变量结构体用xdata就对了;如果是const类型/只读类型数据, ...

可以改一下存储模式,让编译器优先把变量存储到xdata,对于一些性能要求比较高,或者代码运行的时序比较严的变量再手动放置到data区或者按照要求配置。编译完了之后看一下占用,不超一般都能运行起来
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 09:03 , Processed in 0.202606 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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