发 帖  
原厂入驻New

[经验] MiniFly四轴学习笔记之---四轴部分main函数

2019-8-27 15:27:25  897 FreeRTOS STM32 四轴飞行器
分享
0
  先看看整个工程的任务关系
  手机APP是需要自己开发APP的,暂时没空搞,坐等官方。。
  然后主要就是上位机和遥控器的使用了
  上位机通过USB连接四轴,需要烧录固件BootLoader
  遥控器使用NFR无线通信,这个也是可玩性最高的地方,当然也是最核心的部分---姿态解算和姿态控制,之后主要要研究的就是这块代码
   四轴1.webp.jpg
file://upload-images.jianshu.io/upload_images/12856594-2596061cc44fdc50?imageMogr2/auto-orient/strip%7CimageView2/2/w/870/format/webp
  在这里插入图片描述
  整个系统是基于Freertos系统,所以函数也是在系统中进行任务切换
  看下main函数部分:
  首先说下代码风格很喜欢,可能是强迫症,注释必须对其
  1. <p>  #include "system.h" /*头文件集合*/</p>
  2. <p>  TaskHandle_t startTaskHandle; //创建句柄</p>
  3. <p>  static void startTask(void *arg);//声明创建函数</p>
  4. <p>  int main() //主函数</p>
  5. <p>  {</p>
  6. <p>  systemInit(); /*底层硬件初始化*/</p>
  7. <p>  xTaskCreate(startTask, "START_TASK", 300, NULL, 2, &startTaskHandle);
  8. /*创建起始任务*/</p>
  9. <p>  vTaskStartScheduler(); /*开启任务调度*/</p>
  10. <p>  while(1){};</p>
  11. <p>  }</p>
  12. <p>  /*创建任务*/</p>
  13. <p>  void startTask(void *arg)</p>
  14. <p>  {</p>
  15. <p>  taskENTER_CRITICAL(); /*进入临界区*/</p>
  16. <p>  xTaskCreate(radiolinkTask, "RADIOLINK", 150, NULL, 5, NULL);
  17. /*创建无线连接任务*/</p>
  18. <p>  xTaskCreate(usblinkRxTask, "USBLINK_RX", 150, NULL, 4, NULL);
  19. /*创建usb接收任务*/</p>
  20. <p>  xTaskCreate(usblinkTxTask, "USBLINK_TX", 150, NULL, 3, NULL);
  21. /*创建usb发送任务*/</p>
  22. <p>  xTaskCreate(atkpTxTask, "ATKP_TX", 150, NULL, 3, NULL);
  23. /*创建atkp发送任务任务*/</p>
  24. <p>  xTaskCreate(atkpRxAnlTask, "ATKP_RX_ANL", 300, NULL, 6, NULL);
  25. /*创建atkp解析任务*/</p>
  26. <p>  xTaskCreate(configParamTask, "CONFIG_TASK", 150, NULL, 1, NULL);
  27. /*创建参数配置任务*/</p>
  28. <p>  xTaskCreate(pmTask, "PWRMGNT", 150, NULL, 2, NULL); /*创建电源管理任务*/</p>
  29. <p>  xTaskCreate(sensorsTask, "SENSORS", 450, NULL, 4, NULL); /*创建传感器处理任务*/</p>
  30. <p>  xTaskCreate(stabilizerTask, "STABILIZER", 450, NULL, 5, NULL);
  31. /*创建姿态任务*/</p>
  32. <p>  xTaskCreate(wIFiLinkTask, "WIFILINK", 150, NULL, 4, NULL); /*创建通信连接任务*/</p>
  33. <p>  xTaskCreate(expModuleMgtTask, "EXP_MODULE", 150, NULL, 1, NULL);
  34. /*创建扩展模块管理任务*/</p>
  35. <p>  printf("Free heap: %d bytes\n", xPortGetFreeHeapSize()); /*打印剩余堆栈大小*/</p>
  36. <p>  vTaskDelete(startTaskHandle); /*删除开始任务*/</p>
  37. <p>  taskEXIT_CRITICAL(); /*退出临界区*/</p>
  38. <p>  }</p>
  39. <p>  void vApplicationIdleHook( void )</p>
  40. <p>  {</p>
  41. <p>  static u32 tickWatchdogReset = 0;</p>
  42. <p>  portTickType tickCount = getSysTickCnt();</p>
  43. <p>  if (tickCount - tickWatchdogReset > WATCHDOG_RESET_MS) //添加独立看门狗</p>
  44. <p>  {</p>
  45. <p>  tickWatchdogReset = tickCount;</p>
  46. <p>  watchdogReset();</p>
  47. <p>  }</p>
  48. <p>  __WFI(); /*进入低功耗模式*/</p>
  49. <p>  }</p>
复制代码

  main函数正常步骤:
  先是硬件初始化:基本都是32的基础操作,后边看哪部分时涉及到了再说吧!
  1. <p>  void systemInit(void)</p>
  2. <p>  {</p>
  3. <p>  u8 cnt = 0;</p>
  4. <p>  nvicInit(); /*中断配置初始化*/</p>
  5. <p>  extiInit(); /*外部中断初始化*/</p>
  6. <p>  delay_init(96); /*delay初始化*/</p>
  7. <p>  LEDInit(); /*led初始化*/</p>
  8. <p>  ledseqInit(); /*led灯序列初始化*/</p>
  9. <p>  commInit(); /*通信初始化 STM32 & NRF51822 */</p>
  10. <p>  atkpInit(); /*传输协议初始化*/</p>
  11. <p>  consoleInit(); /*打印初始化*/</p>
  12. <p>  printf("<--------------------->\n");</p>
  13. <p>  wifiModuleInit(); /*WIFI模块初始化*/</p>
  14. <p>  configParamInit(); /*初始化配置参数*/</p>
  15. <p>  pmInit(); /*电源管理初始化*/</p>
  16. <p>  stabilizerInit(); /*电机 传感器 PID初始化*/</p>
  17. <p>  expModuleDriverInit();/*扩展模块驱动初始化*/</p>
  18. <p>  if(systemTest() == true)</p>
  19. <p>  {</p>
  20. <p>  while(cnt++ < 5) /*初始化通过 左上绿灯快闪5次*/</p>
  21. <p>  {</p>
  22. <p>  ledFlashOne(LED_GREEN_L, 50, 50);</p>
  23. <p>  }</p>
  24. <p>  }else</p>
  25. <p>  {</p>
  26. <p>  while(1) /*初始化错误 右上红灯间隔1s快闪5次*/</p>
  27. <p>  {</p>
  28. <p>  if(cnt++ > 4)</p>
  29. <p>  {</p>
  30. <p>  cnt=0;</p>
  31. <p>  delay_xms(1000);</p>
  32. <p>  }</p>
  33. <p>  ledFlashOne(LED_RED_R, 50, 50);</p>
  34. <p>  }</p>
  35. <p>  }</p>
  36. <p>  watchdogInit(WATCHDOG_RESET_MS); /*看门狗初始化*/</p>
  37. <p>  }</p>
  38. <p>  static bool systemTest(void)</p>
  39. <p>  {</p>
  40. <p>  bool pass = true;</p>
  41. <p>  pass &= ledseqTest();</p>
  42. <p>  pass &= pmTest();</p>
  43. <p>  pass &= configParamTest();</p>
  44. <p>  pass &= commTest();</p>
  45. <p>  pass &= stabilizerTest();</p>
  46. <p>  pass &= watchdogTest();</p>
  47. <p>  return pass;</p>
  48. <p>  }</p>
复制代码

  之后就是创建任务,一般上系统就是为了减少逻辑难度,看过APM飞控的代码也是上了操作系统( NuttX 实时操作系统)
  但是上Freertos真是第一次,之前也是使用过几次Freertos,确实是轻量级操作系统,被精简了很多,队列使用体验不是很好,这次被应用到小四轴上,看看实际效果怎么样吧!
  后边的创建任务就是调用下面的函数,可以配置优先级及堆栈大小,都是容易忽视的问题!!
   四轴2.webp.jpg
file://upload-images.jianshu.io/upload_images/12856594-80f853d8f9a74b82.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/653/format/webp
  在这里插入图片描述
  然后就是启动任务调度:它会创建一个空闲任务、初始化一些静态变量,最主要的,它会初始化系统节拍定时器并设置好相应的中断,然后启动第一个任务。对stm32和Freertos感兴趣的伙伴可以加学习交流群来找资料交流:830802928


评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表