河北水利局项目
This commit is contained in:
261
notebook/freeRTOS_note.txt
Normal file
261
notebook/freeRTOS_note.txt
Normal file
@@ -0,0 +1,261 @@
|
||||
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 timer’s 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 = 1;TickType_t 为32 bits 数据类型
|
||||
|
||||
37、configUSE_COUNTING_SEMAPHORES 允许创建多值信号量
|
||||
|
||||
38、configUSE_MUTEXES 允许创建互斥信号量
|
||||
|
||||
|
||||
INCLUDE_uxTaskGetStackHighWaterMark == 1 prvTaskCheckFreeStackSpace() 可以用来读取单个任务使用过程中最少的剩余空间
|
||||
xPortGetFreeHeapSize() 可以用来统计总堆栈剩余空间
|
||||
BIN
notebook/freeRTOS_中断API分析.doc
Normal file
BIN
notebook/freeRTOS_中断API分析.doc
Normal file
Binary file not shown.
Reference in New Issue
Block a user