ESP32-FreeRTOS学习笔记(九)--队列在任务间传输数据
1.队列相关的API123456789101112131415161718//创建一个队列QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, //队列数据单元深度 UBaseType_t uxItemSize //每个数据单元有多少字节 );//向队列里发数据BaseType_t xQueueSend( QueueHandle_t xQueue, //队列的句柄 const void * pvItemToQueue, //要向队列写入的数据 TickType_t xTicksToWait //最长等待时间 );//从队列里取数据BaseType_t xQueueReceive( QueueHandle...
ESP32-FreeRTOS学习笔记(八)--看门狗
需要知道的是: Arduion-ESP32 默认在 Core 0 的 IDLE 任务开启了看门狗 时间为 5000 ticks = 5秒(若IDLE(0)无法运行,所以不能喂狗,将导致系统5秒后重启) Core 0 和 Core 1 都运行了 FreeRTOS 的IDLE任务,优先级为 0(IDLE任务是用于清理被删除任务的内存) Core 1 loopBack任务就是Arduino的 setup 和 loop 优先级为 1 API:需要包含 esp_task_wdt.h 文件 函数 描述 esp_task_wdt_init 初始化任务看门狗计时器 esp_task_wdt_deinit 取消初始化任务监视计时器 esp_task_wdt_add 将任务订阅到任务监视计时器 esp_task_wdt_reset 当前正在运行的任务重置任务看门狗计时器 esp_task_wdt_delete 从任务监视计时器取消订阅任务 esp_task_wdt_status 查询任务是否已订阅任务监视程序计时器 官方使用例: 123456789...
ESP32-FreeRTOS学习笔记(七)--任务优先级
在ESP32上的FreeRTOS上优先级越高其值越大 12345678910111213API: //设置优先级 void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ); //获取TashHandle任务优先级 UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ); //获取当前任务优先级 UBaseType_t uxTaskPriorityGet(NULL); //退让资源,任务调度器会重新评估任务,将资源分配给同等级或者更高等级任务 //注意不会把资源给低等级任务 tastYIELD(); 当高优先级的任务没有阻塞或者挂起时,同一核心的低优先级的任务将得不到运行,这就是为什么要用 vTaskDelay 的原因了 ——— 让任务进入阻塞,而普通的delay将没有这样的效果。
ESP32-FreeRTOS学习笔记(六)--任务的状态和管理
介绍了任务的全部状态和对相关任务进行管理。 1.任务的状态 Blocked阻塞态 任务会在进入block的函数处停止,并且不占用CPU资源 Suspended挂起态 任务会完全暂停,不占用CPU资源 Ready就绪态 准备运行该任务 Running运行态 任务运行中 2.任务的管理会使用到如下函数API: 12345BaseType_t xTaskCreate(,,,,,); //任务创建void vTaskDelete( TaskHandle_t xTask ); //任务删除 void vTaskSuspend( TaskHandle_t xTaskToSuspend ); //任务暂停void vTaskResume( TaskHandle_t xTaskToResume ); //任务恢复//相关参数都为要操作任务的句柄,为NULL时则操作当前任务 下面是使用实例: 12345678TaskHandle_t theTestHandle = NULL; //Task HandlerxTaskCreate(radioBilibili, "The tes...
ESP32-FreeRTOS学习笔记(五)--任务内存优化
介绍了如何获取剩余内存堆空间,如何准确分配内存。 1.获取剩余内存堆空间下面两个是由ESP官方提供的函数 123int ESP.getHeapSize() //获取ESP32的总堆空间,返回intint ESP.getFreeHeap() //获取ESP32剩余堆空间,返回int 下面介绍获取单个任务的剩余堆空间 1int uxTaskGetStackHighWaterMark(taskHandle) //获取指定任务的剩余内存,参数为NULL时获取当前任务的剩余内存 下面是一个例子 1234567891011121314151617181920212223int heapSize = ESP.getHeapSize();Serial.print("Total Heap Size: ");Serial.print(heapSize);Serial.println(" Bytes");int heapFree = ESP.getFreeHeap();Serial.print("Free Heap Size: ")...
ESP32-FreeRTOS学习笔记(二)--MUTEX互斥量的应用
包括任务函数使用全局变量和添加互斥量避免“冒险与竞争” 12345678910111213//使用前的准备SemaphoreHandle_t xMutextheTestTask = NULL; //创建信号量HandlerTickType_t timeOut = 1000; //用于获取信号量的Timeout 1000 ticksxMutextheTestTask = xSemaphoreCreateMutex(); //创建MUTEX//具体使用void theTestTask(void *pvParam) { //在timeout时间内任务会block来等待获取到密钥(返回NULL则获取失败) if (xSemaphoreTake(xMutextheTestTask, timeOut) == pdPASS) { //写入被保护的数据,这个过程需要尽可能快 xSemaphoreGive(xMutextheTestTask); //释放钥匙 }} 使用到的函数 12345678xSemapho...
ESP32-FreeRTOS学习笔记(三)--任务等待绝对的时间
在任务中我们可以使用 vTaskDelay(pdTICKS_TO_MS(delayTimeMS)) 来延时对应时间,但是实际上这个延迟将会有误差,如果我们的任务对频率要求更高的话就可以使用如下函数: 12vTaskDelayUntil(&xLastWakeTime, xFrequency);//xLastWakeTime为调用该函数时的tickCount,xFrequency为需要等待的tick,期间函数将会阻塞,结束时tickCount的值会为xLastWakeTime + xFrequency 下面是使用样例: 1234567891011//使用前准备//最后一次唤醒的tick count,第一次使用需要赋值//以后此变量会由vTaskDelayUntil自动更新TickType_t xLastWakeTime = xTaskGetTickCount();const TickType_t xFrequency = pdTICKS_TO_MS(1000); // 间隔 1000 ms = 3 seconds//使用延迟函数Serial.println(xTaskGet...
ESP32-FreeRTOS学习笔记(四)--软件定时器的应用
先介绍创建软件定时器的API函数 12345TimerHandle_t xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) 参数 描述 pcTimerName 定时器名字,用于调试目的,方便识别不同的定时器。 xTimerPeriodInTicks 定时器周期,单位系统时钟Tick。 uxAutoReload 选择周期模式还是单次模式,若参数为pdTRUE,则表示选择周期模式,若参数为pdFALSE,则表示选择单次模式。(自动重装载值...
ESP32-FreeRTOS学习笔记(一)--创建FreeRTOS任务
包括任务的创建和向任务传参 1.创建任务任务调用的函数模板 123void theTestTask(void *pvParam) { //your code} 任务是由 C 语言函数实现的。唯一特别的只是任务的函数原型,其必须返回 void, 而且带有一个 void 指针参数。 调用FreeRTOS提供的函数创建任务 123456vportBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask ); 参数名 描述 pvTaskCode 指向你要运行的函数的指针 pcName 具有描述性的任务名。这个参数不会被 FreeRTOS 使用。其只是单 纯地用于辅...
linux下给单片机烧录程序时提示没有权限
这是因为该用户所在的用户组不包含USB的相关权限,我们可以将用户添加到有权限的用户组,或者将对应串口开放给所有人使用。 1. 添加到dialout用户组打开终端输入:sudo usermod -aG dialout USERNAME 2. 开放串口权限添加如下内容到 /etc/udev/rules.d/ 下的rules文件: 12KERNEL==“ttyACM[0-9]*”, MODE=“0666”KERNEL==“ttyUSB[0-9]*”, MODE=“0666” 最好自己创建一个新文件,名称要符合规范。 3. 单独给串口开放权限使用管理员权限: sudo chmod 777 /dev/ttyACM0 缺点是每次插拔设备后都需要重新更改权限。