小编Zen*_*enJ的帖子

如果全局变量被中断修改,真的需要volatile修饰符吗?

有很多关于易变量及其用途的说和写.在这些文章中,可以找到两个略有不同的想法:

1 - 当变量在编译程序之外被更改时,应该使用Volatile.
2 - 当变量在函数的正常流量之外变化时,应使用Volatile.

第一个语句限制了对内存映射寄存器等的易失性使用和多线程的东西,但第二个实际上将中断添加到范围中.

例如,本文(http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword)明确指出volatile修饰符应该用于中断期间更改的全局变量,并提供此示例:

int etx_rcvd = FALSE;

void main() 
{
    ... 
    while (!ext_rcvd) 
    {
        // Wait
    } 
    ...
}

interrupt void rx_isr(void) 
{
    ... 
    if (ETX == rx_char) 
    {
    etx_rcvd = TRUE;
    } 
    ...
}
Run Code Online (Sandbox Code Playgroud)

注意如何在这里方便地省略设置rx_isr()作为回调.因此我写了自己的例子:

#include <stdio.h>
#include <time.h>
#include <signal.h>

void f();

int n = 0;

void main() 
{
    signal(2,f);
    time_t tLastCalled = 0;
    printf("Entering the loop\n");
    while (n == 0) 
    {
        if (time(NULL) - tLastCalled > 1)
        {
            printf("Still …
Run Code Online (Sandbox Code Playgroud)

c optimization gcc

2
推荐指数
2
解决办法
671
查看次数

为什么#pragma pack 也会影响结构体自身的对齐方式?

我注意到,当在结构体周围使用 #pragma pack 时,它内部的对齐方式并不是唯一受到影响的对齐方式,而且结构体本身的对齐方式也会发生变化。考虑以下:

#include <stdio.h>
#include <stdint.h>

#pragma pack(1)
typedef struct _TEST
{
    uint32_t a;
} TEST;
#pragma pack()

volatile uint8_t n;
TEST b;

int main()
{

    printf("Address %lX rem %lu\n", (long unsigned int)&b, (long unsigned int)(&b)%(sizeof(int)));  
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

您可以在这里尝试此代码: https: //onlinegdb.com/BkebdxZEU

程序返回Address 601041 rem 1,这意味着该编译指示也对结构体产生了aligned(1) 的效果。

这是为什么?这是一个定义的行为吗?

c memory-alignment pragma-pack

2
推荐指数
1
解决办法
637
查看次数

C:从函数返回的值是否比void更多CPU周期?

如果在C中使用void函数与返回任意类型的函数(比如int),int函数会占用比void函数更多的CPU周期吗?

例:

int a, b = 1, c = 2;

void f()
{
     a = b + c;
}

int g()
{
     a = b + c;
     return a;
}
Run Code Online (Sandbox Code Playgroud)

我的常识告诉我,返回是一个动作,所以它应该花费一些CPU时间,但我没有适当的深层基础知识,我也不知道汇编程序是否能够自信地回答这个问题.谷歌搜索也没有成功.

编辑:我的兴趣纯粹是学术性的,我不希望通过使用void与int函数获得任何明显(或甚至接近)的性能.

c function return-value cpu-usage

1
推荐指数
1
解决办法
79
查看次数