FreeRTOS学习笔记

初体验

创建任务 分动态静态

任务管理 任务的状态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,会有警告

这样设置就可以了

还能图形化添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值