ESP32--单核使用FreeRTOS测试队列进行任务间通信

单核版本有一点不一样的地方,但实现起来比双核的要简单

上一篇博文更的是双核版的队列测试,基本在那里说的很清楚了,那里的代码注释也多的多,这里单核版本有一点不一样的地方,但实现起来比双核的要简单,所以直接给大家代码,如果不理解就去看上一篇博文,里面说明和注释都非常清楚

给大家代码,这里实现了两个进程间使用一个int数据类型的队列进行通信,当然这里应该也是支持结构体多类型的,想试试的可以去上一篇博文看看怎么弄的

QueueHandle_t queue;    //单核多进程测试队列,这是队列的句柄

TaskHandle_t Task1;   //任务0的句柄

TaskHandle_t Task2;


void task1( void * parameter )

{

  int data_get = 520;

  BaseType_t Status;

  const TickType_t xTicksToWait = pdMS_TO_TICKS(100);

    while(1)

    {

      vTaskDelay(800);

      Status = xQueueReceive(queue, &data_get, xTicksToWait);  //单核调用队列接收的函数

      if(Status == pdPASS)

      {

        Serial.print("成功收到数据:");

        Serial.println(data_get);

      }

      Serial.print("接收数据任务的优先级:");

      Serial.println(uxTaskPriorityGet(Task1));  // 就是获取任务的优先级,而传入的参数就是任务的句柄

      Serial.println("***********************************************************");

    }

}

 

  

 

void task2( void * parameter)

{

  int data_send = 625;

  BaseType_t Status;

  const TickType_t xTicksToWait = pdMS_TO_TICKS(200);

    while(1)

    {

      vTaskDelay(1200);  //每1200ms向队列中发送一次数据

      Status = xQueueSend(queue, &data_send, xTicksToWait);  //向队列中发送数据

      if(Status == pdPASS)

      {

        Serial.print("成功发送数据:");

      }

      Serial.print("发送数据任务的优先级:");

      Serial.println(uxTaskPriorityGet(Task2));

      Serial.println("***********************************************************");

    }

}



void setup() {

  Serial.begin(115200);

  queue = xQueueCreate( 10, sizeof( int ) );  //创建一个队列,用的是整数型

  //下面是创建两个任务

  xTaskCreate(

                    task1,          //指定任务函数,也就是上面那个task1函数

                    "TaskOne",        //任务名称

                    10000,            //任务堆栈大小

                    NULL,             //作为任务输入传递的参数

                    1,                //优先级

                    &Task1);            //任务句柄,可以不用创建,直接用NULL

 

  xTaskCreate(

                    task2,         

                    "TaskTwo",        

                    10000,            

                    NULL,             

                    3,               

                    &Task2); 

  if(queue == NULL){

    Serial.println("创建队列失败");

  }

}

  

void loop() {

  Serial.println("主程序仍然在运行");

  delay(1000);

}

看看结果

attachments-2020-09-CimIOxhs5f6c35bd9980b.jpg

  • 发表于 2020-09-24 14:01
  • 阅读 ( 4052 )

0 条评论

请先 登录 后评论
淡若清风
淡若清风

35 篇文章

作家榜 »

  1. 淡若清风 35 文章
  2. 杨杨 2 文章
  3. cgisky 1 文章
  4. vvvans 0 文章
  5. meow_sir 0 文章
  6. Scott 0 文章
  7. ddd ddd 0 文章
  8. lx 0 文章