免费rtos中的xTaskAbortDelay函数的目的是什么?

时间:2018-08-29 10:20:38

标签: c freertos rtos

我有两个任务,我正在从蓝牙中接收数据,如果我接收到一个特定的十六进制值,我希望一个任务(即“切换LED状态”)在接收到的数据的基础上运行。

如果未接收到数据,则两个任务均应按计划运行。

我一直在尝试使用xTaskAbortDelay函数,该任务的确从蓝牙数据的输入运行,但是之后LED任务连续运行。

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 :(得分:0)

声望低至无法置评。从您所说的来看,一切都按照您所说的进行。需要更多信息:

  1. LED任务是什么样的?
  2. 您是否使用抢占式或协作式调度程序(freertosconfig.h文件中的#define configUSE_PREEMPTION 1)。
  3. 这三个任务的优先级是什么?

还有其他需要考虑的事情:在任务完成后,您是否将任务放回BLOCKED状态?您应该先检查一下。您如何首先阻止任务?

也许可以尝试从蓝牙任务中调用vTaskResume( <LED task handle> ),并在完成任务后从LED任务中调用vTaskSuspend()。我个人认为这不是最好的方法,但是应该可以。