在 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 架构问题有关。拆机查原因
我正在用 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 架构问题有关。拆机查原因