gpt4 book ai didi

c - 为 AVR 端口使用位字段

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:17 25 4
gpt4 key购买 nike

我希望能够使用类似这样的东西来更清晰地访问我的端口:

typedef struct {
unsigned rfid_en: 1;
unsigned lcd_en: 1;
unsigned lcd_rs: 1;
unsigned lcd_color: 3;
unsigned unused: 2;
} portc_t;

extern volatile portc_t *portc;

但是它安全吗?它对我有用,但是......

1) 是否有可能出现竞争条件?

2) gcc 是否为修改单个字段的代码生成读-修改-写循环?

3) 是否有一种安全的方法来更新多个字段?

4)比特打包和顺序有保证吗? (在这种情况下,我不关心可移植性,因此 gcc 特定的选项可以让它按照我的意思去做。)

最佳答案

  1. 必须通过操作系统级调用(确实会使用读取-修改-写入)来处理竞争条件,GCC 不会那样做。

  2. 同上,并且没有 GCC 不会为 volatile 生成读-修改-写指令。但是,CPU 通常会以原子方式进行写入(仅仅因为它是一条指令)。例如,如果位字段保持在 int 中,这就成立,但这取决于 CPU/实现;我的意思是有些人可能保证最多 8 字节的值,而其他人最多只能保证 4 字节的值。所以在这种情况下,位不能混淆(即不会出现一些从一个线程写入,而其他从另一个线程写入的情况)。

  3. 同时设置多个字段的唯一方法是将这些值设置在一个中间变量中,然后将此变量赋给volatile

    <
  4. C 标准指定位被打包在一起(似乎开始混合类型时可能会有异常(exception),但我从未见过;每个人总是使用 unsigned ...).

注意:定义volatile 不会导致编译器生成读-修改-写。 volatile 所做的是告诉编译器必须始终对那个指针/地址进行赋值,并且可能不会被优化掉。

Here's another post关于同一个主题。我发现还有很多其他地方可以找到更多详细信息。

关于c - 为 AVR 端口使用位字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17494853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com