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.

[参考译文] TM4C123GE6PZ:在函数中使用结构而不对其进行初始化

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/734626/tm4c123ge6pz-using-a-structure-in-a-function-without-ever-initializing-it

您好!

以下代码片段来自 Launchpad 的 lab14:
"G_sISL29023Inst"是一个指向结构体的指针、传递给"ISL29023Init"函数。
但在 ISL29023Init 函数调用之前、我没有看到该结构已使用任何数据进行初始化-您能解释一下吗  

int
main (void)
{
float fAmbient;
uint8_t ui8Mask;
ROM_SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
ROM_SysCtlPeripheralEnable
(SYSCTL_Periph_ROM);SYSCBLE_SYIPHET_SYIOD (SYSCBLE_SYSCGC3)
ROM_GPIOPinConfigure (GPIO_PD0_I2C3SCL);
ROM_GPIOPinConfigure (GPIO_PD1_I2C3SDA);
GPIOPinTypeI2CSCL (GPIO_PORTD_base、GPIO_PIN_0);
ROM_GPIOPinTypeI2C (GPIO_PORTD_base、 GPIO_PIN_1);
ROM_IntMasterEnable ();
I2CMInit (&g_sI2CInst、I2C3_base、INT_I2C3、 0xFF、0xFF、ROM_SysCtlClockGet ());
SysCtlDelay (SysCtlClockGet ()/ 3);
ISL29023Init (&g_sISL29023Inst、 &g_sI2CInst、
ISL29023_I2C_address、ISL29023AppCallback、&g_sISL29023Inst);
ISL29023AppI2CWait (__file__、__line__);
ui8Mask =(ISL29023_CMD_I_OP_MODE_M);
ISL29023ReadModifyWrite (&G) sISL29023Inst、ISL29023_O_CMD_I、~ui8Mask、
(ISL29023_CMD_I_OP_MODE_ALS_CONT_CONT)
ISL29023AppCallback、&g_sISL29023Inst);
ISL29023AppI2CWait (__file__、__line__);
while (1)
{
ISL29023DataRead (&g_sISL29023Inst、 ISL29023AppCallback、&g_sISL29023Inst);
ISL29023AppI2CWait (__file__、__line__);
ISL29023DataLightVisibleGetFloat (&g_sISL29023Inst、 环境下);
}
}


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

    它位于文件的开头。 请参阅下面的内容。 tISL29023  类型在 sensorlib/isl29023.h 中定义

    #include "stdint.h"
    #include "stdbool.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_ints.h"
    #include "driverlib/debug.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/sysctl.h"
    #include "sensorlib/hw_isl29023.h"
    #include "sensorlib/i2cm_drv.h"
    #include "sensorlib/isl29023.h"
    #define debug

    #define ISL29023_I2C_ADDRESS 0x44 // ISL29023 I2C 地址
    tI2CMInstance g_sI2CInst;// I2C 主驱动器结构
    tISL29023 g_sISL29023Inst;// ISL29023传感器驱动程序结构
    volatile unsigned long g_vui8DataFlag;//数据就绪标志
    volatile unsigned long g_vui8ErrorFlag;//错误标志

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

    我可以看到类型是在 isl29023.h 中定义的、我还可以看到它在您突出显示的行中被实例化...
    但是"g_sISL29023Inst"是一个包含许多元素的结构。
    我无法看到这些元素在何处被赋予初始值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     当调用 ISL29023Init 时、该结构被初始化。  

    //
    //
    //! 初始化 ISL29023驱动程序。
    //!
    //! \param psInst 是 ISL29023实例数据的指针。
    //! param psI2CInst 是指向 I2C 驱动程序实例数据的指针。
    //! \param ui8I2CAddr 是 ISL29023器件的 I2C 地址。
    //! param pfnCallback 是初始化具有
    //时要调用的函数! 已完成(如果不需要回调、可以为\b NULL)。
    //! \param pvCallbackData 是传递给回调函数的指针。
    //!
    //! 此函数初始化 ISL29023驱动程序、为其运行做好准备。
    //! 此函数还将一个复位信号置为 ISL29023、以清除任何
    //! 先前的配置数据。
    //!
    //! 如果 ISL29023驱动程序已成功初始化,\return 返回1,并且0
    //! 如果不是这样。
    ////
    *****************
    uint_fast8_t
    ISL29023Init (tISL29023 * psInst、tI2CMInstance * psI2CInst、
    uint_fast8_t ui8I2CAddr、tSensorCallback * pfnCallback、
    void *pvCallbackData)
    {
    //
    //初始化 ISL29023实例结构
    //
    psInst->psI2CInst = psI2CInst;
    psInst->ui8Addr = ui8I2CAddr;
    psInst->ui8State = ISL29023_State_init;
    psInst->ui8Range = ISL29023_CMD_II_RANGE_1K >> ISL29023_CMD_II_RANGE_S;
    psInst->ui8NewRange = ISL29023_CMD_II_RANGE_1K >> ISL29023_CMD_II_RANGE_S;
    psInst->ui8分辨率=(ISL29023_CMD_II_ADC_RES_16 >>
    ISL29023_CMD_II_ADC_RES_S);
    psInst->ui8NewResolution =(ISL29023_CMD_II_ADC_RES_16 >>
    ISL29023_CMD_II_ADC_RES_S);
    
    //
    //保存回调信息。
    //
    psInst->pfnCallback = pfnCallback;
    psInst->pvCallbackData = pvCallbackData;
    
    //
    //将器件置于断电模式。
    //
    psInst->pui8Data[0]= ISL29023_O_CMD_I;
    psInst->pui8Data[1]= ISL29023_CMD_I_OP_MODE_POWER_DOWN;
    if (I2CMWrite (psInst->psI2CInst、psInst->ui8Addr、psInst->pui8Data、2、
    ISL29023回调、psInst)==0)
    {
    //
    // I2C 写入失败,因此进入空闲状态并返回 A
    //失败。
    //
    psInst->ui8State = ISL29023_State_Idle;
    返回(0);
    }
    
    //
    //成功
    //
    退货(1); 

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

    另一个问题是我觉得奇怪的东西。
    我看到"ISL29023Init"的输入参数之一是"ISL29023AppCallback"。
    但 ISL29023AppCallback 本身就是一个返回 void 的函数。

    为什么内部有一个函数调用作为另一个函数调用的输入参数??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是一种异步回调形式。 在 C 语言中、您可以将回调函数指针作为参数传递给调用函数。 您首先在调用函数中注册回调。 这是一个非阻塞操作。 当事件发生时、将调用回调函数。 下面是一篇讨论回调工作原理的好文章。

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

    谢谢!

    如果有任何问题、我将阅读并开始另一个主题。

    在查找 "ISL29023Init" init 函数的 tSensorCallback 的 typedef 时遇到问题。

    是否可以将我指向包含它的头文件?

    ISL29023Init (tISL29023 *psInst、tI2CMInstance *psI2CInst、

          uint_fast8_t ui8I2CAddr、tSensorCallback * pfnCallback、

          void *pvCallbackData)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我刚才在另一个主题中回答了相同的问题。 e2e.ti.com/.../734757