TaskHandle_t xTaskHandle2 = NULL;
时间: 2024-02-26 17:52:21 浏览: 128
这行代码是定义了一个类型为TaskHandle_t的变量xTaskHandle2,并将其初始化为NULL。TaskHandle_t是FreeRTOS中一个任务句柄类型的别名,用于跟踪任务的句柄。任务句柄是一个指向任务控制块的指针,任务控制块中存储了任务的状态信息、堆栈指针等。在创建一个任务时,FreeRTOS会返回一个任务句柄,我们可以使用这个任务句柄来操作任务,例如删除任务、挂起任务、恢复任务等。在这个例子中,我们定义了两个任务(TaskHandle_t xTaskHandle1和TaskHandle_t xTaskHandle2)的句柄,用于后续操作这两个任务。由于在定义变量时未给出初始值,因此将其初始化为NULL。
相关问题
用ESP32的SDK库,设置两个按键,分别为按键1和按键2,低电平触发中断,短按按键1打印“KEY1”,长按按键1打印“LONG1”,短按按键2打印“KEY2”,长按按键2打印“LONG2”,同时按两个按键时打印“OK”
代码如下:
```
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define KEY1_PIN GPIO_NUM_4
#define KEY2_PIN GPIO_NUM_5
#define SHORT_PRESS_TIME 50 // 短按时间,单位为毫秒
#define LONG_PRESS_TIME 500 // 长按时间,单位为毫秒
TaskHandle_t xTaskHandle1 = NULL;
TaskHandle_t xTaskHandle2 = NULL;
void key1_interrupt_handler(void* arg)
{
static int press_time = 0;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if(gpio_get_level(KEY1_PIN) == 0) { // 按键按下
press_time = xTaskGetTickCount();
} else { // 按键松开
if(xTaskGetTickCount() - press_time < SHORT_PRESS_TIME / portTICK_PERIOD_MS) { // 短按
xTaskNotifyFromISR(xTaskHandle1, 0x01, eSetValueWithOverwrite, &xHigherPriorityTaskWoken);
} else if(xTaskGetTickCount() - press_time >= LONG_PRESS_TIME / portTICK_PERIOD_MS) { // 长按
xTaskNotifyFromISR(xTaskHandle1, 0x02, eSetValueWithOverwrite, &xHigherPriorityTaskWoken);
}
}
if(xHigherPriorityTaskWoken == pdTRUE) {
portYIELD_FROM_ISR();
}
}
void key2_interrupt_handler(void* arg)
{
static int press_time = 0;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if(gpio_get_level(KEY2_PIN) == 0) { // 按键按下
press_time = xTaskGetTickCount();
} else { // 按键松开
if(xTaskGetTickCount() - press_time < SHORT_PRESS_TIME / portTICK_PERIOD_MS) { // 短按
xTaskNotifyFromISR(xTaskHandle2, 0x01, eSetValueWithOverwrite, &xHigherPriorityTaskWoken);
} else if(xTaskGetTickCount() - press_time >= LONG_PRESS_TIME / portTICK_PERIOD_MS) { // 长按
xTaskNotifyFromISR(xTaskHandle2, 0x02, eSetValueWithOverwrite, &xHigherPriorityTaskWoken);
}
}
if(xHigherPriorityTaskWoken == pdTRUE) {
portYIELD_FROM_ISR();
}
}
void key1_task(void* arg)
{
uint32_t ulNotifiedValue;
while(1) {
xTaskNotifyWait(0x00, 0xff, &ulNotifiedValue, portMAX_DELAY);
if(ulNotifiedValue == 0x01) { // 短按
printf("KEY1\n");
} else if(ulNotifiedValue == 0x02) { // 长按
printf("LONG1\n");
}
ulNotifiedValue = 0;
}
}
void key2_task(void* arg)
{
uint32_t ulNotifiedValue;
while(1) {
xTaskNotifyWait(0x00, 0xff, &ulNotifiedValue, portMAX_DELAY);
if(ulNotifiedValue == 0x01) { // 短按
printf("KEY2\n");
} else if(ulNotifiedValue == 0x02) { // 长按
printf("LONG2\n");
}
ulNotifiedValue = 0;
}
}
void app_main()
{
gpio_config_t io_conf;
io_conf.pin_bit_mask = (1ULL << KEY1_PIN) | (1ULL << KEY2_PIN);
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
io_conf.intr_type = GPIO_INTR_ANYEDGE;
gpio_config(&io_conf);
gpio_install_isr_service(0);
gpio_isr_handler_add(KEY1_PIN, key1_interrupt_handler, NULL);
gpio_isr_handler_add(KEY2_PIN, key2_interrupt_handler, NULL);
xTaskCreate(key1_task, "key1_task", 2048, NULL, 10, &xTaskHandle1);
xTaskCreate(key2_task, "key2_task", 2048, NULL, 10, &xTaskHandle2);
while(1) {
if(gpio_get_level(KEY1_PIN) == 0 && gpio_get_level(KEY2_PIN) == 0) { // 同时按下两个按键
printf("OK\n");
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
```
用sys_thread_new创建的进程如何杀掉
在FreeRTOS操作系统中,`sys_thread_new`函数用于创建一个新的线程,通常这种线程是由任务(Task)表示的。如果你想要终止这样的任务(线程),你可以使用`vTaskDelete`函数。这个函数会试图停止指定的任务,如果任务正在运行并且设置了适当的配置,它会在适当的时候释放资源并停止执行。
```c
// 示例
xTaskHandle taskHandle = sys_thread_new("MyTask", MyTaskFunction, NULL, configMAX_PRIORITIES - 1, tsk.stack_size(), tsk.stack_info());
if (taskHandle != NULL) {
// 如果任务创建成功,可以保存其句柄
vTaskDelete(taskHandle); // 调用此函数来尝试结束任务
} else {
// 处理任务创建失败的情况
}
```
注意,在使用`vTaskDelete`之前,需要确保任务已经设置好一些特性,比如允许被删除(`e任务配置标志`中的`eTASK_DELETEABLE`)以及是否设置了延时退出功能(`configUSE_TRACE_FACILITY`)。此外,`vTaskDelete`不是立即杀死任务,而是将任务状态改为“等待删除”,在下次调度时才会真正结束。
阅读全文
相关推荐












