这是一个关于共享“全局”数据的问题,它模仿任何函数都可以访问的可寻址内存。如何共享硬件抽象结构而不使它成为全局的
我正在为一个嵌入式项目编写代码,我已经从应用程序中分离出物理gpio引脚。应用程序与“虚拟”gpio端口进行通信,然后设备驱动程序与实际硬件进行通信。这样做的主要动机是让我可以轻松地在开发时将哪些引脚连接到外设,以及包括使用较少物理引脚的按钮矩阵等东西,同时仍将它们作为常规gpio设备寄存器进行处理。
typedef struct GPIO_PinPortPair
{
GPIO_TypeDef *port; /* STM32 GPIO Port */
uint16_t pin; /* Pin number */
} GPIO_PinPortPair;
typedef struct GPIO_VirtualPort
{
uint16_t reg; /* Virtual device register */
uint16_t edg; /* Flags to signal edge detection */
GPIO_PinPortPair *grp; /* List of physical pins associated with vport */
int num_pins; /* Number of pins in vport */
} GPIO_VirtualPort;
这在我到目前为止已经编写的代码一直运作良好,但问题是,我觉得我必须分享地址到每个定义的虚拟端口作为一个全球性的。函数调用看起来像这样,模仿如果我使用常规内存映射io的样子。
file1.c中
GPIO_VirtualPort LEDPort;
/* LEDPort init code that associates it with a list of physical pins */
file2.c中
extern GPIO_VirtualPort LEDPort;
vgpio_write_pin(&LEDPort, PIN_1, SET_PIN);
我已经搜查两个SO和最佳做法的互联网,当涉及到共享变量,我觉得就像我明白为什么我应该避免使用全局变量(无法确定代码在数据中发生什么),并且最好使用带指针和接口函数的局部变量(比如“get当前滴答“功能而不是读取全局滴答变量)。
我的问题是,鉴于我希望保持语法尽可能简单,定义这些结构变量然后使其可用于其他模块中的函数的最佳方法是什么?可以将这些结构变量用作全局变量吗?我应该使用某种指向每个虚拟端口的指针的主数组,并使用getter函数来避免使用extern变量?
我明白,如果文本不清楚。 LEDPort应该被暗示为在另一个源文件中定义。这不是任何实际的生产代码,我想保持较短的篇幅,因为它主要是一个概念性的问题。 –
如果你想定义一个'struct'在多个C源代码中可用,只需将它放入一个头文件中,并将头文件包含在每个C源文件或其他所需的头文件中。由于标题可能被多次包含(间接),因此您应该使用[包括卫兵](https://en.wikipedia.org/wiki/Include_guard)。 (有些人更喜欢'#pragma once',但我一般不会喜欢'#pragma'的粉丝。) – Scheff
这是不是使它成为全局变量呢?如果是这种情况,我想知道这是否是一种很好的做法,或者如果我由于初学者的错误而冒着代码味道。 –