c - 类型转换为非类型定义的结构

标签 c struct io rtos micrium

基本上我是从 RTOS 中的另一个线程获取数据。该数据是板上的引脚。所有 IO 端口都位于 iodefine.h 文件的结构/union 中。请参阅以下示例,了解 Micrium 的制作方法:

struct st_portd {
union {
    unsigned char BYTE;
    struct {
        unsigned char B0:1;
        unsigned char B1:1;
        unsigned char B2:1;
        unsigned char B3:1;
        unsigned char B4:1;
        unsigned char B5:1;
        unsigned char B6:1;
        unsigned char B7:1;
    } BIT;
} DDR;
unsigned char wk0[31];
union {
    unsigned char BYTE;
    struct {
        unsigned char B0:1;
        unsigned char B1:1;
        unsigned char B2:1;
        unsigned char B3:1;
        unsigned char B4:1;
        unsigned char B5:1;
        unsigned char B6:1;
        unsigned char B7:1;
    } BIT;
} DR;
unsigned char wk1[31];
union {
    unsigned char BYTE;
    struct {
        unsigned char B0:1;
        unsigned char B1:1;
        unsigned char B2:1;
        unsigned char B3:1;
        unsigned char B4:1;
        unsigned char B5:1;
        unsigned char B6:1;
        unsigned char B7:1;
    } BIT;
} PORT;
unsigned char wk2[31];
union {
    unsigned char BYTE;
    struct {
        unsigned char B0:1;
        unsigned char B1:1;
        unsigned char B2:1;
        unsigned char B3:1;
        unsigned char B4:1;
        unsigned char B5:1;
        unsigned char B6:1;
        unsigned char B7:1;
    } BIT;
} ICR;
unsigned char wk3[95];
union {
    unsigned char BYTE;
    struct {
        unsigned char B0:1;
        unsigned char B1:1;
        unsigned char B2:1;
        unsigned char B3:1;
        unsigned char B4:1;
        unsigned char B5:1;
        unsigned char B6:1;
        unsigned char B7:1;
    } BIT;
} PCR;
};

如果你问我的话,这是非常聪明的方法。 因此,我将此引脚保存为结构中的 2 个字符,称为“端口”和“引脚”。

struct StepperMotor {
  CPU_INT32U ID;
  CPU_CHAR *EnablePort;
  CPU_CHAR EnablePin;
  CPU_CHAR *DirectionPort;
  CPU_CHAR DirectionPin;
  CPU_CHAR *PulsePort;
  CPU_CHAR PulsePin;
};

我想以这种方式使用该引脚:

(struct st_portd)(steppermotor->PulsePort)->DR.BYTE ^= (1 << steppermotor->PulsePin);

步进电机是结构。 只有这样我才会收到错误消息

request for member 'DR' in something not a structure or union

如何在不为其创建新变量的情况下使用步进电机->PulsePort->DR.BYTE? 我希望任何人都可以帮助我!

最佳答案

由于您正在转换指针,因此应该将其转换为指向结构的指针,而不是结构本身,如下所示:

((struct st_portd*)steppermotor->PulsePort)->DR.BYTE ^= (1 << steppermotor->PulsePin);

另请注意,括号位置错误。

关于c - 类型转换为非类型定义的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738725/

相关文章:

c - 了解 K&R 的 getint()(第 5 章 : Pointers & Arrays, 练习 1)?

将结构的内容复制到另一个

java - 从标准输入获取输入

scala - 如何在 Scala 中将阻塞 IO 包装为非阻塞

windows - 具有 NoBuffering 的 Haskell 跨平台 getChar

c++ - 函数内的函数不带括号?

c - 数字时钟上午/下午显示问题/编辑:这就是全部

c - 将原始结构内容(字节)写入 C 中的文件。对写入的实际大小感到困惑

谁能解释一下下面的c代码吗?

golang比较两个实现不同的结构