用HAL_GetTick()函数实现简单任务调用

HAL_GetTick() 是 STM32 HAL 库中的一个函数,用于获取一个自系统上电或复位以来递增的毫秒级时间戳。这个函数对于实现时间延迟、任务调度等功能非常有用。

一、scheduler.c文件

// 包含调度器头文件,定义了任务结构和调度器函数原型

#include "scheduler.h"

// 包含USART和GPIO头文件,这些头文件定义了与硬件相关的函数和宏

#include "usart.h"

#include "gpio.h"

// 定义全局变量,用于存储任务数量

uint8_t task_num;

// 定义UART1测试数据数组,包含要发送的字节序列

uint8_t uart1_test_data[] = {0xFE, 0x01, 0x02, 0x03};

// 定义LED闪烁任务函数

// 该函数检查GPIOB引脚5的状态,并在其状态改变时切换LED的状态

static void led_blink(void)

{

if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_RESET)

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // 如果引脚为低电平,则设置为高电平

else

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); // 如果引脚为高电平,则设置为低电平

}

// 定义UART1测试任务函数

// 该函数通过UART1发送预定义的数据数组

static void uart1_test(void)

{

HAL_UART_Transmit(&huart1, uart1_test_data, 4, 0xffff); // 发送4个字节的数据,超时设置为0xffff(即无限等待)

}

// 定义任务数组,包含两个任务:LED闪烁和UART1测试

// 每个任务都关联了一个函数指针、执行间隔(毫秒)和上次运行时间(由调度器初始化)

static scheduler_task_t scheduler_task[] =

{

{led_blink, 500, 0}, // LED闪烁任务,每500毫秒执行一次

{uart1_test, 100, 0} // UART1测试任务,每100毫秒执行一次

};

// 调度器初始化函数

// 计算任务数量,并初始化每个任务的上次运行时间为0(表示尚未运行)

void Scheduler_init(void)

{

task_num = sizeof(scheduler_task)/sizeof(scheduler_task_t); // 计算任务数组中的任务数量

}

// 调度器运行函数

// 遍历任务数组,检查每个任务是否应该运行(基于上次运行时间和执行间隔)

// 如果应该运行,则更新上次运行时间并调用任务函数

void Scheduler_run(void)

{

for(int i = 0; i < task_num; i++) // 遍历任务数组

{

uint32_t now_time = HAL_GetTick(); // 获取当前时间(毫秒级)

// 检查当前时间与上次运行时间的差值是否大于等于任务执行间隔

if(now_time-scheduler_task[i].last_run >= scheduler_task[i].rate_ms)

{

scheduler_task[i].last_run = now_time; // 更新上次运行时间为当前时间

scheduler_task[i].task_func(); // 调用任务函数

}

}

}

二scheduler. h文件

#ifndef SCHEDULER_H

#define SCHEDULER_H

#include "stm32f4xx.h"

typedef struct

{

void(*task_func)(void);

uint16_t rate_ms;

uint32_t last_run;

}scheduler_task_t;

void Scheduler_init(void);

void Scheduler_run(void);

#endif

三main. c文件

MX_GPIO_Init();

MX_USART1_UART_Init();

/* USER CODE BEGIN 2 */

Scheduler_init();

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

Scheduler_run();

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

相关推荐
悟空胆好小3 小时前
分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
网络·人工智能·科技·嵌入式硬件
Meraki.Zhang4 小时前
【STM32实践篇】:最小系统组成
stm32·单片机·嵌入式硬件·最小系统
Do vis8245 小时前
STM32第二十一天定时器TIM
stm32·单片机·嵌入式硬件
丁满与彭彭6 小时前
嵌入式学习笔记--MCU阶段--day03中断
笔记·单片机·学习
森焱森6 小时前
一文理解锂电池充电、过放修复与电量测量:从原理到实战
c语言·单片机·架构
逼子格7 小时前
滤波电路Multisim电路仿真实验汇总——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·硬件工程师真题·multisim电路仿真·滤波电路
熬夜的猪仔9 小时前
【Freertos实战】零基础制作基于stm32的物联网温湿度检测(教程非常简易)持续更新中.........
stm32·嵌入式硬件·物联网
景彡先生10 小时前
STM32中的RTC(实时时钟)详解
stm32·嵌入式硬件·实时音视频
EutoCool19 小时前
Qt:布局管理器Layout
开发语言·c++·windows·嵌入式硬件·qt·前端框架
网易独家音乐人Mike Zhou20 小时前
【Linux应用】开发板USB共享网络,网线或USB以太网共享网络(局域网连接PC和开发板,实现PC给开发板共享网络,USB通过NDIS驱动共享)
linux·网络·单片机·mcu·物联网·嵌入式·iot