Как сделать одну функцию из повторяющегося кода? - PullRequest
2 голосов
/ 20 марта 2020

Я пишу код для моей встроенной системы. Поскольку я добавляю больше разных каналов на одной периферии, я получаю действительно повторяющийся код. Например:

void pos1_write_read(int *pwriteData)
{
    // Reset rx buffer and transfer done flag
    memset(m_rx_buf0, 0, m_length0);
    spi0_xfer_done = false;

    nrfx_spi_xfer_desc_t m_pos1_write;
    m_pos1_write.p_tx_buffer = pwriteData;
    m_pos1_write.tx_length = m_length0;
    m_pos1_write.p_rx_buffer = m_rx_buf0;
    m_pos1_write.rx_length = m_length0;

    nrf_gpio_pin_clear(SPI0_CS0_PIN);   //Set CS0 to 0 (on)
    APP_ERROR_CHECK(nrfx_spi_xfer(&spi0, &spi0_transfer, NULL));

    while (!spi0_xfer_done){}           //Wait until the tranfser is done

    nrf_gpio_pin_set(SPI0_CS0_PIN);     //Set CS0 to 1 (off)

}

void pos2_write_read(int *pwriteData)
{
    // Reset rx buffer and transfer done flag
    memset(m_rx_buf0, 0, m_length0);
    spi0_xfer_done = false;

    nrfx_spi_xfer_desc_t m_pos2_write;
    m_pos2_write.p_tx_buffer = pwriteData;
    m_pos2_write.tx_length = m_length0;
    m_pos2_write.p_rx_buffer = m_rx_buf0;
    m_pos2_write.rx_length = m_length0;

    nrf_gpio_pin_clear(SPI0_CS1_PIN);   //Set CS1 to 0 (on)
    APP_ERROR_CHECK(nrfx_spi_xfer(&spi0, &spi0_transfer, NULL));

    while (!spi0_xfer_done){}           //Wait until the tranfser is done

    nrf_gpio_pin_set(SPI0_CS1_PIN);     //Set CS1 to 1 (off)

}

Как написать одну функцию, которую можно использовать в обоих примерах? Есть ли вообще хорошая практика, чтобы не повторять один и тот же код?

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Единственная реальная разница - это пин S C, который можно передать в качестве аргумента:

void pos_write_read(int *pwriteData, uint32_t pin)
{
    // Reset rx buffer and transfer done flag
    memset(m_rx_buf0, 0, m_length0);
    spi0_xfer_done = false;

    nrfx_spi_xfer_desc_t m_pos_write;
    m_pos_write.p_tx_buffer = pwriteData;
    m_pos_write.tx_length = m_length0;
    m_pos_write.p_rx_buffer = m_rx_buf0;
    m_pos_write.rx_length = m_length0;

    nrf_gpio_pin_clear(pin);   //Set CS to 0 (on)
    APP_ERROR_CHECK(nrfx_spi_xfer(&spi0, &spi0_transfer, NULL));

    while (!spi0_xfer_done){}           //Wait until the tranfser is done

    nrf_gpio_pin_set(pin);     //Set CS to 1 (off)
}

/* This allows you to do the following: */

void pos1_write_read(int *pwriteData)
{
    pos_write_read(pwriteData, SPI0_CS0_PIN);
}


void pos2_write_read(int *pwriteData)
{
    pos_write_read(pwriteData, SPI0_CS1_PIN);
}
0 голосов
/ 20 марта 2020

Выбор правильного дизайна зависит от того, как он предназначен для использования, насколько обобщенно c вы считаете уместным и т. Д. c. Нет единственно правильного способа сделать это. Но наивное решение, основанное только на вашем фрагменте кода, выглядит примерно так:

void write_read(int *pwriteData, int pin)
{
    // Reset rx buffer and transfer done flag
    memset(m_rx_buf0, 0, m_length0);
    spi0_xfer_done = false;

    nrfx_spi_xfer_desc_t m_pos1_write;
    m_pos1_write.p_tx_buffer = pwriteData;
    m_pos1_write.tx_length = m_length0;
    m_pos1_write.p_rx_buffer = m_rx_buf0;
    m_pos1_write.rx_length = m_length0;

    nrf_gpio_pin_clear(pin);   //Set CS0 to 0 (on)
    APP_ERROR_CHECK(nrfx_spi_xfer(&spi0, &spi0_transfer, NULL));

    while (!spi0_xfer_done){}           //Wait until the tranfser is done

    nrf_gpio_pin_set(pin);     //Set CS0 to 1 (off)

}
void pos1_write_read(int *pwriteData)
{
    write_read(pwriteData, SPI0_CS0_PIN);
}

void pos2_write_read(int *pwriteData)
{
    write_read(pwriteData, SPI0_CS1_PIN);
}

Идея состоит в том, чтобы просто взять общий код и параметризовать все, что между ними отличается.

...