抄写学习-FreeRTOS学习-点灯1s延时闪烁

本文介绍了如何使用GPIO口进行LED控制,并详细讲解了FreeRTOS中的vTaskDelay和vTaskDelayUntil函数,展示了如何实现精确延时和任务调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

啥也不是完全就是抄写练习。

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差不多理解的样子,白话文的写法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值