搜索
bottom↓
回复: 16

Keil编译器环境下,如何自行清理RAM

[复制链接]

出0入0汤圆

发表于 2017-11-24 16:25:21 | 显示全部楼层 |阅读模式
如题,KEIL环境下把启动文件删掉后,自己清理RAM怎么清理。
因为让编译器自行清零RAM的话,如果发生看门狗复位,MCU也会自动清理RAM。我想实现的功能是,上电后自行清理一次RAM,如果发生看门狗复位,则不清理。
我现在用的芯片是中颖的79F3283,跟中颖的技术支持联系过,他们说把启动文件删除掉不会有影响,删掉后就不会自动清理了。然后我刚刚写了一段,仿真时软件
在第一个for循环里面陷入了死循环,这个功能能应该怎么实现。网上搜了好久也没查到什么有用的资料。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2017-11-24 16:47:26 | 显示全部楼层
使用原来的启动代码  汇编加个复位标志判断就可以了。

出0入0汤圆

 楼主| 发表于 2017-11-24 16:49:07 | 显示全部楼层
kebaojun305 发表于 2017-11-24 16:47
使用原来的启动代码  汇编加个复位标志判断就可以了。

我试下看

出5入14汤圆

发表于 2017-11-24 16:51:48 | 显示全部楼层
本帖最后由 EMC菜鸟 于 2017-11-24 16:57 编辑

如果是 keil 环境下,是不是可以把启动文件加入到自己的项目中(同时复制到项目文件夹下),然后改写之?

刚刚测试了下,如下修改即可:
                CSEG    AT      0
?C_STARTUP:     LJMP        ?C_START                                ;LJMP    STARTUP1

出0入0汤圆

发表于 2017-11-24 18:37:17 来自手机 | 显示全部楼层
不会所有的变量都不要清除吧?把不要清除的变量用指针访问,放在ram的最高端。

出0入0汤圆

 楼主| 发表于 2017-11-25 08:53:42 | 显示全部楼层
superAFE 发表于 2017-11-24 19:01
楼主能写这样的代码进行清ram,难道对堆栈等东西完全没概念?

我跟中颖的工程师咨询过,他们说启动文件里面处理堆栈的功能没什么作用,可以直接把启动文件删掉。
我直接这样清理RAM,会把堆栈删掉吗,51单片机的架构还没玩熟悉。

出0入0汤圆

 楼主| 发表于 2017-11-25 08:55:49 | 显示全部楼层
superAFE 发表于 2017-11-24 19:01
楼主能写这样的代码进行清ram,难道对堆栈等东西完全没概念?

以前用其他的芯片习惯性在使用前把RAM,自己清理一遍。

出0入0汤圆

 楼主| 发表于 2017-11-25 09:15:50 | 显示全部楼层
EMC菜鸟 发表于 2017-11-24 16:51
如果是 keil 环境下,是不是可以把启动文件加入到自己的项目中(同时复制到项目文件夹下),然后改写之?

...

具体怎么修改的,能看下吗

出0入0汤圆

 楼主| 发表于 2017-11-25 10:44:08 | 显示全部楼层
superAFE 发表于 2017-11-25 10:03
你这段清ram的程序是由main来调用的吧?调用前会把pc指针压栈的,
那你清ram的时候岂不是把压到堆栈的pc ...

      有点明白了,我原来用的芯片里面有个专用的堆栈指针,用户是不能直接读写堆栈指针的,所以我直接清理所有的RAM不会有问题。
但是51单片机的堆栈信息是存储在RAM里面的,所以不能直接清理所有的RAM。这样的话要实现我说的功能的话,要怎么做。刚按
坛友说的在启动文件里面添加看门狗复位判断条件,编译通不过,启动文件跟芯片的内部寄存器应该是没有联系的,只是处理了一
下RAM跟堆栈信息。
      我以前那样写写习惯了,感觉自己处理一遍RAM靠谱一些,而且可控性要好些。
      我现在是在初始化时把所有用的的变量一个个的清理一下,感觉这样比较麻烦。还有个办法就是定义变量的时候按地址顺序往下定义,
初始化时直接用指针去清理相应的地址就好了。但是这样的话后续修改功能的话还要一个个的去查变量地址写到那里了,也比较费事。
有没有比较简洁的办法。

出0入0汤圆

 楼主| 发表于 2017-11-25 10:58:07 | 显示全部楼层
superAFE 发表于 2017-11-25 10:52
编译不通过是因为你写法不对。。我也好久没写过ASM了,你可以求助一个中颖的FAE。 ...

跟中颖的两个FAE搞了两天多,也没搞出个什么名堂,还是自己想办法算了!

出0入22汤圆

发表于 2017-11-25 10:58:11 来自手机 | 显示全部楼层
应该是把你不要系统自己清理的内存区域划分出来,定义为noinit属性,改写编译器的连接文件,自定义连接,keil是sct文件,iar是icf文件,自己搜索分散加载功能学习

出0入0汤圆

 楼主| 发表于 2017-11-25 11:00:57 | 显示全部楼层
jiaowoxiaolu 发表于 2017-11-25 10:58
应该是把你不要系统自己清理的内存区域划分出来,定义为noinit属性,改写编译器的连接文件,自定义连接,ke ...

你说的这个方法我不知道从那里下手

出0入0汤圆

发表于 2017-11-25 11:02:02 | 显示全部楼层
启动文件设置栈是在清理了ram之后把
修改一下START或者LEN,把不想清理的部分放到这个范围之外就好了。
还是建议清理的,否则莫名奇妙的问题很多。不过在程序中每个变量都有初始化也可以。
但是会占空间的。要在一个1K的芯片里面做很多事情,就要一个字节一个字节的节约才行。

出0入0汤圆

 楼主| 发表于 2017-11-25 11:32:01 | 显示全部楼层
xiaobendan 发表于 2017-11-25 11:02
启动文件设置栈是在清理了ram之后把
修改一下START或者LEN,把不想清理的部分放到这个范围之外就好了。
还 ...

空间倒是比较大,可以随便挥霍

出0入0汤圆

发表于 2017-11-25 21:53:37 来自手机 | 显示全部楼层
还是将内存分块靠谱  定义变量可以指定定义到哪块

出0入0汤圆

发表于 2017-11-26 06:33:06 | 显示全部楼层
在程序中每个变量都有初始化为0,简单粗暴。

出0入0汤圆

 楼主| 发表于 2017-11-27 11:30:15 | 显示全部楼层
huangqi412 发表于 2017-11-25 21:53
还是将内存分块靠谱  定义变量可以指定定义到哪块

这种怎么定义的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 05:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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