初体验
创建任务 分动态静态
任务管理 任务的状态4种状态
队列 消息队列 进程间通讯
信号量 优先级反转问题 ->解决优先级继承 迭代互斥量 获取几次就释放几次
事件组 某个事件发生后标志位置1 很多个标志位就是事件组
任务通知 可以替代信号量,消息队列
软件定时器
中断 设置为NVIC_PRIORITYGROUP_4 4字节全为抢占优先级
内存管理
API
所有的api加isr后表示在中断中使用,并不会立即执行,退出中断后执行。
任务创建
xTaskCreate((TaskFunction_t) master_task_main, /* 任务入口函数 */
“MASTER”, /* 任务名字 */
64*1024, /* 任务栈大小 */
NULL, ,/* 任务入口函数参数 */
TASK_PRIORITY_NORMAL, /* 任务的优先级 */
&task_master_handler); /* 任务控制块指针 */
void vTaskDelete( TaskHandle_t xTask );//xTask为被删除任务的句柄,为NULL表示删除当前任务。
任务管理
void vTaskSuspend( TaskHandle_t xTaskToSuspend ); 挂起任务
void vTaskResume( TaskHandle_txTaskToResume ); 恢复任务
相对延时
void vTaskDelay( portTickTypexTicksToDelay );延时时间总数
绝对延时 精准控制
void vTaskDelayUntil( portTickTypexTicksToDelay );
软件定时器
创建定时器
TimerHandle_t xTimerCreate
( const char * const pcTimerName,//软件定时器名字
const TickType_t xTimerPeriod,//软件定时器的周期
const UBaseType_t uxAutoReload,//设置为pdTRUE,那么软件定时器的工作模式就是周期模式;设为pdFALSE,则为单次模式
void * const pvTimerID,// 软件定时器ID
TimerCallbackFunction_t pxCallbackFunction );//软件定时器的回调函数
开始定时器
BaseType_t xTimerStart( TimerHandle_t xTimer, //要操作的软件定时器句柄
TickType_t xTicksToWait); // 用户指定的超时时间,单位为系统节拍周期(即 tick),如果在FreeRTOS调度器开启之前调用xTimerStart(),该形参将不起作用
停止定时器
BaseType_t xTimerStop( TimerHandle_t xTimer, //要操作的软件定时器句柄
TickType_t xBlockTime );//用户指定超时时间,单位为系统节拍周期(即tick)。
队列
QueueHandle_t xQueueCreate (UBaseType_t uxQueueLength,//长度
UBaseType_t uxItemSize); //每个队列项大小
portBASE_TYPE xQueueSend( xQueueHandle xQueue, //哪个队列
const void * pvItemToQueue, //存放的数据
portTickType xTicksToWait );//等待时间
portBASE_TYPE xQueueReceive( xQueueHandle xQueue, //哪个队列
void *pvBuffer, //读的数据
portTickType xTicksToWait );//等待时间
BaseType_t xQueuePeek( QueueHandle_t xQueue, //哪个队列
void *pvBuffer, //读的数据
TickType_t xTicksToWait); //等待时间
信号量
互斥量
xSemaphoreHandle xSemaphoreCreateMutex( void );
获取信号量
xSemaphoreTake(SemaphoreHandle_t xSemaphore, //信号量句柄
TickType_t xTicksToWait); //等待的时间
释放信号量
xSemaphoreGive(SemaphoreHandle_t xSemaphore );// 信号量释放成功返回pdTRUE,否则返回pdFALSE。
删除信号量
vSemaphoreDelete(SemaphoreHandle_t xSemaphore)
任务通知
1.BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t * pulPreviousNotificationValue);
xTaskToNotify 接收任务通知的任务
uxIndexToNotify 任务的指定通知(任务通知相关数组下标)
ulValue 通知值
eAction 通知方式
pulPreviousNotificationValue 用于获取发送通知前的通知值
2.xTaskNotifyGive( xTaskToNotify)
此函数用于往指定任务发送任务通知,通知方式为将通知值加1,并且不获取发送任务通 知前任务通知的通知值。
3.xTaskNotify( xTaskToNotify, ulValue, eAction)
此函数用于往指定任务发送任务通知,通知方式可以自由指定,并且不获取发送任务通知 前任务通知的通知值。
4.xTaskNotifyAndQuery()
5.ulTaskNotifyTake()
6.xTaskNotifyWait()
FreeRTOS 移植
1.FreeRTOS 内核源码
2.硬件支持文件 FreeRTOS/portable/RVDS
3.拷贝 FreeRTOSConfig.h 文件到 user 文件夹
okk 打住 后面还有一大堆教程
都2024年了,使用cubeide生成项目时,在中间件直接勾选FreeRTOS,会有警告
这样设置就可以了
还能图形化添加。