当前位置: 首页 > 知识库问答 >
问题:

隐式声明所有变量为volatile

马沛
2023-03-14

gcc是否有一个选项来禁用未显式定义为volatile的全局变量的读/写优化?

我的团队正在耗尽我们的嵌入式C项目的程序内存,该项目使用gcc构建。当我启用优化以减少代码大小时,代码不再像预期的那样工作,因为我们没有在我们应该使用的地方使用volatile关键字。也就是说,我能够通过声明在ISRs Volatile中访问的几个变量来解决呈现的问题。然而,我并不确定这些是我需要声明volatile的唯一变量,我只是还没有注意到其他的bug。

我听说“一些编译器”有一个标志来隐式地声明所有的东西都是volatile的,但我应该抵制这种诱惑,因为它是“思想的替代品”(参见https://barrgroup.com/embedded-systems/how-to/c-volater-keyword)。

是的,但思想是昂贵的。尽管在注释部分尝试说服我不要这样做,但我希望有一个快速的解决方法,在不破坏应用程序的情况下减少代码大小。

共有1个答案

丁弘新
2023-03-14

你是说除了-o0以外的东西吗?

我认为,黑GCC做一个快速实验并不是太难。在gcc/c/c-decl.c中的grokdeclarator中的这个位置可能是为感兴趣的storage_class值无条件注入volator限定符(在您的情况下可能是csc_nonecsc_externcsc_static)的好位置。

/* It's a variable.  */
/* An uninitialized decl with `extern' is a reference.  */
int extern_ref = !initialized && storage_class == csc_extern;

type = c_build_qualified_type (type, type_quals, orig_qual_type,
                   orig_qual_indirect);

实验应该告诉您,从性能/代码大小的角度来看,这是否可行,如果可行,您可能希望将其作为适当的上游补丁提交。

 类似资料:
  • 问题内容: 我一直在看一些代码,很难在php类中计算变量声明。具体来说,似乎我正在查看的代码在使用它们之前没有声明类变量。现在这是可以预期的,但是我找不到任何表明可能的信息。所以您会期望这样: 上班?并在类实例上创建这些变量以供以后使用吗? 问题答案: 这与正常变量声明的工作原理相同: PHP类与其他语言不太一样,在其他语言中,需要将成员变量指定为类声明的一部分。PHP类成员可以随时创建。 话虽如

  • let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v

  • 问题内容: 我了解“隐式声明”通常意味着必须在调用函数之前将其置于程序的顶部,否则我需要声明原型。 但是,应该在文件中(该文件已包含在内)。 有没有什么办法解决这一问题? 问题答案: 没错,如果您包含适当的标头,则不应收到隐式声明警告。 然而,该功能已被 删除 ,从C11的标准。这意味着in中不再有原型。 曾经 在。 删除的原因是众所周知的:它不能防止缓冲区溢出。因此,您永远不应使用,而应改用尾随

  • 问题内容: 我不明白这个脚本有什么问题 我希望它在表中插入10个值,但是第二行有错误。 问题答案: MySQL不支持执行存储过程代码的匿名块。 您需要创建一个包含该代码的存储过程,然后调用它。 另外,您在插入语句的末尾缺少分号。我修好了 您可能还想使用concat()而不是+来生成名称,但是我将把更改留给您。 创建过程: 调用过程:

  • 主要内容:类型断言(Type Assertion),类型推断,变量作用域变量是一种使用方便的占位符,用于引用计算机内存地址。 我们可以把变量看做存储数据的容器。 TypeScript 变量的命名规则: 变量名称可以包含数字和字母。 除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。 变量名不能以数字开头。 变量使用前必须先声明,我们可以使用 var 来声明变量。 我们可以使用以下四种方式来声明变量: 声明变量的类型及初始值: 例如: 声明变量的类型,

  • 问题内容: 学习Python,并且有一些基本的疑问。 1.我已经看到变量声明(这里的路径)为 有时,没有显式声明,而是通过进行初始化。 我了解的目的,但建议在其他任何函数中声明变量。 2.如何创建变量以保存自定义类型? 问题答案: 好的,首先是第一件事。 Python中没有“变量声明”或“变量初始化”之类的东西。 我们简单地将其称为“分配”,但可能应该仅将其称为“命名”。 赋值的意思是“现在此名称