Files
HBshuiwuConcentrator/notebook/freeRTOS_note.txt
2025-12-15 16:07:49 +08:00

262 lines
8.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
1、BaseType_t xTaskAbortDelay( TaskHandle_t xTask ); 主要用来强制将一个阻塞的进程进入运行模式,
2、BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,TickType_t * const pxTicksToWait ); 神奇的功能,
配合 vTaskSetTimeOutState( &xTimeOut );
主要用来处理在一个确定延时等待过程中,反复进入和退出等待过程,用来精确校准总的延时时间使用,例子
size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes )
{
size_t uxReceived = 0;
TickType_t xTicksToWait = MAX_TIME_TO_WAIT;
TimeOut_t xTimeOut;
vTaskSetTimeOutState( &xTimeOut );
while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes )
{
if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE )
{
break;
}
ulTaskNotifyTake( pdTRUE, xTicksToWait );
}
uxReceived = UART_read_from_receive_buffer( pxUARTInstance, pucBuffer, uxWantedBytes );
return uxReceived;
}
此例子实现总的等待时间 MAX_TIME_TO_WAIT 当接收的字节总数没有达到要求时uxWantedBytes ,进入等待过程,当有新数据接收成功,退出等待,检测是否满足接收条件,知道满足接收条件,或者接收超时,完成整个过程。
3、xTaskCreateStatic() 创建任务时由程序员指定任务的堆栈空间,不由系统自动分配
4、void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, TickType_t xTimeIncrement );
void vTaskDelay( TickType_t xTicksToDelay );
vTaskDelayUntil 与 vTaskDelay的主要区别在于计数的起始时间不一样vTaskDelay是从调用时算开始时间vTaskDelayUntil是*pxPreviousWakeTime的值人为指定的开始时间。
5、 vTaskDelete() 删除任务
6、taskDISABLE_INTERRUPTS()
如果使用了configMAX_SYSCALL_INTERRUPT_PRIORITY/configMAX_API_CALL_INTERRUPT_PRIORITY,那么调用taskDISABLE_INTERRUPTS()将使低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 优先级的中断无效,高于此优先级的中断不受影响。
如果不使用configMAX_SYSCALL_INTERRUPT_PRIORITY/configMAX_API_CALL_INTERRUPT_PRIORITY,那么调用taskDISABLE_INTERRUPTS()将使所有的中断无效。
taskDISABLE_INTERRUPTS() and taskENABLE_INTERRUPTS() 不支持嵌套例如两次执行taskDISABLE_INTERRUPTS() 只需要执行一次taskENABLE_INTERRUPTS() 就可使能所有中断。若要支持嵌套需要使用taskENTER_CRITICAL() and taskEXIT_CRITICAL()替代。
7、void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxTagValue );给任务分配一个标记号
TaskHookFunction_t pxTagValue 可以是一个钩子函数指针可配合xTaskCallApplicationTaskHook函数使用调用任务钩子函数
要使用 vTaskSetApplicationTaskTag configUSE_APPLICATION_TASK_TAG 必须为1
static BaseType_t prvExampleTaskHook( void * pvParameter )
{
return 0;
}
void vAnotherTask( void *pvParameters )
{
vTaskSetApplicationTaskTag( NULL, prvExampleTaskHook );
for( ;; )
{
}
}
/* [As an example use of the hook (callback)] Define the traceTASK_SWITCHED_OUT()
macro to call the hook function. The kernel will then automatically call the task
hook each time the task is switched out. This technique can be used to generate
an execution trace. pxCurrentTCB references the currently executing task. */
#define traceTASK_SWITCHED_OUT() xTaskCallApplicationTaskHook( pxCurrentTCB, 0 )
8、vTaskSetThreadLocalStoragePointer() 为每个任务设置独立的存储空间,存储数据
configNUM_THREAD_LOCAL_STORAGE_POINTERS 存储空间大小受这个宏控制
9、void vTaskStepTick( TickType_t xTicksToJump );低功耗相关 use tickless idle functionality
configUSE_TICKLESS_IDLE = 1 只有 systick 中断无效只有idle task才能运行
portSUPPRESS_TICKS_AND_SLEEP() 从例子上来看实现的功能为关闭系统时钟停止内核运行在宏定义函数内部使用vTaskStepTick实现恢复后对时钟变量的补偿或者说重新设置系统时间。
10、vTaskSuspend() 挂起任务,一个任务被挂起后,只有通过 vTaskResume才能重新进入运行状态
FreeRTOS version 6.1.0 以后版本vTaskSuspend操作可以在 Scheduler 开始之前调用。
11、vTaskSuspendAll禁止调度器工作但不影响中断调度器禁止工作的过程中不允许调用系统API函数
xTaskResumeAll() 恢复调度器工作,此功能嵌套工作。
12、taskYIELD() 用于时间片轮工作,在任务优先级相同的任务中,放弃自身的运行,让别的任务运行
xQueueCreateSet() 非常复杂的一个过程,
#define QUEUE_LENGTH_1 10
#define QUEUE_LENGTH_2 10
#define BINARY_SEMAPHORE_LENGTH 1
#define ITEM_SIZE_QUEUE_1 sizeof( uint32_t )
#define ITEM_SIZE_QUEUE_2 sizeof( something_else_t )
#define COMBINED_LENGTH ( QUEUE_LENGTH_1 + QUEUE_LENGTH_2 + BINARY_SEMAPHORE_LENGTH )
void vAFunction( void )
{
static QueueSetHandle_t xQueueSet;
QueueHandle_t xQueue1, xQueue2, xSemaphore;
QueueSetMemberHandle_t xActivatedMember;
uint32_t xReceivedFromQueue1;
something_else_t xReceivedFromQueue2;
xQueueSet = xQueueCreateSet( COMBINED_LENGTH );
xQueue1 = xQueueCreate( QUEUE_LENGTH_1, ITEM_SIZE_QUEUE_1 );
xQueue2 = xQueueCreate( QUEUE_LENGTH_2, ITEM_SIZE_QUEUE_2 );
xSemaphore = xSemaphoreCreateBinary();
xSemaphoreTake( xSemaphore, 0 );
xQueueAddToSet( xQueue1, xQueueSet );
xQueueAddToSet( xQueue2, xQueueSet );
xQueueAddToSet( xSemaphore, xQueueSet );
for( ;; )
{
xActivatedMember = xQueueSelectFromSet( xQueueSet, pdMS_TO_TICKS( 200 ) );
if( xActivatedMember == xQueue1 )
{
xQueueReceive( xActivatedMember, &xReceivedFromQueue1, 0 );
vProcessValueFromQueue1( xReceivedFromQueue1 );
}
else if( xActivatedQueue == xQueue2 )
{
xQueueReceive( xActivatedMember, &xReceivedFromQueue2, 0 );
vProcessValueFromQueue2( &xReceivedFromQueue2 );
}
else if( xActivatedQueue == xSemaphore )
{
xSemaphoreTake( xActivatedMember, 0 );
vProcessEventNotifiedBySemaphore();
break;
}
else
{
}
}
}
13、vQueueDelete() 主要用法,创建队列不成功,删除队列
int main( void )
{
QueueHandle_t xQueue;
xQueue = xQueueCreate( QUEUE_LENGTH, QUEUE_ITEM_SIZE );
if( xQueue == NULL )
{
}
else
{
vQueueDelete( xQueue );
}
}
14、UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );查询队列中有多少条目,返回值为对列中条目数
15、BaseType_t xQueueOverwrite( QueueHandle_t xQueue, const void *pvItemToQueue ); 奇怪的应用,
xQueue 必须队列深度为1对列不是满就是空
16、xQueueReset复位对列清空对列中内容
17、 xQueueSend() = xQueueSendToBack()
18、uxQueueSpacesAvailable获取对列空闲条目数
19、vSemaphoreCreateBinary是老版本的为了向后兼容性现在存在应该使用 xSemaphoreCreateBinary替换
20、xSemaphoreCreateCounting创建多值得信号量
21、xSemaphoreCreateMutex创建互斥信号量
22、xSemaphoreCreateRecursiveMutex创建递归的互斥信号量
23、xSemaphoreGetMutexHolder获取使用信号量的任务的句柄
24、xTimerGetExpiryTime获取定时器到时的时间
25、pcTimerGetName获取定时器名称
26、xTimerGetPeriod获取定时器周期
27、pvTimerGetTimerID获取定时器ID,主要用于多个定时器使用同一个回调函数,判断输入参数 ID
28、xTimerIsTimerActive判断定时器是否在工作
29、xTimerPendFunctionCall用于回调函数的应用基本不许人为参与
30、xTimerReset若定时器不运行调用后定时器重新运行定时器不能在调度器之前运行
If xTimerReset() is called before the scheduler is started, then the timer will not start running
until the scheduler has been started, and the timers expiry time will be relative to when the
scheduler started.
31、xEventGroupCreate
The number of event bits in an event group is dependent on the configUSE_16_BIT_TICKS
compile time configuration constant within FreeRTOSConfig.h1:
? If configUSE_16_BIT_TICKS is 1, then each event group contains 8 usable event bits.
? If configUSE_16_BIT_TICKS is 0, then each event group contains 24 usable event bits.
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet,
const EventBits_t uxBitsToWaitFor,
TickType_t xTicksToWait );
此函数实现功能为,首先人为设置 event_group中 uxBitsToSet 位置为1然后等待 uxBitsToWaitFor位置的事件发生
EventBits_t xEventGroupWaitBits( const EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait );
此函数实现功能为 等待uxBitsToWaitFor事件xWaitForAllBits,决定是否等待全部事件发生还是等待uxBitsToWaitFor位置事件发生
xEventGroupSync(), xEventGroupWaitBits() 两个函数的功能很接近,稍有差别
32、 configCHECK_FOR_STACK_OVERFLOW 任务堆栈溢出检测
33、configCPU_CLOCK_HZ
34、configTICK_RATE_HZ 设置系统时钟中断频率
35、configTIMER_QUEUE_LENGTH 定时器命令处理对列的深度,即能保存未处理的命令的数量
36、configTOTAL_HEAP_SIZE 设置系统使用的堆栈大小,系统是静态分配时,使用 heap1.c heap2.c heap4.c
37、configUSE_16_BIT_TICKS = 0 TickType_t 为16 bits 数据类型 configUSE_16_BIT_TICKS = 1TickType_t 为32 bits 数据类型
37、configUSE_COUNTING_SEMAPHORES 允许创建多值信号量
38、configUSE_MUTEXES 允许创建互斥信号量
INCLUDE_uxTaskGetStackHighWaterMark == 1 prvTaskCheckFreeStackSpace() 可以用来读取单个任务使用过程中最少的剩余空间
xPortGetFreeHeapSize() 可以用来统计总堆栈剩余空间