拍自《多旋翼無人飛行器嵌入式飛控開發指南》
清楚了這個任務創建函數之後你再去看正點原子的飛控裏的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(); /*進入低功耗模式*/
}