MiniFly四轴学习系列2---四轴部分main函数
2019-07-07 12:03
246 查看
先看看整个工程的任务关系 手机APP是需要自己开发APP的,暂时没空搞,坐等官方。。
然后主要就是上位机和遥控器的使用了 上位机通过USB连接四轴,需要烧录固件BootLoader 遥控器使用NFR无线通信,这个也是可玩性最高的地方,当然也是最核心的部分---姿态解算和姿态控制,之后主要要研究的就是这块代码
整个系统是基于Freertos系统,所以函数也是在系统中进行任务切换
看下main函数部分: 首先说下代码风格很喜欢,可能是强迫症,注释必须对其
#include "system.h" /*头文件集合*/ 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(); /*进入临界区*/ 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解析任务*/ 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("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(); /*进入低功耗模式*/ }
main函数正常步骤: 先是硬件初始化:基本都是32的基础操作,后边看哪部分时涉及到了再说吧!
void systemInit(void) { u8 cnt = 0; nvicInit(); /*中断配置初始化*/ extiInit(); /*外部中断初始化*/ delay_init(96); /*delay初始化*/ ledInit(); /*led初始化*/ ledseqInit(); /*led灯序列初始化*/ commInit(); /*通信初始化 STM32 & NRF51822 */ atkpInit(); /*传输协议初始化*/ consoleInit(); /*打印初始化*/ printf("<--------------------->\n"); wifiModuleInit(); /*WIFI模块初始化*/ configParamInit(); /*初始化配置参数*/ pmInit(); /*电源管理初始化*/ stabilizerInit(); /*电机 传感器 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); /*看门狗初始化*/ } static bool systemTest(void) { bool pass = true; pass &= ledseqTest(); pass &= pmTest(); pass &= configParamTest(); pass &= commTest(); pass &= stabilizerTest(); pass &= watchdogTest(); return pass; }
之后就是创建任务,一般上系统就是为了减少逻辑难度,看过APM飞控的代码也是上了操作系统( NuttX 实时操作系统) 但是上Freertos真是第一次,之前也是使用过几次Freertos,确实是轻量级操作系统,被精简了很多,队列使用体验不是很好,这次被应用到小四轴上,看看实际效果怎么样吧!
后边的创建任务就是调用下面的函数,可以配置优先级及堆栈大小,都是容易忽视的问题!!
然后就是启动任务调度:它会创建一个空闲任务、初始化一些静态变量,最主要的,它会初始化系统节拍定时器并设置好相应的中断,然后启动第一个任务。 大牛分析 FreeRTOS调度器启动过程分析:https://www.geek-share.com/detail/2673517852.html vTaskStartScheduler(); /开启任务调度/
后边就是实际任务函数了,之后再继续。。
相关文章推荐
- 织梦仿站系列教程第十六讲——首页其它部分及站内调查
- [Silverlight入门系列]实现局部元素全屏(Element部分全屏)
- JSF2自定义组件编程系列 第二部分
- ionic3开发系列——实现对部分元素的立即响应(tappable属性)
- sed学习系列---第3/3部分
- 一步一步学习sharepoint2010 workflow 系列第三部分:自定义SharePoint代码工作流 第10章 工作流和任务处理(Workflows and task processes)
- IOX系列视频9-Yeslab安德IOS XR配置指导第五部分ISIS协议优化和对IPv6的支持
- iOS之优秀架构技术实践系列文章(部分):
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十二)制作精美的Mini地图②
- 设为首页/加入收藏代码_兼容各浏览器ie系列 Firefox/360 部分不兼容 请自己尝试
- JSF2自定义组件编程系列 第四部分
- Gt9xx系列------irq的部分
- 新手上路系列3:数组及部分常用程序
- Android面试系列文章2018之Android部分事件分发机制篇
- Spring 系列,第 3 部分: 进入 Spring MVC
- 大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(三)商业逻辑代码部分
- Android面试系列文章2018之Java部分异常篇
- 开始VS 2012中LightSwitch系列的第5部分:我可以使用用户权限来控制访问权吗?
- Linux从用户层到内核层系列 - TCP/IP协议栈部分系列8: 基础知识之 - Linux环境变量使用Tip
- 【推荐】【老外写的iOS设计模式系列】第4部分 装饰器模式