【问题标题】:Embedded c programming嵌入式 c 编程
【发布时间】:2013-12-19 10:24:03
【问题描述】:

从我的 zigbee wsndemo 代码中遵循 sn-p 让我很难理解其结构。我在网上浏览了许多与结构相关的文章,但无法理解这些结构变量是如何定义和使用的。请帮忙。

     static struct
     {
       uint8_t appSubTaskPosted  : 1;
       uint8_t appCmdHandlerTaskPosted  : 1;
       uint8_t appMsgSenderTaskPosted  : 1;
     } appTaskFlags =
       {
         .appSubTaskPosted = false,
         .appCmdHandlerTaskPosted = false,
         .appMsgSenderTaskPosted = false
        };

【问题讨论】:

  • false 必须是宏扩展,因为C 没有bool 类型。 :1 表示在 uint8_t 内部仅使用 1 位(在这种情况下,真或假类似于 0 或 1)。剩下的只是结构体的初始化。
  • @hhachem C 确实有 bool 类型。它是 14 年前以该语言引入的。
  • @Lundin 很高兴知道。在 C 中使用布尔值时,我一直使用宏

标签: c embedded


【解决方案1】:

它们是位域,在本例中为 1 位。它们的值只能是 0 或 1,true 或 false。它们占用的内存少于单独的bool

您还可以定义大于 1 的位域。例如,位域 2 可以具有值 0、1、2 和 3。位域的美妙之处在于您不需要偏移量来访问它们如果您使用的是较大数据类型的各个位,则必须这样做。

如果您要定义具有位域的结构,请将它们彼此相邻定义,因为这样的位域实际上共享更大的数据类型,例如 int 32。

【讨论】:

  • 位域共享的数据类型是用来声明它们的。我不记得这是由标准指定还是只是常见的实施实践。
【解决方案2】:

您没有在您的问题中确切说明您不理解的内容,但您的示例中至少有四件事发生在“经典”C 文献或结构的一般搜索中可能找不到.它们是:

  • 位域成员
  • 指定的初始化器
  • 显式宽度数据类型
  • 布尔文字常量

位域一直在 ISO/ANSI C 中,但不常用。尽管它们可以产生内存高效的数据结构,但在大多数架构上,它们会生成大量代码来访问,并且访问可能不是原子的,当数据在中断或线程上下文之间共享时,这是一个问题。此外,位域的打包是实现定义的,因此可能会导致在精确位位置至关重要的应用程序中(例如覆盖硬件寄存器时)产生不可移植的代码。

Designated initializers 是在 ISO C99 中引入的。没有多少 C99 特定的文献,大多数 C 文献早于它或坚持 C90 子集以实现兼容性。如果要查找信息,则应专门搜索C99。

显式宽度数据类型(在这种情况下为uint8_t),也由C99引入,但在标准头文件stdint.h中被简单地实现为内置类型的typedef别名,因此可以在C90编译器中实现也是。

在 C99 中引入了类似的布尔文字 truefalse 以及 bool 数据类型。在 C99 中,bool 是在 stdbool.h 中定义的 _Bool 的别名 typedef,以及 truefalse 的定义。如果您愿意,您可以在 C90 中定义 booltruefalse,但它缺少内置的 _Bool 数据类型,因此您将使用其他一些整数类型的别名。

【讨论】:

  • 我想我应该提到您指出的条款就是我正在寻找的。我很平静。谢谢兄弟。
猜你喜欢
  • 2017-11-15
  • 2019-02-12
  • 1970-01-01
  • 2016-12-15
  • 2011-05-30
  • 1970-01-01
  • 2019-08-24
  • 2015-11-16
  • 1970-01-01
相关资源
最近更新 更多