使用STM8S105系列单片机,RAM有2K大小, 建立一个数量超过512个的比较大的数组,会溢出,该怎么办?

使用STM8S105系列单片机,RAM有2K大小, 建立一个数量超过512个的比较大的数组,会溢出,该怎么办?,第1张

RAM 只有2K,它的flash可见一斑,如果数组不是可变的,当然可以写const存在flash中,如果不可变,可在所要用到的函数内部中定义一个小一点的数组分开来读写,函数退出时,会自行释放这部分内存。

我来详细解答你的问题。
1、是的,但是必须打开总中断EA和定时器0中断ET0(即给中断寄存器赋值为0x82H),编写中断程序是需要从中断入口进入的,定时器0的中断入口地址是0x000B,可以在这个地址加一个跳转到你的中断服务程序。
2、定时器0的溢出标志是TF0,定时器1的溢出标志是TF1,你现在用的是中断方式,需要在中断服务程序结束之前,加上一句CLR
TF0即可,若你想不采用中断,需要等待查询该溢出标志,当为1时,再清零,就是你说的JBC了。
3、是的。他们是独立的,否则,单片机就不能做事了。

单片机堆栈溢出后会根据其位置会对运行产生不同程度的影响,或者进入死循环,或者出现不可预料的结果,如果没有开看门狗的话,复位的可能性较小。
一、如果栈顶设置在低位,比如二FH,预想堆栈空间比如一陆个字节,如果溢出,那么如果四0H开始被用户在使用的话,可能改变用户寄存器的值,这个影响是双方面的,一是改变了用户的运行结果,二是,当堆栈保存的是子程序地址的话,将出现不可预料的结果,执行完后将回不去了。
二、如果栈顶设置在高位,比如陆FH,如果溢出的话,那么后面压入堆栈的值将保存在一个虚拟的空间中,也就是吧0H之后的RAM空间,这个RAM空间是不存在的,因此会造成结果不正确,保存的是地址的话,也会无法回到保存位置

可以在连接命令文件中指定堆栈尺寸,并且用特定字符串初始化这些区域,比如初始化成"STACK";然后充分运行程序;用内存观察观察堆栈使用情况(“STACK”被冲掉的部分是使用过的栈区),大致可估算使用堆栈的最坏情况。
根据以上分析,可以设置最佳栈区尺寸,如果栈区使用过大,请优化程序:
-子程序中尽量不要开辟新的大尺寸变量;
-程序调用子程序尽量少使用传入的参数,使用全局变量;
-减少程序中switch语句和循环的嵌套。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10422814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存