【问题标题】:Inline if (?:) doesn't work in _delay_us()内联 if (?:) 在 _delay_us() 中不起作用
【发布时间】:2012-02-04 20:56:44
【问题描述】:

当我尝试在我的 1-Wire 实现中使用 _delay_us(condition ? value_if_true : value_if_false) 时,延迟不起作用,并且我的设备没有得到任何响应,但是当我将其替换为:

if(condition) _delay_us(value_if_true);
else _delay_us(value_if_false);

当我在 lcd 上显示 inline if 值时,它会显示正确的值。

那么这两种符号有什么区别呢? 如果在 _delay_us() 中工作,我如何进行内联?

【问题讨论】:

  • 什么是_delay_us?是宏吗?我会尝试_delay_us((condition ? value_if_true : value_if_false))
  • 我会专注于 value_if_true/false 并且我宁愿把_delay_us((condition) ? (value_if_true) : (value_if_false)) 给你省去任何麻烦!
  • 我猜 _delay_us() 是编译器内在的。这些东西通常需要一个数字文字,因为编译器会识别它并将其直接转换为为您提供延迟所需的正确指令数。所以它通常必须是一个数字字面量值,或者编译器知道它的值的其他常量。
  • 如果是编译器问题,编译器会发出警告/错误。 b3niup 说延迟不起作用所以我猜这里的问题是在运行时
  • 在你的源文件上运行 avr-gcc -S,它会输出包含线索的程序集。

标签: c microcontroller avr avr-gcc atmega


【解决方案1】:

documentation 明确表示:

为了使这些函数按预期工作,必须启用编译器优化,并且延迟时间必须是编译时已知常量的表达式。如果不满足这些要求,由此产生的延迟会更长(并且基本上是不可预测的),否则不使用浮点计算的应用程序将因链接到应用程序的浮点库例程而导致严重的代码膨胀。

【讨论】:

    【解决方案2】:

    哎呀......完全不合时宜的想法,但把它们留在这里提醒我在发布之前要三思。

    你需要:条件? _delay_us(value_if_true) : _delay_us(value_if_false)

    与 if 语句的语法基本相同

    想想

    (条件)?(判断条件是否为真):(判断条件是否为假)

    【讨论】:

    • 不,这里的原始语法很好。
    • 不确定作为函数的参数是否正确。从来没有那样用过。我一直认为三元运算符等同于“if”语法。
    • 鉴于观察到的功能差异,我想知道 objdump 会显示什么。如果它是这样写的,并且按规定运行,我想知道它是否被优化了。
    • 我想这就是周末发生的事情,现在我在想。我以前曾将它们用作函数的参数,令我懊恼的是,我想有时你习惯使用某些东西却忘记了。
    • 这确实有效,因为现在_delay_us 有一个编译时常量作为它的参数(它必须是它才能工作)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多