Какова цель функции xTaskAbortDelay в свободном rtos? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть две задачи, в которых я получаю данные от Bluetooth, и если я получаю определенное шестнадцатеричное значение, я хочу, чтобы задача (которая является состоянием переключаемого светодиода) запускалась на основе полученных данных.

Если данные не были получены, обе задачи должны выполняться согласно их расписанию.

Я пытался использовать функцию xTaskAbortDelay, однако задание запускается из ввода данных Bluetooth, однако после этого задание светодиода работает непрерывно.

xTaskAbortDelay создает здесь какую-то проблему? Должен ли я использовать что-то еще для достижения той же функциональности?

TaskHandle_t  lora_send_data_handle;
TaskHandle_t  ble_send_data_handle;
TaskHandle_t  test_data_handle;

static void button_task_check(void * pvParameter)
{
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 1024;
    xLastWakeTime = xTaskGetTickCount();
    while(1)
    {
        nrf_delay_ms(100);
        SEGGER_RTT_printf(0,"%s","INSIDE SWITCHING\r\n");
        xTaskAbortDelay(test_data_handle);

        vTaskDelayUntil( &xLastWakeTime, (TickType_t) 1024);
    }
}


/*TASK TO RUN LEDS CHECK */
static void led_task_check(void * pvParameter)
{
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 122880;
    xLastWakeTime = xTaskGetTickCount();

    while(1)
    {
        SEGGER_RTT_printf(0,"%s","TEST TASK\r\n");
        nrf_gpio_pin_write(RED,1);
        nrf_gpio_pin_write(GREEN,1);
        nrf_gpio_pin_write(BLUE,1);

        nrf_gpio_pin_write(RED,0);
        nrf_gpio_pin_write(GREEN,1);
        nrf_gpio_pin_write(BLUE,1);
        nrf_delay_ms(1000);
        nrf_gpio_pin_write(RED,1);
        nrf_gpio_pin_write(GREEN,0);
        nrf_gpio_pin_write(BLUE,1);
        nrf_delay_ms(1000);
        nrf_gpio_pin_write(RED,1);
        nrf_gpio_pin_write(GREEN,1);
        nrf_gpio_pin_write(BLUE,0);
        nrf_delay_ms(1000);

        nrf_gpio_pin_write(RED,0);
        nrf_gpio_pin_write(GREEN,0);
        nrf_gpio_pin_write(BLUE,0);
        nrf_delay_ms(1000);

        vTaskDelayUntil( &xLastWakeTime, (TickType_t) 122880);
    }
}


int main(void)
{

    uint8_t rx_qspi[255];
    SEGGER_RTT_printf(0,"%s","reset\r\n");

    nrf_delay_ms(100);

    xQueue1 = xQueueCreate(1, 30);

    ret_code_t err_code;
    err_code = nrf_drv_clock_init();
    SEGGER_RTT_WriteString(0, err_code);

    UNUSED_VARIABLE(xTaskCreate( button_task_check, "t", \            
        configMINIMAL_STACK_SIZE + 200, NULL,3,  &lora_send_data_handle));
    UNUSED_VARIABLE(xTaskCreate(led_task_check, "et", \
        configMINIMAL_STACK_SIZE + 200, NULL, 2, &test_data_handle));

    vTaskStartScheduler();

    while(1);
}

1 Ответ

0 голосов
/ 29 августа 2018

Репутация низкая, чтобы комментировать. Из того, что вы говорите, все работает, как вы сказали. Нужна дополнительная информация:

  1. Как выглядит задача светодиода?
  2. Используете ли вы упреждающий или кооперативный планировщик (#define configUSE_PREEMPTION 1 в файле freertosconfig.h).
  3. Каковы приоритеты трех задач?

Что еще нужно учитывать: вы переводите задание в состояние БЛОКИРОВАНО после того, как оно отработало? Вы должны проверить это в первую очередь. Как вы блокируете задачу в первую очередь?

Возможно, попытайтесь использовать vTaskResume( <LED task handle> ) из задач bluetooth и вызвать vTaskSuspend() из задачи LED, когда она завершит свою работу. Лично я не думаю, что это лучший подход, но он должен работать.

...