FreeRTOS的任務創建函數xTaskCreate

拍自《多旋翼無人飛行器嵌入式飛控開發指南》

清楚了這個任務創建函數之後你再去看正點原子的飛控裏的main函數也會清晰很多。

 

#include "system.h"	/*頭文件集合*/

/********************************************************************************
 * 本程序只供學習使用,未經作者許可,不得用於其它任何用途
 * ALIENTEK MiniFly
 * main.c
 * 包括系統初始化和創建任務
 * 正點原子@ALIENTEK
 * 技術論壇:www.openedv.com
 * 創建日期:2017/5/12
 * 版本:V1.3
 * 版權所有,盜版必究。
 * Copyright(C) 廣州市星翼電子科技有限公司 2014-2024
 * All rights reserved
********************************************************************************/

TaskHandle_t startTaskHandle;
static void startTask(void *arg);

int main()
{
    systemInit();			/*底層硬件初始化*/

    xTaskCreate(startTask, "START_TASK", 300, NULL, 2, &startTaskHandle);	/*創建起始任務*/

    vTaskStartScheduler();	/*開啓任務調度*/

    while(1) {};
}
/*創建任務*/
void startTask(void *arg)
{
    taskENTER_CRITICAL();	/*進入臨界區*/
	                                                     //maxi:因爲是操作系統嘛,所以創建任務。
    xTaskCreate(radiolinkTask, "RADIOLINK", 150, NULL, 5, NULL);		/*創建無線連接任務*/

    xTaskCreate(usblinkRxTask, "USBLINK_RX", 150, NULL, 4, NULL);		/*創建usb接收任務*/
    xTaskCreate(usblinkTxTask, "USBLINK_TX", 150, NULL, 3, NULL);		/*創建usb發送任務*/

    xTaskCreate(atkpTxTask, "ATKP_TX", 150, NULL, 3, NULL);				/*創建atkp發送任務任務*/
	xTaskCreate(atkpRxAnlTask, "ATKP_RX_ANL", 300, NULL, 6, NULL);		/*創建atkp解析任務*/  //maxi:我沒想到居然這個的任務優先級最高。

    xTaskCreate(configParamTask, "CONFIG_TASK", 150, NULL, 1, NULL);	/*創建參數配置任務*/

    xTaskCreate(pmTask, "PWRMGNT", 150, NULL, 2, NULL);					/*創建電源管理任務*/

    xTaskCreate(sensorsTask, "SENSORS", 450, NULL, 4, NULL);			/*創建傳感器處理任務*/

    xTaskCreate(stabilizerTask, "STABILIZER", 450, NULL, 5, NULL);		/*創建姿態任務*/
              	//maxi:stabilizerTask:四軸平衡控制任務。該任務運行的內容比較多,也是比較關鍵的內容。 包括傳感器數據讀取,數據融合,獲取控制數據,空翻檢測,異常檢測,PID 控制,PWM 輸出控制等。 
	              //maxi:stabilizerTask這個函數在stabilizer.c裏面,也就是這個任務的具體細節在這個函數裏面。
    xTaskCreate(expModuleMgtTask, "EXP_MODULE", 150, NULL, 1, NULL);	/*創建擴展模塊管理任務*/

    printf("Free heap: %d bytes\n", xPortGetFreeHeapSize());			/*打印剩餘堆棧大小*/

    vTaskDelete(startTaskHandle);										/*刪除開始任務*/

    taskEXIT_CRITICAL();	/*退出臨界區*/
}

void vApplicationIdleHook( void )
{
    static u32 tickWatchdogReset = 0;

    portTickType tickCount = getSysTickCnt();

    if (tickCount - tickWatchdogReset > WATCHDOG_RESET_MS)
    {
        tickWatchdogReset = tickCount;
        watchdogReset();
    }

    __WFI();	/*進入低功耗模式*/
}
















 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章