《FreeRTOS應用總結》(基礎應用)
阿新 • • 發佈:2019-01-05
1.在最近的嵌入式工作中很多都是學習FreeRTOS系統,由於只是會對RTOS的介面進行呼叫,但是很多時候都是知其然而不知其所以然,所以現在對API進行總結。
2.首先還是從main函式入口,main()函式建立任務,然後啟動排程器
大概的格式如下:
int main( void ) { if(xTaskCreate(test1, (const char*)"test1", 1024, NULL,5, NULL)!=pdPASS){ Printf(“create task error\n”); } /* 啟動排程器,任務開始執行 */ vTaskStartScheduler(); for( ;; ); }
3.在 FreeRTOS 中,多執行緒被稱為多工,在這裡任務可以看得和執行緒相同。(其實並不相同)
首先建立任務的介面:
portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName, unsigned portSHORT usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask ); pvTaskCode:任務的入口,是個永不退出的函式。 一般格式:void test( void *pvParameters ); pcName:任務的名字(一般無用) usStackDepth:任務的大小,棧的深度 pvParameters:傳入任務的引數 uxPriority:此任務執行在優先順序,優先順序的大小可以控制的,最大值在FreeRTOSConfig.h 中的configMAX_PRIORITIES-1,但是要注意優先順序數越大,那麼核心的開銷越大 pxCreatedTask :控制代碼,用於刪除等功能的呼叫
如:
if(xTaskCreate(test1, (const char*)"test1", 1024, NULL,5, NULL)!=pdPASS){
Printf(“create task error\n”);
}
呼叫的函式demo如下:
void test( void *pvParameters )
{
for(;;)
{
//使用者的邏輯在這裡 這個是永不返回的函式
}
vTaskDelete( NULL );
}
上面是對兩個介面的簡單介紹,下面是注意的事項。
(1):每個任務的執行必要要有延時,如果沒有延時,那麼會出現單個任務一直佔用CPU的現象。比如說下面的程式碼邏輯就會出現一直在執行任務一的現象;
void test1(void *param)
{
for(;;)
{
printf("1\n");
}
//正常是不會到這裡的
vTaskDelete( NULL );
}
void test2(void *param)
{
for(;;)
{
printf("2\n");
vTaskDelay(100);
}
vTaskDelete( NULL );
}
int main{
xTaskCreate(test1, (const char*)"test1", 1024, NULL,5, NULL);
xTaskCreate(test2, (const char*)"test2", 1024, NULL,5, NULL)
vTaskStartScheduler();
for( ;; );
}
(2)由於多工是使用的時間片輪轉的方式呼叫,如果優先順序高的任務佔用的時間片過多,那麼低優先順序的任務會出現餓死狀態。
void test1(void *param)
{
for(;;)
{
printf("1\n");
}
//正常是不會到這裡的
vTaskDelete( NULL );
}
void test2(void *param)
{
for(;;)
{
printf("2\n");
}
vTaskDelete( NULL );
}
int main{
xTaskCreate(test1, (const char*)"test1", 1024, NULL,5, NULL);
xTaskCreate(test2, (const char*)"test2", 1024, NULL,4, NULL)
vTaskStartScheduler();
for( ;; );
}