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



>我有两个任务,其中我正在从蓝牙接收数据,如果我收到一个特定的十六进制值,我希望一个任务(即切换 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 SWITCHINGrn");
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 TASKrn");
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","resetrn");
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. LED 任务是什么样的?
  2. 您是否使用抢占式或合作式调度程序(在 freertosconfig.h 文件中#define configUSE_PREEMPTION 1(。
  3. 三项任务的优先次序是什么?

其他需要考虑的事情是:您是否在任务送达后将任务恢复为 BLOCK 状态?您应该先检查一下。你如何首先阻止任务?

也许尝试使用来自蓝牙任务的呼叫vTaskResume( <LED task handle> ),并在完成工作后从 LED 任务调用vTaskSuspend()。我个人不认为这是最好的方法,但它应该有效。

相关内容

  • 没有找到相关文章

最新更新