1. 程式人生 > >《FreeRTOS應用總結》(基礎應用)

《FreeRTOS應用總結》(基礎應用)

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( ;; );
}
(3)時間片的長度通過心跳中斷的頻率進行設定,心跳中斷頻率由FreeRTOSConfig.h 中的編譯時配置常量 configTICK_RATE_HZ 進行配置。比如說,如果 configTICK_RATE_HZ 設為 10(HZ),則時間片長度為 100ms
(4)優先順序是在FreeRTOS是可以通過呼叫API進行修改的。