FreeRTOS学习--33讲 延时函数

本文详细介绍了FreeRTOS中相对延时函数vTaskDelay()、绝对延时函数vTaskDelayUntil()的使用方法,并通过示例展示了如何在多任务环境下实现不同类型的延时,以便在FreeRTOS程序设计中灵活调度任务执行。
摘要由CSDN通过智能技术生成

相对延时:vTaskDelay()     

                程序遇到TaskDelay()开始延时,直到规定时间结束,延时时,任务阻塞,在这期间低优先级也能执行

绝对延时:vTaskDelayUntil(&xLastWakeTime,500)

                将整个任务的运行周期看成整体,在延时的时间内要执行完所有事情,延时时,任务阻塞,在这期间低优先级也能执行,参数1是此时的系统节拍计数值,参数2是延时的时间ms

正常延时:delay_ms()

                只能高优先级打断低优先级延时,任务处于就绪态

多线程中好用的延时方法:(又延时又不会使程序阻塞在这)

#define DELAY_MS(n)  for(int i=0;i<n;i++){for(int j=0;j<48000;j++){}}

#define DELAY_US(n)  for(int i=0;i<n;i++){for(int j=0;j<48;j++){}}

延时实验

freertos_demo程序

//freertos_demo.c

#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"
#include "./MALLOC/malloc.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"

/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO      1
#define START_TASK_STACK_SIZE 128
TaskHandle_t  start_task_handler;
void start_task(void * pvParameters);

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
  */
  
#define TASK1_PRIO      2
#define TASK1_STACK_SIZE 128
TaskHandle_t  task1_handler;
 void task1(void* pv);
 
 /* TASK2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
  */
  
#define TASK2_PRIO      3
#define TASK2_STACK_SIZE 128
TaskHandle_t  task2_handler;
 void task2(void* pv);
/******************************************************************************************************/


/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    xTaskCreate((TaskFunction_t    )    start_task,         //创建开始任务
                (char*             )    "start_task", 
                (unsigned portSHORT)    START_TASK_STACK_SIZE, 
                (void *            )    NULL, 
                (portBASE_TYPE     )    START_TASK_PRIO, 
                (TaskHandle_t*     )    &start_task_handler );
    vTaskStartScheduler();
}

void start_task(void* pvPara)
{
    taskENTER_CRITICAL();         //进入临界区
    xTaskCreate((TaskFunction_t    )    task1,              //创建任务一
                (char*             )    "task1", 
                (unsigned portSHORT)    TASK1_STACK_SIZE, 
                (void *            )    NULL, 
                (portBASE_TYPE     )    TASK1_PRIO, 
                (TaskHandle_t*     )    &task1_handler );
                
    xTaskCreate((TaskFunction_t    )    task2,              //创建任务二
                (char*             )    "task2", 
                (unsigned portSHORT)    TASK2_STACK_SIZE, 
                (void *            )    NULL, 
                (portBASE_TYPE     )    TASK2_PRIO, 
                (TaskHandle_t*     )    &task2_handler );
                
    vTaskDelete(NULL);              //删除start_task任务
    taskEXIT_CRITICAL();            //退出临界区
}


//任务一 演示相对延时函数
void task1(void* pv)
{
    while(1)
    {
        LED0_TOGGLE();      //翻转LED0电平
        delay_ms(20);
        vTaskDelay(500);
    }
}

int key = 0;
//任务二 演示绝对延时函数
void task2(void* pv)
{
    TickType_t xLastWakeTime;               //定义时刻变量
    xLastWakeTime = xTaskGetTickCount();    //获取此时系统节拍计数值
    while(1)
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            LED1_TOGGLE();
            delay_ms(10);
            vTaskDelayUntil(&xLastWakeTime,500); //绝对延时周期,如果设的很小,就不会有延时效果,但也不会报错
        }
        vTaskDelay(10);
    }
}



//freertos_demo.h

#ifndef __FREERTOS_DEMO_H
#define __FREERTOS_DEMO_H

void freertos_demo(void);

#endif

 main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/SRAM/sram.h"
#include "./MALLOC/malloc.h"
#include "freertos_demo.h"
#include "./BSP/TIMER/btim.h"


int main(void)
{

    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
    delay_init(168);                    /* 延时初始化 */
    usart_init(115200);                 /* 串口初始化为115200 */
    led_init();                         /* 初始化LED */
    lcd_init();                         /* 初始化LCD */
    key_init();                         /* 初始化按键 */
    sram_init();                        /* SRAM初始化 */
    
    my_mem_init(SRAMIN);                /* 初始化内部SRAM内存池 */
    my_mem_init(SRAMEX);                /* 初始化外部SRAM内存池 */
    my_mem_init(SRAMCCM);               /* 初始化内部CCM内存池 */
    
    
    delay_ms(10000);                //串口反应迟钝,延时一段时间再发送信息,方便观察结果
    freertos_demo();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值