gpt4 book ai didi

c - 如何在不使其成为全局的情况下共享硬件抽象结构

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:52 26 4
gpt4 key购买 nike

这是一个关于共享“全局”数据的问题,模拟了一 block 任何函数都可以访问的可寻址内存。

我正在为一个嵌入式项目编写代码,在该项目中我已将我的物理 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 和互联网上搜索了关于共享变量的最佳实践,我觉得我明白为什么我应该避免使用全局变量(无法查明代码中数据发生的位置)并且最好将局部变量与指针和接口(interface)函数一起使用(例如“获取当前报价”函数而不是读取全局报价变量)。

我的问题是,鉴于我希望保持语法尽可能简单,定义这些结构变量然后使它们可供其他模块中的函数使用的最佳方法是什么?可以将这些结构变量用作全局变量吗?我应该使用某种指向我拥有的每个虚拟端口的指针的主数组,并使用 getter 函数来避免使用外部变量吗?

最佳答案

我喜欢这样做:

文件1.h

typedef enum
{
VirtualPortTypeLED
} VirtualPortType;

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;

文件1.c

GPIO_VirtualPort LEDPort;

void VirtualPortInit()
{
/* fill in all structures and members here */
LEDPort.reg = 0x1234;
...
}

GPIO_VirtualPort *VirtualPortGet(VirtualPortType vpt)
{
switch(vpt) {
case VirtualPortTypeLED:
return &LEDPort;
}

return NULL;
}

文件2.c

#include file1.h

GPIO_VirtualPort *myLed;

VirtualPortInit();
myLed = VirtualPortGet(VirtualPortTypeLED);

顺便说一句,我没有编译这个……:)

关于c - 如何在不使其成为全局的情况下共享硬件抽象结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com