【问题标题】:Understanding data structure in usbjoy library from v-usb project从 v-usb 项目了解 usbjoy 库中的数据结构
【发布时间】:2015-12-04 05:50:18
【问题描述】:

祝大家今天好。

我正在尝试制作自己的游戏杆,所以我一直在寻找参考资料,然后我从 v-usb wiki 页面 (http://vusb.wikidot.com/project:usbjoy) 找到了 usbjoy 项目。

然后,我从网站的 zip 文件中的 common.h 中找到了按钮的数据结构。

typedef struct
{
  uchar x; //Byte-0, ユ (0...255)
  uchar y; //Byte-1, Y (0...255)
        uchar z; //Byte-2, Handle-1 (0...255)
  uchar p; //Byte-3, Handle-2 (0...255)

  union {
    uchar buttons; //Byte-4, buttons 8
    struct
    {
      uchar btn1:    1; //0, 1
      uchar btn2:    1; //0, 1
      uchar btn3:    1; //0, 1
      uchar btn4:    1; //0, 1
      uchar btn5:    1; //0, 1
      uchar btn6:    1; //0, 1
      uchar btn7:    1; //0, 1
      uchar btn8:    1; //0, 1
    } b;
  } u;
        union {
    uchar but; //Byte-5, buttons 4
    struct
    {
      uchar btn9:    1; //0, 1
      uchar btn10:   1; //0, 1
      uchar btn11:   1; //0, 1
      uchar btn12:   1; //0, 1
      uchar padding: 4; //Not use
                } b;
  } w;
} t_PsxController;

我知道 x 和 y 用于左侧模拟垫,z 和 p 用于右侧模拟垫,u 和 w 用于按钮。我的问题是:

  1. 为什么将 u 和 w 声明为联合?
  2. 是否会使用联合中的结构?
  3. t_PsxController 的大小是多少?
  4. 最后,uchar btn1: 1; 中的冒号及其下方的代码是什么意思?

【问题讨论】:

    标签: c embedded avr


    【解决方案1】:

    t_PsxController 是一个 6 字节大小的结构。每个字节都在您发布的代码的 cmets 中编号。某些行中的冒号: 指示编译器将一定数量的位(在此示例中为1 或4)分配给项目,而不是整个字节。这使得每个联合只有 1 个字节长。

    t_PsxController controller;
    

    将声明一个名为controller 的结构,供您以后使用。它有 6 个字节长。

    要访问结构的成员,请使用. 点运算符。您使用的标识符将确定您正在访问的工会的哪个成员。例如,

    controller.x = 23; // assigns a value to the byte 0
    controller.u.b.btn1 = 1; // assigns a 1 to the first bit of the byte 4
    uchar x = controller.u.buttons; // assigns 128 to x
    

    您可能希望在某些时候使用指向controller 的指针,尤其是在传递给函数时。然后您需要使用-> 运算符以及. 点。

    t_PsxController *ctlr = controller;
    
    ctlr->u.b.btn2 = 1; // Now ctlr->u.buttons is 192
    

    【讨论】:

    • 你确定 btn1 从 MSB 开始吗?不是从LSB开始的吗?我刚找到这篇文章,它另有说明。 keil.com/forum/11158/the-bit-struct-in-union
    • @swdmnd 不,我不确定它的走向。方向取决于编译器,但您提供的链接是针对 ARM,而不是 AVR。我只是想告诉你如何以不同的方式引用同一个字节。
    【解决方案2】:

    为什么将 u 和 w 声明为联合?

    您将一次使用八个按钮中的一个按钮,对吗?只需访问数据结构的一个成员,因此使用联合。了解结构和联合之间的difference。操纵杆可用于左垫、右垫和

    联合体内的结构会被使用吗?

    是的,它代表不同的按钮,因此将被使用。

    t_PsxController 的大小是多少?

    t_PsxController 是结构体,结构体的最大大小是结构体所有成员的总和。

    最后,uchar btn1: 1; 中的冒号是什么?和下面的代码是什么意思?

    union内部结构uchar btn1: 1代表unsigned char位域,占1位

    union内部结构uchar padding: 4代表unsigned char位域,占4位

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多