延时函数点亮LED
#include <stdio.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
void app_main(void)
{
while(1){
//使用ESP的打印函数, 会输出这时候执行的时间
ESP_LOGI("main", "Hello world");
//使用freeFTOS的延时函数
vTaskDelay(1000);
}
}
FreeRTOS的延时函数的参数是切换任务的次数, 可以通过设置每一秒的任务切换的次数进行设置频率
或者使用
vTaskDelay(1000/portTICK_PERIOD_MS);
, 将时间换算为毫秒
设置每秒钟的时钟的个数
在ESP-IDF中一般我们使用 ESP_LOGx 输出日志信息,日志打印等级有:
- ESP_LOGE -错误(最低)
- ESP_LOGW - 警告
- ESP_LOGI -信息
- ESP_LOGD -调试
- ESP_LOGV -详细(最高)
为什么不用 printf 打印日志信息?ESP-IDF基于 freeRTOS,而FreeRTOS是一个抢占式的实时多任务系统,抢占就意味着任务之间有优先级,高优先级的任务可以打断低优先级的任务。因为 printf 是一个不可重入函数,而在中断中要避免调用不可重入函数(在freeRTOS多任务中也是一样)。 区分一个函数是否可重入就是看这个函数能否在未返回的时候再次被调用。而造成一个函数不可重入的原因往往是使用了全局变量,如果一个函数未返回再执行一次会导致对全局变量的操作是不安全的。就例如我们常用的printf、malloc、free都是不可重入的函数,printf会引用全局变量stdout,malloc,free会引用全局的内存分配表,在多线程的环境下,如果没有很好的处理数据保护和互斥访问,就会发生错误。 所以使用printf是不够安全的,为此ESP-IDF提供了自己的安全接口 ESP_LOGx。