在 while 循环之前定义变量或在循环中定义为静态变量

Define variable before while loop or as static in loop

我正在用 C99 编写微控制器(PIC18,8 位)。我有这段代码:超时,如果触发,则 returns 提早:

uint16_t timeout_x100us = 50000;

while (!is_interruptflag())                 // When this interrupt occurs, continue.
{
    if (!(--timeout_x100us))                // Decrement and check timer.
    {
        return;                             // Timeout ran out.
    }

    __delay_us(100);                        // Delay for 100µs.
}

我有两个问题:(1) 是不是很好 practice/does 在循环中将变量 timeout_x100us 定义为静态变量以最小化是有意义的它的范围?

while (!is_interruptflag())                 // When this interrupt occurs, continue.
{
    static uint16_t timeout_x100us = 50000;

    if (!(--timeout_x100us))                // Decrement and check timer.
    {
        return;                             // Timeout ran out.
    }

    __delay_us(100);                        // Delay for 100µs.
}

(2) 我也在尝试尽量减少程序内存使用。第一个代码片段使用 36 字节的内存,而第二个(静态)使用 54 字节,明显更多(没有编译器优化)。为什么静态声明使用更多的程序内存?谢谢。

static 在这种情况下不会最小化范围。它正好相反——它使它成为静态存储变量,并且它与应用程序一样长(与全局变量相同,占用 RAM 内存)。只有C能见度降低了。

顺便说一句,它只会在调用主函数之前初始化一次。

(1) Is it good practice/does it make sense to define the variable timeout_x100us as static inside the loop to minimize its scope?

一般来说,缩小变量的范围是一种很好的做法。无论如何,您需要在使用前将其设置为 运行 时间的值。

但是,特别是对于嵌入式系统,编写依赖静态存储初始化(.data/.bss)的代码是不好的做法。部分原因是初始化和变量使用之间可能经过了很长时间,部分原因是在 CRT 中使用非标准启动代码很常见 甚至 都不会初始化此类变量.

你应该做的是将timeout_x100us作为一个自动存储的局部变量,然后在每次执行代码之前将其初始化为一个值。

同时将幻数 50000 替换为有意义的命名 #define

还要记住,整数常量 50000 在 PIC 上是 32 位 long 类型,这可能是一个影响性能的错误。将其替换为 50000u 以确保 16 位 unsigned int 代替。

您应该可以用这样的代码替换代码:

uint16_t i;
for(i=0; !is_interruptflag() && i<TIMEOUT; i++)
{
  __delay_us(100);
}

if(i==TIMEOUT)
{
  return ;
}

(2) I am also trying to minimize program memory usage. The first code snippet uses 36 bytes of memory, whereas the second one (static) uses 54 bytes

第一个使用堆栈,所以它只是使用了另一种内存。额外的代码膨胀可能与某些 PIC Harvard 架构问题有关。拆机查原因