ESP32的基础学习之FreeRTOS(一)

一、前言

本人也是刚刚开始学习ESP32,还未毕业。对嵌入式开发有一点点基础,之前一直还玩的是8051和STM32单片机。自从我发现了ESP32后,我就对它产生了浓厚的兴趣。之后我就在官网买了一块开发板,开始我的学习之旅。
  首先说说我为什么会对它产生浓厚的兴趣,第一、片上资源丰富,有多丰富大家可以到官网查找手册。对于一个想入门嵌入式的人来说,这些都是必须的。第二、软件框架开源。如果你目前不想去了解一些外设的底层驱动,用这些框架简直是太爽了。第三、可以学习FreeRTOS嵌入式操作系统,IDF框架是基于FreeRTOS的,等等原因。它完全满足了我未来一段时间的学习期望所必要的条件。
  买到开发板已经有几天了,完成了对它的环境搭建。关于它的环境搭建,直接按照官网的步骤一步一步来,绝对不会错,我这里就不在重复了,有什么问题可以和我讨论,但我也比较菜,环境搭建好后,我想大多新手估计会和我一样,怎么开始我的项目啊?从哪里开始呀?仅仅输出个helloworld完全不满足。
  为了避免少走弯路,得先从基础的开始学起,所以我打算用一个系列来记录我的学习过程。相当于一个学习笔记吧,不免许多个人的见解,所以内容仅供参考

二、使用FreeRTOS创建一个任务

  • 代码
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void task(void *pvPar)
{
	while(1)
	{
	  printf("I'm %s\r\n",(char *)pvPar);
      //使用此延时API可以将任务转入阻塞态,期间CPU继续运行其它任务
	  vTaskDelay(1000 / portTICK_PERIOD_MS);
	}
}

void app_main()
{
	vTaskDelay(pdMS_TO_TICKS(100));//等待系统初始化
	//以下创建了三个任务,使用的任务函数都是task(),只不过传入的参数不同,每一个任务独立运行
    xTaskCreatePinnedToCore(task,           //任务函数
    		               "task1",         //这个参数没有什么作用,仅作为任务的描述
			                2048,            //任务栈的大小
			               "task1",         //传给任务函数的参数
			                2,              //优先级,数字越大优先级越高
			               NULL,            //传回的句柄,不需要的话可以为NULL
			               tskNO_AFFINITY); //指定运行任务的CPU,使用这个宏表示不会固定到任何核上
    xTaskCreatePinnedToCore(task, "task2", 2048, "task2",2, NULL, tskNO_AFFINITY);
    xTaskCreatePinnedToCore(task, "task3" ,2048, "task3",2, NULL, tskNO_AFFINITY);
    for(;;);
}
  • 运行结果
     
    ESP32的基础学习之FreeRTOS(一)_第1张图片
  • 笔记
     1、如果发现打印过程中有触发了watchdog的警告,需要在配置menuconfig,不启用看门狗
     2、我这里三个任务的优先级都是一样的,所以表现为同时执行。如果不一样,优先级高的会首先得到执行。如果高优先级任务函数中不能使任务进入阻塞态,低优先级的任务将不会得到执行,所以要使用 vTaskDelay();,或者采用其它办法,比如使用单独的API函数设置优先级。在写程序的过程中要避免任务被“饿死”。
     3、我这里的任务函数采用了一个while死循环,如果不采用死循环的话,一定要在函数末尾加上vTaskDelete();
     5、更多关于任务的API需要到官网查看。

你可能感兴趣的:(ESP32,FreeRTOS)