HAL库配置FreeRTOS

HAL库配置

配置时钟源

1:修改HAL库定时器时钟源。 由于HAL库内部会使用systick定时器用于系统延时功能,而FreeRTOS也需要一个定时器用于操作系统内核调度的使用,顾需修改HAL库的时钟源。
在这里插入图片描述
由于用了TIM1作为HAL库的时钟源,所以会自动创建定时器中断的回调函数HAL_TIM_PeriodElapsedCallback(定时器中断回调函数就这么一个),所以我们如果想用定时器中断回调函数就直接用这个就行(在main.c中,如果在写一个,就会报错重复定义)

配置FreeRTOS内核功能

1)暂时只需配置动态内存空间和创建开始任务就行
2)其他的功能用到的时候再进行配置

1、配置动态内存空间
采用FreeRTOS动态内存分配,开发效率高,顾程序内存使用,多数采用动态内存分配方式,分配内存总空间为23K=23552byte。这里分配内存空间为40K,单位是byte,所以输入为40×1024=40960byte。heap:堆 1024
在这里插入图片描述
2、任务创建
1)任务优先级划分
2)任务堆栈划分,这样再加freertos内部的,40K刚够用
在这里插入图片描述
他默认创建了一个default任务,我们直接用这个当做第一个任务就行,他不是启动任务,配置16K的栈空间,这里是字,所以16k除以4再乘以1024=4096,所以1K就是256words
在这里插入图片描述
5:中断优先级分配
在这里插入图片描述
可供FreeRTOS掌握的中断为5到15。32里面数字越小优先级越高,系统里面数字越大优先级越高

Config parameters各项详解

在这里插入图片描述

1、kernel setting
在这里插入图片描述在这里插入图片描述
详细可以直接在cubemx中看到

参数名称参数说明
USE_PREEMPTION定义调度器模式,抢占式
TICK_RATE_HZ定义CPU主频,单位Hz。这个就是1ms
MAX_PRIORITIES定义可供用户使用的最大优先级数
MINIMAL_STACK_SIZE定义空闲任务的栈空间大小,单位字不是byte
MAX_TASK_NAME_LEN定义任务名最大字节数
USE_16_BIT_TICKS根据这个值的不同,系统时钟节拍计数TickType_t数据类型不同
IDLE_SHOULD_YIELD使能与空闲任务同优先级的任务
USE_MUTEXES使能互斥锁
USE_RECURSIVE_MUTEXES使能递归互斥锁
USE_COUNTING_SEMAPHORES使能计数信号量
QUEUE_REGISTRY_SIZE设置可以注册的信号量和消息队列的个数
USE_APPLICATION_TASK_TAG使能任务标记
ENABLE_BACKWARD_COMPATIBILITY使能新版本对老版本的兼容特性
USE_PORT_OPTIMISED_TASK_SELECTION此配置用于优化优先级列表中要执行的最高优先级任务的算法(也就是用于查找下一个要运行任务的方法)
USE_TICKLESS_IDLE配置用于使能tickless低功耗模式
USE_TASK_NOTIFICATIONS使能任务间直接的消息传递,包括信号量,事件标志组和消息邮箱

问题汇总

1:当我们需要调整他的优先级大于FreeRTOS 所能控制的时候,可以取消Uses FreeRTOS function,在这里越小中断优先级级别越高
在这里插入图片描述
2:队列中,发送地址时,地址都是4字节的,也就是要用uint32_t
( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );

3:我们初始化什么要放在osKernelStart之前,因为他当他成功开启调度的时候就不会再回到main函数中了,就在任务之间来回切换在这里插入图片描述
3:队列直接发送一串数据的时候可以直接更改代码这个

  osMessageQDef(message, 3, uint8_t[30]);
  messageHandle = osMessageCreate(osMessageQ(message), NULL);

4:使用定时器,接收队列数据时,定时器无法使用。注意开启定时器中断的位置,需要在MX_FREERTOS_Init,初始化之后

  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init();
	HAL_TIM_Base_Start_IT(&htim6);//开启定时器
  /* Start scheduler */
  osKernelStart();

5、CubeMX无法创建事件标志组,选择接口为V2就行了
在这里插入图片描述

6、无法生成代码
在这里插入图片描述

### 如何在FreeRTOS中使用HAL #### HALFreeRTOS简介 当学习过Linux后再接触FreeRTOS,能够从更高维度理解单片机HAL开发以及FreeRTOS作为轻量级操作系统的作用[^1]。HAL(Hardware Abstraction Layer)提供了一套标准化接口用于访问底层硬件资源,而FreeRTOS则负责管理多个任务之间的执行顺序。 #### 配置环境 为了使两者协同工作,在项目配置阶段需确保正确设置了编译选项和支持文件。这通常涉及设置合适的中断优先级、堆栈大小以及其他必要的参数调整以适应具体应用场景需求。 #### 使用延时函数 值得注意的是,在FreeRTOS环境中不应直接调用`HAL_Delay()`或其他类似的阻塞型延迟函数;相反,应该采用像`vTaskDelay()`这样的非阻塞方式来实现时间上的等待效果[^2]。这样做可以防止当前线程长时间占用CPU而导致其他重要操作被延误处理。 #### UART通信示例 下面给出一段简单的UART发送数据的例子,展示了如何安全地结合这两者: ```c // 初始化串口并创建一个新任务 void StartUartTask(void const * argument){ // 初始化USART外设 MX_USART1_UART_Init(); while (1) { char message[] = "Hello from FreeRTOS!\r\n"; // 发送消息给指定端口 HAL_StatusTypeDef status; do{ status = HAL_UART_Transmit(&huart1, (uint8_t*)message,strlen(message), 10); if(status != HAL_OK){ // 如果传输失败,则稍作暂停再重试 vTaskDelay(pdMS_TO_TICKS(1)); } }while(status!=HAL_OK); // 完成一次循环后休眠一段时间 vTaskDelay(pdMS_TO_TICKS(1000)); } } int main(){ // 系统初始化... // 创建上述定义的任务实例 xTaskCreate( StartUartTask, "uart_task", configMINIMAL_STACK_SIZE + 128, NULL, tskIDLE_PRIORITY + 1, NULL ); // 启动调度器 vTaskStartScheduler(); for (;;); // 不应到达这里 } ``` 此代码片段说明了在一个持续运行的任务里通过UART向外设备发送字符串的过程,并利用`vTaskDelay()`实现了周期性的重复动作而不干扰系统的正常运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值