【发布时间】:2021-01-27 19:39:25
【问题描述】:
我正在研究硬件抽象层。此 HAL 的目的是在 linux 驱动程序和 MCU 驱动程序之间轻松切换。
我正在研究 SPI 接口。下面是“打开”SPI接口的HAL函数的签名。
hal/spi.h
spi_handle_t spi_open(spi_port_t channel, spi_config_t config);
spi_port_t:
- 在 Linux 上,它是一个基本类型:uint32_t
- 在 MCU 上,它是一个结构体。
spi_config_t:
- 在 Linux 和 MCU 上,它都是一个结构,但具有不同的字段。
所以在 mcu/spi.c 中,我有时会这样:
typedef spiBASE_t spi_channel_t;
typedef spiDAT1_t spi_config_t;
spi_handle_t spi_open(spi_channel_t channel, spi_config_t config) {
.
.
.
}
对于 linux/spi.c :
typedef uint32_t spi_channel_t;
typedef ChannelConfig_t spi_config_t;
spi_handle_t spi_open(spi_channel_t channel, spi_config_t config) {
.
.
.
}
现在问题出在hal/spi.h,我需要定义什么是spi_channel_t和spi_config_t。
有没有办法制作类似的东西(我知道用 extern 是不可能的,但是为了解释很重要......):
extern spi_channel_t;
extern spi_config_t;
这会对编译器说:“好吧,这两种类型没有在头文件中定义,你仍然可以在我传递给工具链的文件之一上找到它们的存储大小”。
【问题讨论】:
-
您可以将 Linux 'native' 类型定义为具有单个成员的结构。这对你有用吗?然后,您的标头只需将这些类型声明为
struct...所谓的不透明结构。如果这听起来不错,也许我可以添加更多(甚至作为答案)。
标签: c types embedded extern hal