啥也不是完全就是抄写练习。
IO口输出模式
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
void app_main(void)
{
gpio_pad_select_gpio(GPIO_NUM_17); //选择一个GPIO
//gpio_init();
/* Set the GPIO as a push/pull output */
gpio_set_direction(GPIO_NUM_17, GPIO_MODE_OUTPUT); //把这个GPIO作为输出
while(1)
{
/* Blink off (output low) */
printf("Turning off the LED\n");
gpio_set_level(GPIO_NUM_17, 0); //把这个GPIO输出为低电平
vTaskDelay(1000 / portTICK_PERIOD_MS); //1000ms后重新执行操作
/* Blink on (output high) */
printf("Turning on the LED\n");
gpio_set_level(GPIO_NUM_17, 1); //把这个GPIO输出为高电平
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
延时Delay
就是交出CPU一段时间,如果任务一直不延时或者挂起,那么低优先级的任务会无法获得CPU。
FreeRTOS延时的单位是tick,就是调度的基本单位(不是毫秒)
vTaskDelay和vTaskDelayUntil都是延时函数,vTaskDelayUntil是精确延时
函数原型
void vTaskDelay( const TickType_t xTicksToDelay )
void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )
vTaskDelay
TickType_t lasttick;
lasttick = xTaskGetTickCount();
while(1)
{
//执行操作...
//相对于lasttick 1000ms后重新执行操作
vTaskDelayUntil(&lasttick, 1000 / portTICK_RATE_MS);
}
vTaskDelayUntil
TickType_t lasttick;
lasttick = xTaskGetTickCount();
while(1)
{
//执行操作...
//相对于lasttick 1000ms后重新执行操作
vTaskDelayUntil(&lasttick, 1000 / portTICK_RATE_MS);
}
vTaskDelayUntil会自动给变量赋值,lasttick 只需要赋值第一次
测试:
//vTaskDelayUntil测试
void delay_test_task(){
TickType_t lasttick = xTaskGetTickCount(); //初值
while(1)
{
printf("----------------------\n");
printf("1.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
vTaskDelayUntil(&lasttick,100);
printf("2.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
vTaskDelayUntil(&lasttick,100);
printf("3.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
vTaskDelayUntil(&lasttick,200);
printf("4.lasttick:%d,\txTaskGetTickCount:%d\n",lasttick,xTaskGetTickCount());
}
}
好像和51差不多理解的样子,白话文的写法。