相对延时: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();
}