首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在嵌入式系统固件中使用位字段可以吗?

在嵌入式系统固件中使用位字段可以吗?
EN

Stack Overflow用户
提问于 2020-08-10 04:26:32
回答 2查看 267关注 1票数 1

我看到一些嵌入式系统固件书籍/文章建议不要使用C的结构位字段,因为它不能移植。我知道顺序和填充是由实现定义的,但是使用位字段总是不可移植的吗?

我的意思是,如果我定义了一个8位微控制器驱动程序的配置结构,如下所示:

代码语言:javascript
运行
复制
typedef struct
{
  int channel_name :3 ; /*7 possible channels*/
  int Enable :1 ;  /*if 1 enable,otherwise disable*/
  int Mode;
} conf_t 

我不明白在这种情况下,实现定义的行为怎么会引发可移植性问题,有人能解释一下吗?

EN

回答 2

Stack Overflow用户

发布于 2020-08-10 14:54:41

以下是可能出现的一些可移植性问题:

  • 字节填充问题。这个struct?
  • Endianess的大小是多少,以及由此引起的位顺序问题。
  • 当你声明一个大小为1的int位字段时,不同的编译器会有不同的行为。该位是符号位还是数据?在位字段中(并且仅在那里),编译器可以将int视为有符号或无符号,并且在有符号的情况下,编译器在符号位方面的行为可能不同。在同一位字段中混合不同类型时,
  • 在位/字节填充方面的行为。

然后还有一堆其他的东西也定义得不好,但在现实中不太可能造成实际问题。

票数 5
EN

Stack Overflow用户

发布于 2020-08-10 04:46:22

  1. 设备寄存器通常有副作用,例如,读取状态寄存器可能会清除检测到的条件。您无法控制编译器在给定表达式中可能进行的访问次数。反身性地,当你使用位域更新一个结构时,编译器可以自由地对存储位置进行多次写入,这可能会有一个戏剧性的效果。
  2. 即使你已经整理好了你的编译器,你从中获得了什么好处?它是否真的使代码更具可读性,或者只是更短?{

x:1;}在英特尔机器上是最低有效位,但在摩托罗拉机器上是最高有效位。相比之下,(1 << 0)是所有机器上的最低有效位。我曾经不得不通过一个充满位场的8kloc视频捕获驱动程序来将它转移到另一个架构。

  1. 随意地认为*p足以用适当的总线协议读取一个寄存器,这是一个很久以前就过时的想法,应该留在那里。X=io_readb(设备)本质上是自记录的;甚至更好: if (io_readb(device,&x) != 0) {panic(“设备失败”);}.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63330997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档