大疆社区

标题: 一步步教你如何在OSDK 4.0上移植FreeRTOS [打印本页]

作者: 张小龙    时间: 2020-6-3
标题: 一步步教你如何在OSDK 4.0上移植FreeRTOS
本帖最后由 张小龙 于 2020-6-23 14:34 编辑

本文目录
1.下载SDK代码
2.确认IDE和Pack版本
3.首次编译
    3.1 填写APP信息
    3.2 设置目标IC
    3.3 修改晶振
    3.4 执行首次编译
4.移植FreeRTOS
    4.1 下载FreeRTOS源码包
    4.2 解压FreeRTOS代码包
    4.3 复制FreeRTOS系统代码文件
    4.4 复制FreeRTOS系统配置文件
    4.5 修改 FreeRTOSConfig.h文件
    4.6 再次执行编译
5.附件
    已经移植好FreeRTOS的代码包

------------------------------------------------- 手动分割线 --------------------------------------------------

1.下载SDK代码
首先,下载OSDK-4.0的代码
可以直接下载zip代码包  https://codeload.github.com/dji-sdk/Onboard-SDK/zip/4.0
也可以使用 git clone https://github.com/dji-sdk/Onboard-SDK.git
下载下来后可以简单看下整个OSDK4.0的代码包结构
其中,osdk-core就是OSDK的API库,所有关键代码都在这里,同时DJI也提供了Linux平台和STM32平台的sample代码,位于sample文件夹下。

2.确认IDE和Pack版本
确认MDK-Keil版本和STM32Device Pack版本,注意:STM32F4 Pack版本需要使用2.13.0,使用最新的2.14.0会有其他报错。


3.首次编译
打开DJI提供的STM32 sample,工程文件位于 Onboard-SDK-4.0\sample\platform\STM32\OnBoardSDK_STM32\Project\OnBoardSDK_STM32.uvprojx
3.1 填写APP信息
在Activate.cpp文件中填写我们的APP ID 和Key,如果不知道什么是APP Key和ID的可以参考之前的文章:

3.2
设置目标IC 先点开工程选项设置页,选择你的目标IC,这边我选用的STM32F407VGTx系列(对应我的STM32F407VGT6)


3.3 修改晶振
先设置想编译的sample:
再接着点选C/C++页面,填写我们希望编译的sample,这里其实就是一个预编译指令,比如“-DFLIGHT_CONTROL_SAMPLE。
接着设置晶振频率:
重新定义晶振频率,OSDK中使用的频率是25M,而我使用的板子是8M,因此我们需要做更改,由于OSDK4.0依然使用STD库,因此一种方式是修改stm32f4xx.h文件中的HSE_VALUE定义,或者直接使用预编译指令 -DHSE_VALUE=8000000,然后点击OK。

STD库修改时钟比较麻烦,处理修改晶振频率还得修改system_stm32f4xx.c文件中的 PLL_M,如下图所示,将25改成8,当然我们可以将这个数字改成HSE_VALUE,让它等于晶振本身也是可以的,这样以后只需要在预编译指令中修改晶振即可。


3.4 执行首次编译

最后单击编译按钮,进行编译,编译后会发现出现很多error信息

错误提示是找不到freeRTOS,官方文档也告诉我们想使用STM32平台是需要自己移植的。

4.移植FreeRTOS
4.1 下载FreeRTOS源码包
FreeRTOS官方下载地址 https://www.freertos.org/a00104.html
点这里下载会是最新的版本,官方使用的是V10.2.1,但我下载下来的时候已经是 V10.3.1,不过也没关系,影响不大。
如果你希望使用v10.2.1的版本可以在这里找:https://github.com/FreeRTOS/FreeRTOS/tags

4.2 解压FreeRTOS代码包
整个FreeRTOS  V10.3.1 的代码文件夹内容如下图所示


其中FreeRTOS文件夹就是该系统真身,带Plus的文件夹存放的是其它的系统组件,比如CLI组件,这个视情况使用,带TCP的文件夹很明显就是提供TCP/IP协议栈的系统组件。

4.3 复制FreeRTOS系统代码文件
将FreeRTOSv10.3.1\FreeRTOS\Source整个文件夹的内容复制到Onboard-SDK-4.0\sample\platform\STM32\OnBoardSDK_STM32\OS\FreeRTOS目录下,如下图所示


4.4 复制FreeRTOS系统配置文件
使用FreeRTOS的前提是需要一个FreeRTOSConfig.h的系统配置文件,用来设定系统参数和裁剪系统功能,实现系统平台的移植,在这里可以自己创建(显然这不是理智的选择),也可以直接复制FreeRTOS官方提供的demo文件。
在 FreeRTOSv10.3.1\FreeRTOS\Demo 中我们有注意到 CORTEX_M4F_STM32F407ZG-SK 的模板工程,与我们使用的STM32F407VGT6很相近,因此可以直接复制该工程下的FreeRTOSConfig.h文件到我们的工程目录下,即将FreeRTOSv10.3.1\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\FreeRTOSConfig.h 复制到Onboard-SDK-4.0\sample\platform\STM32\OnBoardSDK_STM32\OS\FreeRTOS\Source\include文件夹下

DJI OSDK-4.0 已经在工程中添加了相关文件和路径,可以发现之前有提示黄色感叹号(因为找不到文件),现在该感叹号已经消失。


4.5 修改 FreeRTOSConfig.h文件
为了方便后续修改配置,建议在工程中添加该文件,如下图所示


打开FreeRTOSConfig.h 文件


将#ifdef __ICCARM__ 改为 #if defined (__ICCARM__) || defined (__CC_ARM)|| defined (__GNUC__)


将#defined configUSE_IDLE_HOOK 1改为#defined configUSE_IDLE_HOOK 2


将#define configTOTAL_HEAP_SIZE((size_t)(75*1024))改为#define configTOTAL_HEAP_SIZE ((size_t)(60*1024))


将#define configCHECK_FOR_STACK_OVERFLOW2改为#define configCHECK_FOR_STACK_OVERFLOW 0


将#define configUSE_MALLOC_FAILED_HOOK1改为#define configUSE_MALLOC_FAILED_HOOK 0


4.6 再次执行编译
可以发现0 error 0warming



5.附件
已经移植好FreeRTOS的代码包: Onboard-SDK-4.0_FreeRTOS.zip (11.67 MB, 下载次数: 902)





作者: djiuser_iVRfmnC    时间: 2020-6-4
STM32的板没有USB虚拟串口要怎样才能运行
作者: NiceJIE    时间: 2020-6-4
djiuser_iVRfmnC6-4 14:51
STM32的板没有USB虚拟串口要怎样才能运行
同问
作者: 张小龙    时间: 2020-6-4
djiuser_iVRfmnC6-4 14:51
STM32的板没有USB虚拟串口要怎样才能运行
不是USB虚拟串口,需要STM32支持USB 2.0,具有USB-OTG 功能,支持高速和全速数据传输才行~~

作者: 张小龙    时间: 2020-6-4
NiceJIEOsmo Pocket6-4 15:48
同问
需要STM32支持USB 2.0,具有USB-OTG 功能,支持高速和全速数据传输才行~~

作者: jack1699    时间: 2020-6-22
张小龙6-4 21:34
需要STM32支持USB 2.0,具有USB-OTG 功能,支持高速和全速数据传输才行~~
请问如果不适用usb接口,仅使用ttl串口进行通信可以不
作者: jack1699    时间: 2020-6-22
张小龙6-4 21:34
需要STM32支持USB 2.0,具有USB-OTG 功能,支持高速和全速数据传输才行~~
咨询您个比较低级的问题,我刚接触stm32的编程,请问这个错误是啥引起的,我照您的教程编译osdk4.0的stm32例程的时候出现的

看样子是说这个参数与函数需要的参数类型不匹配
作者: 张小龙    时间: 2020-6-22
jack1699Mavic 2 Pro6-22 12:06
请问如果不适用usb接口,仅使用ttl串口进行通信可以不
可以的,但是OSDK在Active时会尝试激活USB通信的防火墙,如果未连接USB将会重试多次。可以注释掉Active里面的firewall相关操作。
不过这样相当于放弃USB通信,这样的话目前4.0的相机云台功能,Advanced-Sensing,Waypoint 2.0将会使用不了。
作者: 张小龙    时间: 2020-6-22
jack1699Mavic 2 Pro6-22 12:59
咨询您个比较低级的问题,我刚接触stm32的编程,请问这个错误是啥引起的,我照您的教程编译osdk4.0的stm32例程的时候出现的[图片]
[图片]
看样子是说这个参数与函数需要的参数类型不匹配
使用的FreeRTOS是多少?可以跟过去看看参数定义的类型和函数所需的类型是否有定义,定义是否一致。
作者: jack1699    时间: 2020-6-23
张小龙6-22 20:56
可以的,但是OSDK在Active时会尝试激活USB通信的防火墙,如果未连接USB将会重试多次。可以注释掉Active里面的firewall相关操作。
不过这样相当于放弃USB通信,这样的话目前4.0的相机云台功能,Advanced-Sensing,Waypoint 2.0将会使用不了。
噢,那就是说osdk4.0的话,usb和ttl两个接口都要连接咯,还是说只连接飞机的usb接口就可以实现所有功能呢

作者: jack1699    时间: 2020-6-23
张小龙6-22 21:09
使用的FreeRTOS是多少?可以跟过去看看参数定义的类型和函数所需的类型是否有定义,定义是否一致。
找到原因了,是device pack版本的问题。感谢感谢
作者: OSdk学习者    时间: 2020-6-23
请问我如果用stm32f407ZGT6芯片,下载osdk3.9固件,需要进行移植操作吗
作者: 张小龙    时间: 2020-6-23
jack1699Mavic Air 26-23 08:21
找到原因了,是device pack版本的问题。感谢感谢
那就好,我给第二个步骤加了红色标注了,避免其他小伙伴也入坑 0.0
作者: 张小龙    时间: 2020-6-23
jack1699Mavic Air 26-23 08:07
噢,那就是说osdk4.0的话,usb和ttl两个接口都要连接咯,还是说只连接飞机的usb接口就可以实现所有功能呢
usb和ttl两个接口都要连接,才能使用全部功能。
作者: 张小龙    时间: 2020-6-23
OSdk学习者6-23 10:02
请问我如果用stm32f407ZGT6芯片,下载osdk3.9固件,需要进行移植操作吗
3.9不支持FreeRTOS,直接使用官方的sample即可,注意改下晶振频率,芯片型号即可。
作者: OSdk学习者    时间: 2020-6-25
张小龙6-23 14:39
3.9不支持FreeRTOS,直接使用官方的sample即可,注意改下晶振频率,芯片型号即可。
谢谢
作者: cgd1128    时间: 2020-7-13
请问如果使用STM32cubeMX生成的HAL库来开发osdk,这样可以吗
作者: kv886    时间: 2020-7-17
cgd11287-13 01:40
请问如果使用STM32cubeMX生成的HAL库来开发osdk,这样可以吗
应该可以吧,没试过,等大神来回答了。
作者: 张小龙    时间: 2020-7-20
cgd11287-13 01:40
请问如果使用STM32cubeMX生成的HAL库来开发osdk,这样可以吗
目前OSDK的STM32平台是基于STD库的,如果使用HAL库,你自己需要做很多移植性工作,工程量较大~~~
作者: cgd1128    时间: 2020-8-3
张小龙6-23 14:39
3.9不支持FreeRTOS,直接使用官方的sample即可,注意改下晶振频率,芯片型号即可。
请问怎么修改芯片型号,在哪里修改
作者: 机智の土拨鼠    时间: 2020-8-13
您好,我想请问下C:\Users\11414\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\DSP\Source\BasicMathFunctions\arm_abs_f32.c(113): error:  #147-D: declaration is incompatible with "void arm_abs_f32(float32_t *, float32_t *, uint32_t)"  (declared at line 2910 of "..\Lib\CMSIS\inc\arm_math.h")
这个重定义错误是因为我的CMSIS版本不对吗?
作者: 相信未来01    时间: 2020-11-25
cgd11288-3 11:13
请问怎么修改芯片型号,在哪里修改

作者: 相信未来01    时间: 2020-11-25
大神,咨询一个问题:我用正点原子的开发板运行样例程序,可以看到消息已经通过uasrt3发给了M300,但M300一直不回复,造成获取版本失败,握手不成功。我只链接了OSDK接口的uart, 同时按照文档说明B7,B8接地,B6悬空。M300也升级到了最新版FW。 DJI Assistant 2 上的串口带宽和开发板usart3设置的是一致的,设置完还重启了,但就是不能建立通讯连接。不知道下一步该怎么查了。
作者: OSdk学习者    时间: 2020-12-9
张小龙6-23 14:39
3.9不支持FreeRTOS,直接使用官方的sample即可,注意改下晶振频率,芯片型号即可。
大佬您好,我发现一个问题,就是用刚下载的SDK3.9,修改芯片信号后(我用的zgt6,默认下载的是VGT6?),编译工程时会报错,在工程下方多了两个启动文件,我把这两个启动文件删了就不会报错了。。但是最后串口打印输出乱码,不知道会不会跟这个有影响

作者: 张小龙    时间: 2021-1-28
https://bbs.dji.com/thread-244379-1-1.html
作者: 张小龙    时间: 2021-1-28
https://bbs.dji.com/forum.php?mod=viewthread&tid=246023




欢迎光临 大疆社区 (https://bbs.dji.com/) Powered by Discuz! X3.2