Застрял в функции в исходном файле из примера кода - PullRequest
0 голосов
/ 22 мая 2018

Я разрабатываю программу на микроконтроллере NRF52832 на c в IDE Netbeans, которая получает данные от внешнего АЦП через SPI и выводит сигнал ШИМ с рабочим циклом, который зависит от данных от АЦП.

Я получил пример кода для драйвера SPI и драйвера PWM, работающих в отдельных проектах, и теперь я пытаюсь объединить их.Однако, когда я вставляю функцию из, скажем, драйвера ШИМ в драйвер SPI и вставляю соответствующий файл включения в драйвер SPI, я зацикливаюсь на цикле if в исходном файле, который был включен как часть примера кода.Я дошел до того, что даже не знаю, как начать устранение неполадок, поэтому приветствуются любые предложения или идеи.

В настоящее время я работаю с драйвером SPI, который работает нормально, пока не добавлю следующеекод в main.c:

ret_code_t err_code;

/* 1-channel PWM, 100000 microseconds period = 0.1 second , output on pin 5. */
app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(125L, 5);

/* Switch the polarity of the second channel. */
pwm1_cfg.pin_polarity[1] = APP_PWM_POLARITY_ACTIVE_HIGH;

/* Initialize and enable PWM. */
err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
APP_ERROR_CHECK(err_code);
app_pwm_enable(&PWM1);
app_pwm_channel_duty_set(&PWM1, 0, Duty);

Когда я отлаживаю, все в порядке, пока я не дохожу до функции

err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);

Когда я прохожу через эту функцию, она делает кучу позадиинициализация -the-сцен застревает в следующей функции:

/**
 * Function examines current header and omits pushed strings and packets which are in progress.
 */
static bool invalid_packets_pushed_str_omit(nrf_log_header_t const * p_header, uint32_t * p_rd_idx)
{
    bool ret = false;
    if ((p_header->base.generic.type == HEADER_TYPE_PUSHED) || (p_header->base.generic.in_progress == 1))
    {
        if (p_header->base.generic.in_progress == 1)
        {
            switch (p_header->base.generic.type)
            {
            case HEADER_TYPE_STD:
                *p_rd_idx += (HEADER_SIZE + p_header->base.std.nargs);
                break;
            case HEADER_TYPE_HEXDUMP:
                *p_rd_idx += (HEADER_SIZE + p_header->base.hexdump.len);
                break;
            default:
                ASSERT(0);
                break;
            }
        }
        else
        {
            *p_rd_idx +=
                    (PUSHED_HEADER_SIZE + p_header->base.pushed.len + p_header->base.pushed.offset);
        }
        ret = true;
    }
    return ret;
}

Вот остальная часть моего кода main.c (все, что связано с pwm, было добавлено мной, остальное - пример кодадля драйвера SPI):

#include "nrf_drv_spi.h"
#include "app_util_platform.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "boards.h"
#include "app_error.h"
#include <string.h>
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "/Users/tom/opt/nRF5_SDK_15.0.0/nRF5_SDK_15.0.0_a53641a/components/libraries/pwm/app_pwm.h" 

#define SPI_INSTANCE  0 /**< SPI instance index. */
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);  /**< SPI instance. */
static volatile bool spi_xfer_done;  /**< Flag used to indicate that SPI instance completed the transfer. */

#define TEST_STRING "Nordic"
static uint8_t       m_tx_buf[] = TEST_STRING;           /**< TX buffer. */
static uint8_t       m_rx_buf[sizeof(TEST_STRING) + 1];    /**< RX buffer. */
static const uint8_t m_length = sizeof(m_tx_buf);        /**< Transfer length. */


//PWM INITIALIZATION (Added)
uint32_t Duty = 90;

APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.

static volatile bool ready_flag;            // A flag indicating PWM status.

void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
{
    ready_flag = true;
}

//End added

/**
 * @brief SPI user event handler.
 * @param event
 */

void spi_event_handler(nrf_drv_spi_evt_t const * p_event,
                       void *                    p_context)
{
    spi_xfer_done = true;
    NRF_LOG_INFO("Transfer completed.");
    if (m_rx_buf[0] != 0)
    {
        NRF_LOG_INFO(" Received:");
        NRF_LOG_HEXDUMP_INFO(m_rx_buf, strlen((const char *)m_rx_buf));
    }
}

int main(void)
{
    //Added

    ret_code_t err_code;

    /* 1-channel PWM, 100000 microseconds period = 0.1 second , output on pin 5. */
    app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(125L, 5);

    /* Switch the polarity of the second channel. */
    pwm1_cfg.pin_polarity[1] = APP_PWM_POLARITY_ACTIVE_HIGH;

    /* Initialize and enable PWM. */
    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
    APP_ERROR_CHECK(err_code);
    app_pwm_enable(&PWM1);
    app_pwm_channel_duty_set(&PWM1, 0, Duty);

    //End Added


 //   bsp_board_init(BSP_INIT_LEDS);

    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
    spi_config.ss_pin   = SPI_SS_PIN;
    spi_config.miso_pin = SPI_MISO_PIN;
    spi_config.mosi_pin = SPI_MOSI_PIN;
    spi_config.sck_pin  = SPI_SCK_PIN;
    APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL));

    NRF_LOG_INFO("SPI example started.");

    while (1)
    {
        // Reset rx buffer and transfer done flag
        memset(m_rx_buf, 0, m_length);
        spi_xfer_done = false;

        APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, m_tx_buf, m_length, m_rx_buf, m_length));

        while (!spi_xfer_done)
        {
            __WFE();
        }

        NRF_LOG_FLUSH();

 //       bsp_board_led_invert(BSP_BOARD_LED_0);
 //       nrf_delay_ms(200);
    }
}

Любые предложения приветствуются!Если я опущу любую важную информацию, пожалуйста, попросите разъяснений, и я предоставлю все, что смогу.

ОБНОВЛЕНИЕ

Привет, ребята, спасибо большое за ответы.Я создал альбом цикла Imgur, отлаживая (надеюсь) все соответствующие переменные и их значения в левой части экрана на изображениях: https://imgur.com/a/HYah1yC

Как вы можете видеть наальбом, указатель *p_rd_idx бесконечно увеличивается внутри nrf_log_frontend.c и по какой-то причине никогда не достигает конца функции.

@ Yunnosch: я нашел определение ASSERT:

#define ASSERT(expr)

но я не думаю, что это будет полезно, поскольку значение expr равно OUT_OF_SCOPE, и когда я пытаюсь щелкнуть правой кнопкой мыши и перейти к объявлению expr, ничего не происходит.

...