FreeRTOS学习笔记:
1.任务创建函数(动态):
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, //任务名字
const configSTACK_DEPTH_TYPE usStackDepth,//为该任务分配的栈大小
void * const pvParameters,//任务函数的参数
UBaseType_t uxPriority,//任务优先级
TaskHandle_t * const pxCreatedTask )//任务句柄
2.开启任务调度器函数:
void vTaskStartScheduler( void );
3.相对延时函数:
void vTaskDelay( const TickType_t xTicksToDelay );//单位:系统时钟节拍周期
调用之后,任务会在调用处进入阻塞状态,经过指定系统时钟节拍之后,解除阻塞
4.绝对延时函数:
#define vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement )
5.创建任务(静态):
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,//任务函数
const char * const pcName, //任务名字
const uint32_t ulStackDepth,//任务栈大小(对于stm32为32位)
void * const pvParameters,//任务函数参数
UBaseType_t uxPriority,//任务优先级
StackType_t * const puxStackBuffer,//为该任务静态分配的内存指针(大小要和参数三匹配)
StaticTask_t * const pxTaskBuffer )//任务句柄
此函数使能需要两个条件
- 开启configSUPPORT_STATIC_ALLOCATION宏
- 实现vApplicationGetIdleTaskMemory函数,实现如下:
#if configSUPPORT_STATIC_ALLOCATION==1
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{
*ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
*ppxIdleTaskStackBuffer = &xIdleStack[0];
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
#endif
6.挂起任务:
void vTaskSuspend( TaskHandle_t xTaskToSuspend )
7.恢复任务:
void vTaskResume( TaskHandle_t xTaskToResume )
8.在中断函数中恢复任务:
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )
返回值:
pdTRUE:恢复后,需要进行任务切换(手动切换!)
pdFALSE:恢复后,不需要进行任务切换
当恢复后,正在执行的任务优先级小于被恢复的任务,被恢复的任务抢占正在执行的任务,发生任务切换
freertos规定:
如果要在中断服务函数里面调用freertos的API函数,必须保证中断优先级低于freertos所管理的最高优先级
9.关闭中断与打开中断:
portDISABLE_INTERRUPTS();//关闭中断
portENABLE_INTERRUPTS();//打开中断
注意:
这两个函数只能用于控制freertos控制范围之内的中断,即优先级在宏configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY与configLIBRARY_LOWEST_INTERRUPT_PRIORITY之间的中断
10.任务调度器的挂起与恢复:
注意:
挂起任务调度器不会关闭中断,只是禁止任务切换而已,而进入临界区会禁止中断和任务切换
函数原型:
void vTaskSuspendAll( void );//挂起任务调度器
BaseType_t xTaskResumeAll( void );//恢复任务调度器
使用示例:
vTaskSuspendAll();//挂起任务调度器
{
......//内容
}
xAlreadyYielded = xTaskResumeAll();//恢复任务调度器
挂起任务调度器之后,执行内容部分,不会切换任务,但是会被中断打断
注意与临界区区分,临界区的代码既不会切换任务,也不会被中断打断
11.临界区:
(1)任务级临界区代码保护
taskENTER_CRITICAL();
{
....../*临界区*/
}
taskEXIT_CRITICAL();
(2)中断级临界区代码保护
uint32_t save_status;
save_status = taskENTER_CRITICAL_FROM_ISR();//将中断状态保存在save_status变量中
{
....

本文详细介绍了FreeRTOS操作系统的关键功能,包括任务创建与调度、任务延时、中断处理、任务挂起与恢复、任务状态查询、队列操作、信号量机制、队列集、事件标志组、任务通知以及软件定时器的使用。此外,还提到了低功耗模式和内存管理的相关内容。
最低0.47元/天 解锁文章
1142

被折叠的 条评论
为什么被折叠?



