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、无法生成代码