发 帖  
原厂入驻New
[问答] 如何使用XC8编译器开发PIC18F2420的代码
82 编译器 PIC18F2420
分享
你好!我在MPLABX IDE中使用XC8编译器开发PIC18F2420的代码。当我创建一个变量并将其标记为“易失性”时,编译器就不应该删除它,即使它被使用了,就我所理解的。然而,编译器仍然删除变量,如果它不被使用,尽管被标记为“易失性”。这是虫子吗?最好的问候,月光乌鸦
0
2020-4-27 08:09:47   评论 分享淘帖 邀请回答
19个回答
XC8版本和版本?发布一个完整的最小可构建的源代码来演示这一点。
2020-4-27 08:23:54 评论

举报

如上所示,展示你的代码。我们需要看到你实际做了什么,以及你如何测试,而不仅仅是你认为你做了什么的总结。
2020-4-27 08:30:53 评论

举报

我不这么认为。当访问变量时,易失性会禁用一些优化,如果未使用,则仍然是死区数据。我没有安装XC8,但是在手册中可能有某种方式向编译器表明不应该优化掉变量。
2020-4-27 08:43:59 评论

举报

这里是我的代码:空main(空隙){易失性int A;而(1){;}返回;}当我编译它时,数据的内存使用量是0字节。当我添加使用变量的语句时,内存使用量跳到2字节。编译器版本为1.38。
2020-4-27 09:00:15 评论

举报

就像@安德烈姆所说的那样,那就是死数据——没有那个变量的可执行代码。
2020-4-27 09:17:12 评论

举报

我知道它是死数据,但是用户指南特别指出在几个地方标记为“volatile”的变量永远不会被删除,即使它们没有被使用。
2020-4-27 09:29:39 评论

举报

声明它可能是静态的。
2020-4-27 09:40:40 评论

举报

XC8用户指南明确指出,即使不使用易失性变量,也不会删除它们。但是,内存使用报告可能不准确。
2020-4-27 09:48:28 评论

举报

尝试。。。或者尝试将其声明为全局变量:在主体()之外。我现在不记得了,但它跟汽车变量有关。等待“玛蒂克”在任何时候都有魅力。
2020-4-27 09:59:45 评论

举报

是的,使它静态工作,使它全局工作。即使没有它们,您也可以看到变量DOES存在于LST文件中,只是在数据空间报告中没有计数。我想这只是一个学术练习。如果你真的想要它孤立存在,那么它应该是静态的或全球性的。
2020-4-27 10:14:55 评论

举报

可能:您的变量A在函数主体()中定义,它是一个自动var(本地),所以它在编译的堆栈上。如果编译后的堆栈具有可重用的空间,则它可能不会显示额外的内存使用。静态强制VAR被放置在一个不被共享的单独的内存位置,因此它可以使用额外的内存。Volatile并不强制var是静态的,只是在每次使用var时要读取的值,而不是“缓存”或用常数替换。
2020-4-27 10:23:00 评论

举报

是的,我想这是有区别的。
2020-4-27 10:37:46 评论

举报

也只是出于好奇:如果var没有被使用,我们为什么要关心它是否被移除?
2020-4-27 10:55:16 评论

举报

学术活动,正如Qhb所说
2020-4-27 11:00:34 评论

举报

谢谢你的回复!我很高兴看到这是一个有帮助和活跃的社区:)当然它是无用的,但是我正试图了解正在发生的事情,因为我是编译器的新手。我列出了用户指南和测试的东西。@ QHB -变量只显示在.LST文件内的评论。如果我在C代码中实际使用变量,那么它也会出现在.lst代码中,而不仅仅是在注释中。至于jack给出的答案——我认为它应该以内存使用率显示,就像我实际使用变量时所做的那样。
2020-4-27 11:10:13 评论

举报

自动变量位于编译堆栈中。只有当它被使用时,它才会“推”到堆栈上,然后堆栈本身在数据空间中分配内存。因此,当变量未被使用时,它不会占用堆栈中的空间,因此没有内存使用。然而,XC8用户指南声明“使用易失性关键字是为了防止未使用的变量被删除”。
2020-4-27 11:16:58 评论

举报

但是,你必须记住这不是一个全局变量,也不是持久变量。正如你所说的,本地汽车VAR在使用之前不消耗内存。编译器不是“删除”这个var,它永远不存在,除非它被用作标签,直到它被使用。将VAR更改为全局变量,使其波动,并查看它是否被“删除”,我敢打赌。
2020-4-27 11:24:21 评论

举报

是的,我在想那个句子中的“被删除”这个词,并得到了和你一样的解释。自动变量在使用和执行时会出现。在这种情况下,变量A在程序的整个持续时间内不存在,因此它没有内存使用。也许杰夫(MADYC)应该在下一个XC8C编译器用户指南中阐明这一点。我认为@ QHB已经确认它是静态的或全局的作品。
2020-4-27 11:40:34 评论

举报

啊,我明白它是如何运作的,现在它意味着什么。这对我来说有点奇怪,因为在影响内存使用报告的方面,我无法让本地变量在处理和不使用“volatile”关键字时有不同的行为。当然,易失性仍然做它应该做的事——防止编译器优化并避免实际访问变量。阅读手册只是让我觉得它会有额外的含义。谢谢!
2020-4-27 11:53:17 评论

举报

只有小组成员才能发言,加入小组>>

109个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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