大疆osdk开发遇到的bug的解决 小结

osdk:即dji大疆onboard sdk,用来做二次开发的的开发包

我使用的ONBOARD SDK版本是:3.6.0 用于A3和N3的二次开发

官方的开发文档链接:https://developer.dji.com/onboard-sdk/documentation/quick-start/index.html

开发步骤:我用的工程是stm32,没有用linux和qt上的

买A3/N3硬件(我之前的博客说过的至少4大模块)=〉申请开发密钥并联机激活=〉安装上位机并实现simulator仿真=〉实测

我开发所遇到的bug以及解决的办法如下:(其实我遇到的不仅仅是这些,但是下面的这些印象比较深刻的)

1.dji-osdk3.6.0的工程无法添加.c和.h文件;

我一添加一个.c文件,出来无数个未定义的变量错误

--我一开始以为是我的路径或者文件包含不正确。或者还有中文路径,或者路径带有括号等等,试了很久,没有解决

--之后仔细还研究了整个代码的框架;我发现是原因是:它的库使用的是1.1.0;而我的库使用的是最新的版本;后来我把库

我把我的库修改到V1.0.8就解决了问题!!!

大疆osdk开发遇到的bug的解决 小结_第1张图片大疆osdk开发遇到的bug的解决 小结_第2张图片

2.添加中断函数函数的时候,调试跳转到 b endp align 错误;如图位置

--其实这个错误,就是你开了某个中断(比如串口,定时器等等),但是没有写对应的XXX_IRQHandler()实体函数;

--当时我确实是已经写了中断函数IRQHandler(),但是由于它的架构使用的是C++,你用c来编写中断函数一定要添加添加#ifdef __cplusplus //必须加入这个宏定义,以支持c代码

XXX_IRQHandler() { ......}    //放在中间

#endif

大疆osdk开发遇到的bug的解决 小结_第3张图片  大疆osdk开发遇到的bug的解决 小结_第4张图片

3.HardFault_Handler的解决

(问题就是内存溢出或者访问越界或者堆栈溢出,关键在于如何定位错误点)

---这种错误我遇到过不止一次,我以前的主要解决思路就是利用堆栈或者内存地址的执行顺序来查中;这一点在IAR和mdk(keil),都是一样;然而这次很崩溃,因为这两个思路都不好使;所以我用的是错误报告大疆osdk开发遇到的bug的解决 小结_第5张图片

错误报告表开启如下:这个错误报告表,会爆出你程序停止,跑飞或者奇怪错误的时候的原因:

术语的说明官方有说明:http://www.onarm.com/dd/vtr/4250/8662.htm;

大疆osdk开发遇到的bug的解决 小结_第6张图片 大疆osdk开发遇到的bug的解决 小结_第7张图片 大疆osdk开发遇到的bug的解决 小结_第8张图片

--由此,我的错误是Usage Fault-“INSTATE”(“压入堆栈的PC值指向一个尝试非法使用EPSR的指令”),我知道我的堆栈溢出了,我查看堆栈大小,我把我的堆大小改到2倍,问题解决了!

大疆osdk开发遇到的bug的解决 小结_第9张图片

hardfault 协助信息解读:

大疆osdk开发遇到的bug的解决 小结_第10张图片

大疆osdk开发遇到的bug的解决 小结_第11张图片

4.while(1)中代码执行停止,程序在一直在串口中断循环;

定时器中断和其他中断每死;我定位了很多情况,最后的做法借鉴了道友:https://blog.csdn.net/origin333/article/details/49992383STM32串口中断卡死主循环问题分析

出现通过接收时,通过USART_GetFlagStatus读取ORE,若不为RESET,则读取DR数据丢弃

总结:

 

(1)打开RXNEIE,默认会同时打开RXNE和ORE中断。

(2)必须第一时间清零RXNE,如没及时清零,下一帧数据过来时就会产生Overrun error!

(3)错误就是ORE导致的。

(4)解决办法要清除ORE

eg:解决如下:

void USART2_IRQHandler(void)

{
  u8 key = 0;

  if(USART_GetITStatus(USART2,USART_IT_RXNE)!=Bit_RESET) //检查 USART 是否发生中断
  {
      USART_ClearITPendingBit(USART2,USART_IT_RXNE); // 清中断标志
      key=USART_ReceiveData(USART2);
      // save key at here.
  }
  if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) // 检查 ORE 标志
  {
      USART_ClearFlag(USART2,USART_FLAG_ORE);
      USART_ReceiveData(USART2);
  }

}

详细参见:

 

《STM32串口中断卡死主循环问题分析》    http://blog.csdn.net/origin333/article/details/49992383

《STM32串口中断接收方式详细比较》  http://wenku.baidu.com/link?url=LOKe2MjxexxJSim2HNuTDGP3Tn5OQLu79u0oG7rHY7JPMaxQgIQPk-0y-OUxo9mMUvCObnP0bp5zw6W3udBeIFBzd-nUuzQpN1bJ6m5EReS

 暂时这么多,以后再更新!!!!

 

你可能感兴趣的:(DJI-OSDK二次开发小结)