initialization of PhyProperties_t

josesimoes wrote on Monday, February 29, 2016:

Hi,

I’m testing the FREERTOS+TCP implementation with an STM32F407.
I’ve run into the following issue when building with GCC (5.1):

error:
NetworkInterface.cpp:289:1: sorry, unimplemented
: non-trivial designated initializers not supported
};

It turns out to be an issue with using C initializers with C++.

I’ve moved the initializers into the struct definition, remove the const PhyProperties_t xPHYProperties declaration and called the initilizer in vMACBProbePhy. All this seem to have made the compiler happy.

typedef struct _PhyProperties_t
{
	uint8_t speed;
	uint8_t mdix;
	uint8_t duplex;
	uint8_t spare;
    
    void  intialize()
    {
        #if( ipconfigETHERNET_AN_ENABLE != 0 )
            speed = PHY_SPEED_AUTO;
            duplex = PHY_DUPLEX_AUTO;
        #else
            #if( ipconfigETHERNET_USE_100MB != 0 )
                speed = PHY_SPEED_100;
            #else
                speed = PHY_SPEED_10;
            #endif

            #if( ipconfigETHERNET_USE_FULL_DUPLEX != 0 )
                duplex = PHY_DUPLEX_FULL;
            #else
                duplex = PHY_DUPLEX_HALF;
            #endif
        #endif

        #if( ipconfigETHERNET_AN_ENABLE != 0 ) && ( ipconfigETHERNET_AUTO_CROSS_ENABLE != 0 )
            mdix = PHY_MDIX_AUTO;
        #elif( ipconfigETHERNET_CROSSED_LINK != 0 )
            mdix = PHY_MDIX_CROSSED;
        #else
            mdix = PHY_MDIX_DIRECT;
        #endif
    }

} PhyProperties_t;
void vMACBProbePhy( void )
{
uint32_t ulPhyControl, ulConfig, ulAdvertise, ulLower, ulUpper, ulMACPhyID, ulValue;
TimeOut_t xPhyTime;
TickType_t xRemTime = 0;

    /* For local use only: describe the PHY's properties: */
    PhyProperties_t xPHYProperties;
    xPHYProperties.intialize();

	HAL_ETH_ReadPHYRegister(&xETH, PHY_REG_03_PHYSID2, &ulLower);
    ...

josesimoes wrote on Monday, February 29, 2016:

Forget this. I just realized that I had changed the NetworkInterface.c to NetworkInterface.cpp for some testing and, obviouslly the struct initializers wouldn’t work.

heinbali01 wrote on Monday, February 29, 2016:

No problem.

The struct initialisers, in my opinion, was something very useful that was dropped in C++.

Maybe because they were rarely used.

Here is an example of an array:

    Topology_t xTopologies[ XPAR_XEMACPS_NUM_INSTANCES ] =
{
    [0] = {
        .emac_baseaddr = XPAR_PS7_ETHERNET_0_BASEADDR,
        .emac_type = xemac_type_emacps,
    },
    [1] = {
        .emac_baseaddr = XPAR_PS7_ETHERNET_1_BASEADDR,
        .emac_type = xemac_type_emacps,
    },
};

All fields not mentioned will default to zero, great!

Within C++, this would be the unsafe surrogate:

Topology_t xTopologies[ XPAR_XEMACPS_NUM_INSTANCES ] =
{
    {
        XPAR_PS7_ETHERNET_0_BASEADDR,
        xemac_type_emacps,
    },
    {
        XPAR_PS7_ETHERNET_1_BASEADDR,
        xemac_type_emacps,
    },
};

it just assumes that emac_baseaddr and emac_type are the first two fields of the struct.

Regards, Hein