#include <FreeRTOS.h>
#include <task.h>
void task(void *param_t){
  while(1){
    printf("任务 [%s] 优先级: %u  运行核心:%d\n", pcTaskGetName(NULL),uxTaskPriorityGet(NULL),xPortGetCoreID());
    delay(1000);
  }
}

void task2(void *param_t){
  while(1){
    delay(100);
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32-S3!");
  xTaskCreatePinnedToCore(task, "LED-TASK", 10240, NULL, 1, NULL, 0);
  xTaskCreatePinnedToCore(task, "GateWay", 10240, NULL, 2, NULL, 1);
  xTaskCreatePinnedToCore(task, "Display", 10240, NULL, 3, NULL, 0);
  xTaskCreatePinnedToCore(task, "Keyboard", 10240, NULL, 4, NULL, 1);
  xTaskCreatePinnedToCore(task2, "NULLTASK", 1024, NULL, 5, NULL, 1);
}

// 遍历任务列表,代替vTaskList功能
void traverse(){
  // 获得空闲任务,第一个任务
  String STATUS[] = {"运行中","就绪","已阻塞","已挂起","已删除"};
  // TaskHandle_t xHandle = xTaskGetIdleTaskHandle();
  TaskHandle_t xHandle =xTaskGetCurrentTaskHandle();    // 这种获取方式不正确,有可能不是第一个任务
  printf("-------------------------------------------------\n");
  printf("%-16s %-4s %8s %8s %8s\n","名称","优先级","状态","核心", "剩余内存");
  while (xHandle != NULL){
    uint32_t core_id = 0;
    printf("%-16s %-4d %8s %4d %8d\n",
                        pcTaskGetName(xHandle),                 // 获取任务名称
                        uxTaskPriorityGet(xHandle),             // 获取任务优先级
                        STATUS[eTaskGetState(xHandle)],         // 获取任务当前状态
                        xTaskGetAffinity(xHandle),              // 获取任务运行在哪个核心
                        uxTaskGetStackHighWaterMark(xHandle));  // 获取任务堆栈水位线
    xHandle = pxTaskGetNext(xHandle);
  }
  printf("-------------------------------------------------\n");
  
} 
void loop() {
  traverse();
  delay(1000); // this speeds up the simulation
}