freertos基础
0 配置
FreeRTOS的系统配置文件为 FreeRTOSConfig.h,在此配置文件中可以完成 FreeRTOS的裁剪和配置。
使用“ INCLUDE_”开头的宏用来表示使能或除能FreeRTOS中相应的 API函数, 作用就是用来配置 FreeRTOS中的可选 API函数的。
CONFIG开始的宏用来配置系统参数:
configTICK_RATE_HZ:设置FreeRTOS的系统时钟节拍频率,单位为 HZ。
此频率就是滴答定时器的中断频率,需要使用此宏来配置滴答定时器的中断,一般将此宏设置为1000,周期就是1ms。
configUSE_PREEMPTION为1时使用抢占式调度器,为 0时使用协程 。
如果使用抢占式调度器的话内核会在每个时钟节拍中断中进行任务切换。
当使用协程的话会在如下地方进行任务切换:一个任务调用了函数 taskYIELD(); 一个任务调用了可以使任务进入阻塞态的 API函数;应用程序明确定义了在中断中执行上下文切换。
configUSE_TIME_SLICING:默认情况下,FreeRTOS使用 抢占式 调度器,这意味着调度器永远都在执行已经就绪了的最高优先级任务, 优先级相同的任务在时钟节拍中断中进行切换。
当宏 configUSE_TIME_SLICING为 0的时候不会在时钟节拍中断中执行相同优先级任务的任务切换,默认情况下宏configUSE_TIME_SLICING为 1。
configIDLE_SHOULD_YIELD:此宏定义了与空闲任务(idle Task)处于同等优先级的其他用户任务的行为。
当为0 的时候空闲任务不会为其他处于同优先级的任务让出CPU 使用权。
当为1 的时候空闲任务就会为处于同等优先级的用户任务让出CPU 使用权,除非没有就绪的用户任务,这样花费在空闲任务上的时间就会很少。
1 任务
void ATaskFunction( void *pvParameters ); portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask ); void vTaskDelay( portTickType xTicksToDelay ); void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement ); void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ); unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask ); void vTaskDelete( xTaskHandle pxTaskToDelete );
2 队列
xQueueHandle xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ); portBASE_TYPE xQueueSendToFront( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait ); portBASE_TYPE xQueueSendToBack( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait ); portBASE_TYPE xQueueReceive( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait ); portBASE_TYPE xQueuePeek( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait );
3 中断
xSemaphoreHandle void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore ); portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait ); portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken );
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle xQueue, void *pvItemToQueue port, BASE_TYPE *pxHigherPriorityTaskWoken ); portBASE_TYPE xQueueSendToBackFromISR( xQueueHandle xQueue, void *pvItemToQueue port, BASE_TYPE *pxHigherPriorityTaskWoken );
4 资源管理
5 内存管理
6 错误排查
- 在 FreeRTOSConfig.h 中把 configCHECK_FOR_STACK_OVERFLOW 设为 1 或 2。
- 提供钩子函数的具体实现 void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );
7. 时间
// portTICK_RATE_MS 用来将以毫秒为单位的时间值转换为以心跳周期为单位的时间值。 // vTaskDelay( 250 / portTICK_RATE_MS ); 延迟250ms // #define portTICK_RATE_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) // 1 tick/ms // configTICK_RATE_HZ其含义是1秒钟TICK中断产生的次数 // #define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
8. eventGroup
#include “FreeRTOS.h” #include “event_groups.h” EventGroupHandle_t xEventGroupCreate( void ); EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ); void vEventGroupDelete( EventGroupHandle_t xEventGroup ); EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup ); EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ); EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ); EventBits_t xEventGroupWaitBits( const EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait );