mypear 发表于 2022-8-12 11:05:30

请教芯片RAM能否用尽?

请教各位技术达人:芯片裸跑,能否把RAM用尽或剩几十字节?会不会像window内存耗尽,卡成狗。

lyping1987 发表于 2022-8-12 11:08:36

我的理解是不会的,裸跑应该是编译的时候提前就分配好了,不想windows一样启动程序动态分配内存。

huangguimina4 发表于 2022-8-12 11:27:10

我现在越来越喜欢使用动态内存申请,不知道是不是不好的习惯{:lol:}

Xujuango 发表于 2022-8-12 11:34:52

以前51的时候,才256,512字节,榨的干干净净。

tang_qianfeng 发表于 2022-8-12 11:35:51

huangguimina4 发表于 2022-8-12 11:27
我现在越来越喜欢使用动态内存申请,不知道是不是不好的习惯
(引用自3楼)

相当危险, 带安全认证的rtos都是用的静态内存分配

yyts 发表于 2022-8-12 11:36:32

本帖最后由 yyts 于 2022-8-12 12:15 编辑

只要保证预留的堆栈空间的够用的,肯定可以用尽啊,不用尽留着也没人能用得到了。

wicy001 发表于 2022-8-12 11:40:45

栈区留足,其他用尽没关系。

ackyee 发表于 2022-8-12 12:40:09

堆栈够用的情况下压榨完也够用

vuo50z 发表于 2022-8-12 15:41:25

本帖最后由 vuo50z 于 2022-8-12 15:44 编辑

win内存小就卡是因为,winy
不小心发出来了。。。

vuo50z 发表于 2022-8-12 15:43:52

win内存小就卡是因为win用硬盘虚拟了内存,物理内存不够用时就会频繁的读写硬盘,所以卡。嵌入式系统不会卡,只有系统崩溃和不崩溃两种情况。

初音之恋 发表于 2022-8-12 18:02:12

不会,堆栈配置上都已经留好了,只要不越界就没事,而且单片机的任务都是固定的,消耗都是定死的,Windows程序都是动态的,内存超出就会启用虚拟内存以及内存调度就会卡慢

t3486784401 发表于 2022-8-12 18:17:17

曾经用 M328 写过一个虚拟示波器,片上 2KB 内存全部用于 FIFO 缓存,没给堆栈留一个字节。

当然代价是:
① 需要重写 startup,
② 不能调用任何函数,全靠宏,
③ 不能使用任何库,全靠 C 模拟,
④ 不够用内存,全靠没用的片上设备寄存器来补
⑤ 编译结果需要手动确认,任何 CALL 指令都不能有

rei1984 发表于 2022-8-12 18:36:57

t3486784401 发表于 2022-8-12 18:17
曾经用 M328 写过一个虚拟示波器,片上 2KB 内存全部用于 FIFO 缓存,没给堆栈留一个字节。

当然代价是:
(引用自12楼)

你这也太强了。。。 有这个时间,不如换个大片子啊

asj1989 发表于 2022-8-12 20:35:08

t3486784401 发表于 2022-8-12 18:17
曾经用 M328 写过一个虚拟示波器,片上 2KB 内存全部用于 FIFO 缓存,没给堆栈留一个字节。

当然代价是:
(引用自12楼)

对啊那你为啥不换一个大容量的芯片

laujc 发表于 2022-8-12 21:47:12

t3486784401 发表于 2022-8-12 18:17
曾经用 M328 写过一个虚拟示波器,片上 2KB 内存全部用于 FIFO 缓存,没给堆栈留一个字节。

当然代价是:

(引用自12楼)

用汇编写的吧

t3486784401 发表于 2022-8-12 21:51:52

rei1984 发表于 2022-8-12 18:36
你这也太强了。。。 有这个时间,不如换个大片子啊
(引用自13楼)

因为 M328 的硬件比较多,尤其是 Arduino UNO

不过这个是适配 7.3728M 主频的,有空了改适配下 UNO-16M

1a2b3c 发表于 2022-8-12 21:54:50

以前51时代用汇编,倒是可以用的一bit都没有空余的。因为代码运行每一条指令用了哪些资源都是清清楚楚的,包括中断啊函数调用啊,所以不会有任何的冲突地方,任何程序要执行到的情景都是早就考虑到了的,

t3486784401 发表于 2022-8-12 21:54:56

asj1989 发表于 2022-8-12 20:35
对啊那你为啥不换一个大容量的芯片
(引用自14楼)

现在有了高速的 STM32 了,就算 STC 也不差,但就是没那个移植的心情。

Arduino UNO 价格又降下来了,在通用的底板上移植示波器,比一个高端的专用板来的划算:因为硬件遍地都是

p4s5j6 发表于 2022-8-12 21:57:28

有中断都不敢用,随时蹦掉

t3486784401 发表于 2022-8-12 22:01:38

laujc 发表于 2022-8-12 21:47
用汇编写的吧
(引用自15楼)

C 写的,编译环境 ICCAVR,但是人肉检查了生成的 lst、map 文件,附上源码:

laujc 发表于 2022-8-14 09:57:01

t3486784401 发表于 2022-8-12 22:01
C 写的,编译环境 ICCAVR,但是人肉检查了生成的 lst、map 文件,附上源码:
(引用自20楼)

您是前辈,我08年毕业,主要从事家电开发,慢慢的芯片Flash就越来越便宜了
再加上芯片资源对家电的控制需求来说,都是过剩的,所以不是很在意优化。

dou_yuyu 发表于 2022-8-14 11:09:05

如果用动态内存,会,不会卡成狗,会失败。

t3486784401 发表于 2022-8-14 11:46:07

laujc 发表于 2022-8-14 09:57
您是前辈,我08年毕业,主要从事家电开发,慢慢的芯片Flash就越来越便宜了
再加上芯片资源对家电的控制需 ...
(引用自21楼)

前辈不敢当,我这只是代码写的多罢了。

我是一个大白菜 发表于 2022-8-14 12:29:05

t3486784401 发表于 2022-8-12 18:17
曾经用 M328 写过一个虚拟示波器,片上 2KB 内存全部用于 FIFO 缓存,没给堆栈留一个字节。

当然代价是:
(引用自12楼)

大神这操作,想都不敢想啊,佩服

dellric 发表于 2022-8-14 12:58:06

代码中永远不要有不可预测的内存分配,全静态分配是嵌入式程序员的职业操守,就是剩一个字节也不会卡死。

1a2b3c 发表于 2022-8-14 13:02:33

dellric 发表于 2022-8-14 12:58
代码中永远不要有不可预测的内存分配,全静态分配是嵌入式程序员的职业操守,就是剩一个字节也不会卡死。 ...
(引用自25楼)

那我还很庆幸自己以前是写汇编的,没有任何的不知道的内存消耗,
所以导致我学着写几句c后,也从来不会用啥动态分配,压根搞不懂是啥意思:)

dellric 发表于 2022-8-14 14:49:07

1a2b3c 发表于 2022-8-14 13:02
那我还很庆幸自己以前是写汇编的,没有任何的不知道的内存消耗,
所以导致我学着写几句c后,也从来不会用 ...
(引用自26楼)

没关系,需要把它搞懂, 然后更需要把它忘掉, 在脑袋里面留下一个坑, 让未来的自己不跳下去

laujc 发表于 2022-8-15 16:46:57

1a2b3c 发表于 2022-8-14 13:02
那我还很庆幸自己以前是写汇编的,没有任何的不知道的内存消耗,
所以导致我学着写几句c后,也从来不会用 ...
(引用自26楼)

上系统,多任务时需要这样操作

不上系统的项目,基本不用考虑这些

mypear 发表于 2022-9-3 09:09:34

感谢各方留言

dog 发表于 2022-9-3 11:25:30

楼学习一下内存的分配吧,能用尽的只有STACK,HEAP,那不是卡,是飞

gilberth 发表于 2022-9-3 11:54:59

dog 发表于 2022-9-3 11:25
楼学习一下内存的分配吧,能用尽的只有STACK,HEAP,那不是卡,是飞
(引用自30楼)

这两个形容词(动词)对比很鲜明{:biggrin:}

zchong 发表于 2022-9-3 13:54:29

卡不成狗就嗝屁了
要么呼呼跑,要么带你飞

syj0925 发表于 2022-9-5 10:47:23

动态内存是可以节省RAM的,很多业务之间是不共存的,如果用静态,就一直占用资源。

iamseer 发表于 2022-9-6 09:16:39

t3486784401 发表于 2022-8-12 18:17
曾经用 M328 写过一个虚拟示波器,片上 2KB 内存全部用于 FIFO 缓存,没给堆栈留一个字节。

当然代价是:
(引用自12楼)

感觉类似的办法也可以强制给没内存的tiny15之类用。
比如这位楼主:https://www.amobbs.com/thread-5760208-1-1.html (您回过贴)

磊磊映画 发表于 2022-9-6 09:37:11

看了以上的评论 总结一下:楼主说先说裸跑 和win操作系统本来就是矛盾的
裸跑是静态分配内存的 前期开发过程中内存是够用的(固定的) 后续运行过程中也是固定的, 就不会出现内存耗尽的问题。
所谓内存耗尽出现在跑操作系统的项目中,运行过程中动态申请/释放内存,就会出现内存耗尽的情况。

iamseer 发表于 2022-9-6 10:10:26

磊磊映画 发表于 2022-9-6 09:37
看了以上的评论 总结一下:楼主说先说裸跑 和win操作系统本来就是矛盾的
裸跑是静态分配内存的 前期开发过 ...
(引用自35楼)

"前期开发过程中内存是够用的(固定的) 后续运行过程中也是固定的" 那可未必。堆的大小栈的大小在后续运行过程中都未必和开发一样。如果调用或者申请内存过多。。。



磊磊映画 发表于 2022-9-6 10:40:28

iamseer 发表于 2022-9-6 10:10
"前期开发过程中内存是够用的(固定的) 后续运行过程中也是固定的" 那可未必。堆的大小栈的大小在后续运 ...
(引用自36楼)

这个图不错赞 收藏了,得把前提加上裸跑的情况   在 一般裸跑 不申请动态内存情况下 。

擦鞋匠 发表于 2022-9-10 21:21:08

估计楼主没用过430,它的ram基本都很小,所以,几乎肯定要把ram榨取干净!
页: [1]
查看完整版本: 请教芯片RAM能否用尽?