FreeRTOS V9.0.0 API 函数中文手册
参阅《FreeRTOS_Reference_Manual_V9.0.0》
Real Time Engineers ltd.
翻译:张振
2017 年 12 月
FreeRTOS V9.0.0 API 中文手册 张振译
2017 年12 月17 日
目录
第一章 初识 FreeRTOS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5
第二章 任务和调度器 API 函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6
2.1 portSWITCH_TO_USER_MODE() -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -6
2.2 vTaskAllocateMPURegions() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -6
2.3 xTaskAbortDelay() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -6
2.4 xTaskCallApplicationTaskHook() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -7
2.5 xTaskCheckForTimeOut() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -7
2.6 xTaskCreate() -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -7
2.7 xTaskCreateStatic() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - -8
2.8 xTaskCreateRestricted() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - -9
2.9 vTaskDelay() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - 10
2.10 vTaskDelayUntil() - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -10
2.11 vTaskDelete() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -11
2.12 taskDISABLE_INTERRUPTS() - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - -- - - - -11
2.13 taskENABLE_INTERRUPTS() - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -11
2.14 taskENTER_CRITICAL() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11
2.15 taskENTER_CRITICAL_FROM_ISR() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -12
2.16 taskEXIT_CRITICAL() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - 13
2.17 taskEXIT_CRITICAL_FROM_ISR() - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - -13
2.18 xTaskGetApplicationTaskTag() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - -- - - - -13
2.19 xTaskGetCurrentTaskHandle() - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - 14
2.20 xTaskGetIdleTaskHandle() - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - 14
2.21 xTaskGetHandle() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - -14
2.22 uxTaskGetNumberOfTasks() - - - - - - - - - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - 15
2.23 vTaskGetRunTimeStats() - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - 15
2.24 xTaskGetSchedulerState() - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - -- - - - - - - 17
2.25 uxTaskGetStackHighWaterMark() - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - 17
2.26 eTaskGetState() - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - -17
2.27 uxTaskGetSystemState() - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -18
2.28 vTaskGetTaskInfo() - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -18
2.29 pvTaskGetThreadLocalStoragePointer() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -19
2.30 pcTaskGetName() - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --19
2.31 xTaskGetTickCount() - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -19
2.32 xTaskGetTickCountFromISR() - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - 20
2.33 vTaskList() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 20
2.34 xTaskNotify() - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - -21
2.35 xTaskNotifyAndQuery() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 22
2.36 xTaskNotifyAndQueryFromISR() - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - 22
2.37 xTaskNotifyFromISR() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 23
2.38 xTaskNotifyGive() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 23
2.39 vTaskNotifyGiveFromISR() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- 24
2.40 xTaskNotifyStateClear() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 25
1
FreeRTOS V9.0.0 API 中文手册 张振译
2017 年12 月17 日
2.41 ulTaskNotifyTake() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 26
2.42 xTaskNotifyWait() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -27
2.43 uxTaskPriorityGet() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -28
2.44 vTaskPrioritySet() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -29
2.45 vTaskResume() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -30
2.46 xTaskResumeAll() -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -30
2.47 xTaskResumeFromISR() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 31
2.48 vTaskSetApplicationTaskTag() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 32
2.49 vTaskSetThreadLocalStoragePointer() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 33
2.50 vTaskSetTimeOutState() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -33
2.51 vTaskStartScheduler() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 34
2.52 vTaskStepTick() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 35
2.53 vTaskSuspend() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - -36
2.54 vTaskSuspendAll() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 36
2.55 taskYIELD() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 37
第三章 队列 API 函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - 39
3.1 vQueueAddToRegistry() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 39
3.2 xQueueAddToSet() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -39
3.3 xQueueCreate() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 40
3.4 xQueueCreateSet() - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 40
3.5 xQueueCreateStatic() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 42
3.6 vQueueDelete() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 43
3.7 pcQueueGetName() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 43
3.8 xQueueIsQueueEmptyFromISR() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -44
3.9 xQueueIsQueueFullFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - 44
3.10 uxQueueMessagesWaiting() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - 44
3.11 uxQueueMessagesWaitingFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - -44
3.12 xQueueOverwrite() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - 45
3.13 xQueueOverwriteFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -46
3.14 xQueuePeek() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - -47
3.15 xQueuePeekFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - 48
3.16 xQueueReceive() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - 48
3.17 xQueueReceiveFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - -49
3.18 xQueueRemoveFromSet() -- - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - -50
3.19 xQueueReset() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - 51
3.20 xQueueSelectFromSet() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - -51
3.21 xQueueSelectFromSetFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - 51
3.22 xQueueSend()/xQueueSendToFront()/xQueueSendToBack() - - - - -- - - - - - - - - - - -52
3.23 xQueueSendFromISR()/xQueueSendToBackFromISR()/xQueueSendToFrontFromISR()
- - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 53
3.24 uxQueueSpacesAvailable() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -54
第四章 信号量 API 函数 - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - -55
4.1 vSemaphoreCreateBinary() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - 55
4.2 xSemaphoreCreateBinary() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - 55
2
FreeRTOS V9.0.0 API 中文手册 张振译
2017 年12 月17 日
4.3 xSemaphoreCreateBinaryStatic() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - -56
4.4 xSemaphoreCreateCounting() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -56
4.5 xSemaphoreCreateCountingStatic() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - -57
4.6 xSemaphoreCreateMutex() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -58
4.7 xSemaphoreCreateMutexStatic() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - -58
4.8 xSemaphoreCreateRecursiveMutex() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - -59
4.9 xSemaphoreCreateRecursiveMutexStatic() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - -60
4.10 vSemaphoreDelete() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - 60
4.11 uxSemaphoreGetCount() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - 60
4.12 xSemaphoreGetMutexHolder() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - -60
4.13 xSemaphoreGive() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - 60
4.14 xSemaphoreGiveFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -61
4.15 xSemaphoreGiveRecursive() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - 62
4.16 xSemaphoreTake() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - 63
4.17 xSemaphoreTakeFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -64
4.18 xSemaphoreTakeRecursive() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -64
第五章 软件定时器 API 函数 - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - 66
5.1 xTimerChangePeriod() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - -66
5.2 xTimerChangePeriodFromISR() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - -67
5.3 xTimerCreate() - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - -67
5.4 xTimerCreateStatic() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - -69
5.5 xTimerDelete() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - - - - - -70
5.6 xTimerGetExpiryTime() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - -71
5.7 pcTimerGetName() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - - - 71
5.8 xTimerGetPeriod() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -71
5.9 xTimerGetTimerDaemonTaskHandle() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - --71
5.10 pvTimerGetTimerID() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - 72
5.11 xTimerIsTimerActive() - - - - - - - - - - - - - - - - - - - -- - - - -- - - - - - - -- - - - - - - - - -72
5.12 xTimerPendFunctionCall() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - -- - -72
5.13 xTimerPendFunctionCallFromISR() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - -73
5.14 xTimerReset() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - - - - - 74
5.15 xTimerResetFromISR() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - -75
5.16 vTimerSetTimerID() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - -76
5.17 xTimerStart() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - - - - - -76
5.18 xTimerStartFromISR() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - 76
5.19 xTimerStop() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - - - - - -77
5.20 xTimerStopFromISR() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - 77
第六章 事件组 API 函数 - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - -79
6.1 xEventGroupClearBits() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - 79
6.2 xEventGroupClearBitsFromISR() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - 79
6.3 xEventGroupCreate() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - 80
6.4 xEventGroupCreateStatic() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - 81
6.5 vEventGroupDelete() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - 81
6.6 xEventGroupGetBits() - - - - - - - - - - - - - - - - - - - -- - - - - -- - - - - - - - - - - -- - - - - -81
3
FreeRTOS V9.0.0 API 中文手册 张振译
2017 年12 月17 日
6.7 xEventGroupGetBitsFromISR() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -81
6.8 xEventGroupSetBits() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - -82
6.9 xEventGroupSetBitsFromISR() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -82
6.10 xEventGroupSync() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - - - - 83
6.11 xEventGroupWaitBits() - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - -85
第七章 FreeRTOS 内核配置 - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - - -87
7.1 FreeRTOSConfig.h 头文件 - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - -87
7.2 以“INCLUDE_”开头的常量 - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - -87
7.3 以“config”开头的常量 - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - -- - - 87
4
FreeRTOS V9.0.0 API 中文手册 张振译
2017 年12 月17 日
第一章 初识 FreeRTOS
基本概念:
User mode:用户模式(又叫非特权模式);
Supervisor mode:管理模式(亦叫特权模式)。
FreeRTOS API 函数限制条件
1. 不是以“From ISR”结尾的 API 函数禁止在中断服务中调用;即使一些以“From
ISR ” 结 尾 的 API 函 数 , 当 中 断 服 务 的 优 先 级 高 于
configMAX_SYSCALL_INTERRUPT_PRIORITY(
或
configMAX_API_CALL_INTERRUPT_PRIORITY)时,也不能在中断服务中调用。
2. 当调度器被挂起时,可能导致上下文切换的 API 函数禁止被调用。
3. 可能导致上下文切换的 API 函数禁止从临界区调用。
5
FreeRTOS V9.0.0 API 中文手册 张振译
2017 年12 月17 日
第二章 任务和调度器 API 函数
调用本章 API 函数需要添加头文件:
#include “FreeRTOS.h”
#include “task.h”
2.1 void portSWITCH_TO_USER_MODE( void )
此函数仅针对高级用户,且仅与 FreeRTOS MPU 端口相关。MPU 限制任务
是由 xTaskCreateRestricted()创建的,xTaskCreateRestricted()的参数决定正在创建
的任务是否是一个用户(非特权)模式任务,或者是一个管理员(特权)模式任务。
一个管理模式任务调用 portSWITCH_TO_USER_MODE( )将其从一个管理模式
任务转换为一个用户模式的任务;却没有与此对等的函数(允许一个任务将自己
由用户模式转换为管理模式)。
2.2 Void vTaskAllocateMPURegions(TaskHandle_t xTaskToModify,const
MemoryRegion_t * const xRegions )
定义一组内存保护单元(MPU)区域,供 MPU 受限任务使用。此函数仅针对
高级用户,且仅与 FreeRTOS MPU 端口相关。当使用 xTaskCreateRestricted()创
建任务完成,MPU 控制的内存区域可以被分配到 MPU 受限的任务中。在使用
vTaskAllocateMPURegions()函数运行时,这些区域可以被重新定义(或分配)。
参数:
xTaskToModify,将被更改的受限任务句柄。任务句柄是通过 xTaskCreateRestricted()
函数的 pxCreatedTask 参数获得的。任务可以使用 NULL(空)任务句柄替代原来有
效的任务句柄来更改自己内存区域访问的定义。
xRegions,MemoryRegion_t 结构体类型数组。数组中位置对应的数是通过常量
portNUM_CONFIGURABLE_REGIONS 定 义 的 。 Cortex-M3 内 核 的
portNUM_CONFIGURABLE_REGIONS 被 定 义 为 3. 数 组 中 的 每 个
MemoryRegion_t 结构都根据 xTaskToModify 参数定义了一个 MPU 内存供任务使
用。
MemoryRegion_t 结构体
ulParameters 定义了访问内存区域的方式,ulParameters 可以按位取或下列变量的
值:portMPU_REGION_READ_WRITE
portMPU_REGION_PRIVILEGED_READ_ONLY
portMPU_REGION_READ_ONLY
portMPU_REGION_PRIVILEGED_READ_WRITE
portMPU_REGION_CACHEABLE_BUFFERABLE
portMPU_REGION_EXECUTE_NEVER
2.3 BaseType_t xTaskAbortDelay( TaskHandle_t xTask )
调用包含超时参数的 API 函数可以导致调用任务进入阻塞状态。在阻塞状
态下的任务要么是等待超时时间的结束,要么等待事件发生的超时,之后任务将
6
FreeRTOS V9.0.0 API 中文手册 张振译
2017 年12 月17 日
自动离开阻塞状态并进入就绪状态。有许多这种情况,如:
如果任务调用 vTaskDelay(),那么它将进入阻塞状态。直到指定的超时时间到,
任务将自动离开阻塞状态并进入就绪状态。
如果任务调用 ulTaskNotifyTake(),当它的通知值为 0,将进入阻塞状态,直到接收
到一个通知值或者是超时时间到,函数将自动离开阻塞状态进入就绪状态。
xTaskAbortDelay()将任务从阻塞状态转变到就绪状态。
调度器不能调用处于阻塞状态的任务,处于阻塞状态的任务也不会占用 CPU
的任何处理时间。
参数:xTask,需要中止延时的任务句柄。
返回值:如果 xTask 任务退出阻塞状态,返回 pdPASS;如果 xTask 任务没有退出
阻塞状态(因为它之前是非阻塞状态),返回 pdFAIL。
注 意 : 在 FreeRTOSConfig.h 中 将 INCLUDE_xTaskAbortDelay 设 为 1 时 ,
xTaskAbortDelay()函数才是可得的。
2.4 BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void
*pvParameters )
此函数仅针对高级用户。vTaskSetApplicationTaskTag()函数用来给任务分配一个
‘tag’值;‘tag’值的意义和使用由应用程序作者自己定义。FreeRTOS 内核正常情况
下不会访问这个‘tag’值。在特殊情况,使用‘tag’值将‘task hook’(或回调函数)
与 一 个 任 务 进 行 关 联 。 这 样 做 时 , 钩 子 函 数 被 调 用 通 过 使 用
xTaskCallApplicationTaskHook()函数。任务钩子函数可用于任何目的。
注意:在 FreeRTOSConfig.h 中将 configUSE_APPLICATION_TASK_TAG 设为 1 时,
xTaskCallApplicationTaskHook()函数才是可得的。
参数:
xTask,任务句柄。一个任务可以使用 NULL 句柄替换原来的有效句柄来调用该
任务自己的钩子函数。
pvParameters,它作为任务钩子函数自己的参数。
2.5 BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,
TickType_t * const pxTicksToWait )
此函数仅针对高级用户。xTaskCheckForTimeOut()与 vTaskSetTimeOutState()
一 起 使 用 ; 使 用 vTaskSetTimeOutState() 函 数 设 置 初 始 条 件 , 之 后 在 调 用
xTaskCheckForTimeOut()函数判断超时条件,如果没有发生超时则调整剩余块时
间。
参数:
pxTimeOut,该参数可以用 vTaskSetTimeOutState()初始化。
pxTicksToWait,用于传递经过调整后的块时间(已经扣除在阻塞状态中消耗的时
间后剩余的时间)。
返回值:如果返回 pdTRUE,说明没有块时间剩余,已经发生超时;如果返回
pdFALSE,说明有块时间剩余,还没有发生超时。
2.6 BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
unsigned short usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask )
7