This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:具有多个驱动程序文件、需要使用 extern???访问另一个文件中的函数

Guru**** 2538955 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1014072/msp430fr2355-have-multiple-driver-files-and-need-to-access-a-function-in-one-file-in-another-using-extern

器件型号:MSP430FR2355

我有一个 SPI 驱动程序文件,我想在其中将 GPIO 配置为交替模式..... 要执行此操作的函数在 gpio.h 中声明并在 GPIO.c 文件中定义。  此函数获取可传递给它的参数、这些参数在 gpio.h 内#defined  我不想在 spi.c 文件中包含 gpio.h、而是希望使用顶级 main.h、它将#include 所有.h 文件。  是否有人可以告诉我如何执行此操作?  我想单独构建 SPI.c、而不会出现错误。  请参阅下面的代码...

spi.c --在我尝试执行 GPIO_...之前,spi.c 工作正常 东西

extern void GPIO_AlternateMode(extern GPIO_RegDef_t *pGPIOx, extern uint8_t PinNumber, extern uint8_t Function);

void SPI_Init(SPI_Handle_t *pSPIHandle)
{
    if ((pSPIHandle->pSPIx) == SPI_A0)
    {
        GPIO_AlternateMode(PORT1, GPIO_PIN_NO_1, ALT_FUNC_PRIMARY);
        GPIO_AlternateMode(PORT1, GPIO_PIN_NO_2, ALT_FUNC_PRIMARY);
        GPIO_AlternateMode(PORT1, GPIO_PIN_NO_3, ALT_FUNC_PRIMARY);
        if (pSPIHandle->SPI_Config.Mode != THREEWIRE)
            GPIO_AlternateMode(PORT1, GPIO_PIN_NO_0, ALT_FUNC_PRIMARY);
    }
}

编译器错误:

说明资源路径位置类型
#20标识符"ALT_FUNC_PRIMARE"未定义 SPI.c /SS-ABC/Drivers/Src 第66行 C/C++问题
#20标识符"GPIO_PIN_NO_0"未定义 SPI.c /SS-ABC/Drivers/Src 第70行 C/C++问题
#20标识符"GPIO_PIN_NO_1 "未定义 SPI.c /SS-ABC/Drivers/Src 第66行 C/C++问题
#20标识符"GPIO_PIN_NO_2"未定义 SPI.c /SS-ABC/Drivers/Src 第67行 C/C++问题
#20标识符"GPIO_PIN_NO_3"未定义 SPI.c /SS-ABC/Drivers/Src 第68行 C/C++问题
#20标识符"GPIO_RegDef_t"未定义 SPI.c /SS-ABC/Drivers/Src 第9行 C/C++问题
#20标识符"Port1"未定义 SPI.c /SS-ABC/Drivers/Src 第66行 C/C++问题
86参数 spi.c /SS-ABC/Drivers/Src 第9行 C/C++问题的无效存储类

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您的 SPI 驱动程序正在使用 GPIO API、它肯定应该包含 GPIO.h、因为它定义了 API。 ("extern……GPIO_AlternateMode()"语句也应位于 GPIO_h 中、因为这是 API 的一部分。)

    在任何情况下、如果您的伞式 main.h 包含 GPIO.h、这将实现同样的功能。 (但显然不是这样?)  

    个人而言、我更喜欢较小粒度的头文件、而不是单个 include-malls 结构;我想它是从完全构建需要一个小时的时间开始就已经完全结束了、因此依赖关系非常重要。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    gpio.h (顺便说一下、这些是我编写....no的驱动程序、使用 TI provides...call 上的 API、它是一个学习练习)包含:

    void GPIO_AlternateMode(GPIO_RegDef_t *pGPIOx, uint8_t PinNumber, uint8_t Function);

    当然、GPIO.c 包含定义... GPIO.c 构建、所以一切都很好...

    我在其他地方看到了 main.h 技巧...我想在这里理解的真正内容是如何将 extern 成功地放置在 SPI.c 中的这个函数上,以便在没有任何依赖关系的情况下生成 SPI.c。  我知道您可以对函数执行该操作、但我不确定如何针对参数执行该操作???

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    但是你已经对 GPIO.c 有依赖性--你正在调用其中一个函数。 为此、SPI.c 中的调用方需要知道用于调用它的应用程序接口、如 gpio.h 中所述- typedef、常量和函数原型。

    extern 行不应出现在 spi.c 中、而应出现在 gpio.h 中 这里的一个重要危险(我已经看到发生了)是、如果您在 GPIO_c 中更改 GPIO_AlternateMode 的调用序列、但在 SPI.c 中更改不会、编译器和链接器都不会检测到它、则调用将会是错误的。 在 gpio.h 中放置一个(extern)原型会迫使包括 gpio.c 在内的所有人都同意该原型。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果我这样做、不确定我是否完全理解将 extern 放在 gpio.h 中的声明前面  

    #include gpio.h 在 spi.c 中一切正常。  我想我将介绍这一点。

    我想了解两个 PPL 如何独立创建不同的 API、但一个 API 依赖于另一个 API。

    谢谢

    Steve