当前位置: 首页 > Linux

MiniFly四轴学习系列2---四轴部分主要功能

时间:2023-04-06 03:16:03 Linux

**说明:本文原作者“Allen5G”首发于微信公众号“Allen5G”,关注获取更多干货!Tags:Programming,Software,Algorithm,Thinking**先看整个项目的任务关系。手机APP需要自己开发。我暂时没时间做。等官方吧.然后主要就是使用主机和遥控器。上位机通过USB连接四轴,需要烧录固件。计算和姿态控制。之后主要研究的是这段代码整个系统是基于Freertos系统的,所以该函数也在系统中进行任务切换。看主要功能部分:首先,我很喜欢代码风格,可能是强迫症,注释一定要#include"system.h"/*头文件集合*/TaskHandle_tstartTaskHandle;//创建句柄staticvoidstartTask(void*arg);//声明创建函数intmain()//mainfunction{systemInit();/*底层硬件初始化*/xTaskCreate(startTask,"START_TASK",300,NULL,2,&startTaskHandle);/*创建启动任务*/vTaskStartScheduler();/*开始任务调度*/while(1){};}/*创建任务*/voidstartTask(void*arg){taskENTER_CRITICAL();/*进入临界区*/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发送任务task*/xTaskCreate(atkpRxAnlTask??,"ATKP_RX_ANL",300,空值,6,空值);/*创建atkp分析任务*/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);/*创建手势任务*/xTaskCreate(wifiLinkTask,"WIFILINK",150,NULL,4,NULL);/*创建通信连接任务*/xTaskCreate(expModuleMgtTask,"EXP_MODULE",150,NULL,1,NULL);/*创建扩展模块管理任务*/printf("空闲堆:%d字节\n",xPortGetFreeHeapSize());/*打印剩余的堆大小*/vTaskDelete(startTaskHandle);/*删除启动任务*/taskEXIT_CRITICAL();/*退出临界区*/}voidvApplicationIdleHook(void){staticu32tickWatchdogReset=0;portTickTypetickCount=getSysTickCnt();如果(tickCount-tickWatchdogReset>WATCHDOG_RESET_MS)//添加一个独立的看门狗{tickWatchdogReset=tickCount;看门狗重置();}__WFI();/*进入低功耗模式*/}主要功能正常步骤:首先硬件初始化:基本32个基本操作,涉及到哪部分后面再说!voidsystemInit(void){u8cnt=0;nvicInit();/*中断配置初始化*/extiInit();/*外部中断初始化*/delay_init(96);/*延迟初始化*/ledInit();/*led初始化*/ledseqInit();/*led灯序列初始化*/commInit();/*通信初始化STM32&NRF51822*/atkpInit();/*传输协议初始化*/consoleInit();/*打印初始化*/printf("<-------------------->\n");无线模块初始化();/*WIFI模块初始化*/configParamInit();/*初始化配置参数*/pmInit();/*电源管理初始化*/stabizerInit();/*电机传感器PID初始化*/expModuleDriverInit();/*扩展模块驱动初始化*/if(systemTest()==true){while(cnt++<5)/*通过左上角绿灯闪烁5次初始化*/{ledFlashOne(LED_GREEN_L,50,50);}}else{while(1)/*初始化错误右上红灯间隔1s闪烁5次*/{if(cnt++>4){cnt=0;delay_xms(1000);}ledFlashOne(LED_RED_R,50,50);}}watchdogInit(WATCHDOG_RESET_MS);/*看门狗初始化*/}staticboolsystemTest(void){boolpass=true;通过&=ledseqTest();通过&=pmTest();通过&=configParamTest();通过&=commTest();通过&=稳定剂测试();通过&=watchdogTest();returnpass;}之后,创建一个任务。一般来说,系统是为了降低逻辑难度。看过APM飞控的代码,也安装在操作系统(NuttX实时操作系统)上,但Freertos确实是第一次使用。有一次,我之前用过几次Freertos。它确实是一个轻量级的操作系统。简化了很多,队列使用体验不是很好。这次应用在小四轴上,看看效果如何!下面的创建任务就是调用下面的函数,可以配置优先级和堆栈大小,这些容易忽略!!然后开始任务调度:它会创建一个空闲任务,初始化一些静态变量,最重要的是,它会初始化系统节拍定时器并设置相应的中断,然后启动第一个任务大牛分析FreeRTOS调度器的启动过程分析:https://blog.csdn.net/zhzht19...vTaskStartScheduler();/Enabletaskscheduling/实际的任务函数在后面,然后继续。.