AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境

文章目录

  • 1 前言
  • 2 AliOS Things入门知识
    • 2.1 AliOS Things代码仓库的组织架构
    • 2.2 AliOS Things文件夹目录树
    • 2.3 AliOS Things开发与调试方式
  • 3 AliOS Things MDK环境搭建
    • 3.1 aos-cube自动生成MDK
      • 3.1.1 AliOS Things 2.1版本KEIL工程
    • 3.2 手动新建MDK工程
  • 4 搭建AliOS Things第一个MDK工程
    • 4.1 AliOS Things系统所需基础依赖文件
    • 4.2 可能遇到的问题
      • 4.2.1 core文件路径找不到
      • 4.2.2 soc_init.c路径找不到
      • 4.2.3 stm32库路径重命名
      • 4.2.4 新增board文件夹
      • 4.2.5 新增arch common文件夹
      • 4.2.6 头文件找不到
      • 4.2.7 sct文件未定义
      • 4.2.8 SysTick_Handler重定义
      • 4.2.9 PendSV_Handler重定义
      • 4.2.10 main入口在哪里
      • 4.2.11未定义aos api接口文件
      • 4.2.12 内核初始化文件未定义
      • 4.2.13 wifi.h文件未定义
      • 4.2.14 启动文件.s文件未定义
      • 4.2.15 port_s.S汇编代码嵌入C代码异常
  • 5 参考
  • 附件

1 前言

随着2016年NB-IoT技术标准的冻结,物联网(IoT)整个领域迎来新一轮的快速发展,行业机构预测物联网技术(IoT)在2017~2021期间将持续火爆。同时随着大数据、云计算、IoT技术等进一步发展与成熟、芯片存储成本的降低、IoT应用的快速普及等等,物联网RTOS作为IoT设备的基础软件,在一定程度上可以破解物联网下游的碎片化困局,加快下游物联网应用的开发进程,因此再次焕发新生。
物联网RTOS相比嵌入式RTOS(linux、安卓…)面向的应用范畴更为广泛,但是目前阶段,物联网终端应用很多都是基于MCU的裸机开发(Bare-metal)模式,而基于MCU开发,国内开发者更多是基于Window系统,习惯使用的开发工具是IDE(KEIL\IAR等),而不是linux的命令行方式。基于两种平台的开发方式各有千秋,主要还是看个人技术积累与使用习惯。
本文主要描述了基于Window系统,使用STM32L476与MDK5来搭建Alios Things(以下简称为 AOS )系统的基础软件开发环境。主要内容涉及:

  1. AliOS Things 2.1.0代码仓库的组织架构说明
    a. AliOS Things MDK开发调试方式
  2. 基于STM32L与MDK搭建AliOS Things的软硬件开发环境搭建
    a. AliOS Things MDK工程生成方式
    b. STM32L476RG-Nucleo的hello world MDK工程搭建实例

2 AliOS Things入门知识

2.1 AliOS Things代码仓库的组织架构

AliOS Things源代码组织架构符合分层架构与组件化架构。

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第1张图片

AliOS Things架构至下(层)而上(层),分别是

  1. 板级支持包(BSP):主要由SoC供应商开发和维护
  2. 硬件抽象层(HAL):比如WiFi和UART、SPI
  3. 内核(Kernel):包括Rhino实时操作系统内核、Yloop, VFS, KV 存储…
  4. 协议栈(Protocol Stack):包括TCP/IP协议栈(LwIP),uMesh网络协议栈,Bluetooth、LoRaWAN…
  5. 安全(Security):安全传输层协议(TLS),可信服务框架(TFS)、可信运行环境(TEE)
  6. AOS API:提供可供应用软件和中间件使用的API…
  7. 中间件(Middleware):包括常见的物联网组件和阿里巴巴增值服务中间件,比如AT组件、Alink、MQTT、Udata…
  8. 示例应用(App):阿里自主开发的示例代码,以及通过了完备测试的应用程序(比如helloworld、Alinkapp)

2.2 AliOS Things文件夹目录树

AliOS Things源代码主要托管在Github上,可以从github下载的源码 AliOS Things latest version,截止2019年6月份,当前最新release版本为2.1.0 https://github.com/alibaba/AliOS-Things/tree/rel_2.1.0

git clone https://github.com/alibaba/AliOS-Things.git

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第2张图片
AOS源代码目录树 - AliOS Things 2.1.0文件夹架构

分层 所属文件夹 说明
APP app 该目录下包含了example 代码示例,通过了完备测试的应用程序(比如Alink)
APP project IDE工程目录。比如KEIL、IAR、GCC、e2studio
APP test UT测试用例
APP utility IoT通用软件库,比如 cJSON
APP include 该目录下包含了AliOS Things内核、各组件的头文件
中间件 middleware IoT 通用组件,主要有
- linkkit
- udata
- ulocation
- uagent
AOS API osal AOS API,提供可供应用软件和中间件使用的API
安全组件 security 包括TLS,TFS, TEE在内的安全组件
应用驱动 drivers 该目录下包含了应用驱动代码,主要有
- sensor
- sal
- gprs
- wifi
网络连接 network 该目录下包含了当前支持的网络协议栈
- bluetooth
- breeze
- bt_host
- bt_mesh
- canopen
- lwip
- lorawan
- umesh
- nal
- atparse
- athost
- netmgr
- yloop
- …
AOS内核 kernel 该目录下包含了Rhino、命令行(CLI)
HAL board 实际硬件开发平台,包括评估板、用户自己的硬件平台等(如STM32L496G-Discovery)
BSP platform 该目录下包含了mcu与arch文件夹
- mcu
- 该目录主要存放厂商提供的芯片底层软件库代码(如STM32L4xx_cube库),主要由SoC供应商开发和维护,以及二进制文件,如系统启动、驱动、编译/链接脚本等。mcu下的目录结构按“厂商/芯片系列”进行区分
- arch
- 主要存放硬件体系架构所需要的移植接口实现文件,如任务切换、启动、开关中断等(即arch/include/port.h中所定义的接口),硬件体系架构如arm、risc-v、linux、misp…
- 示例(armv7m):- 头文件:arch/arm/armv7m/gcc/m4/port*.h,代码示例。
- 源代码:arch/arm/armv7m/gcc/m4/下的.c文件和汇编文件,代码示例。
- 注:arch下的目录结构按CPU架构区分,请参照已有目录。
Tool build 编译框架,包含了ucube.py、makefile、编译规则、编译py脚本等文件
Tool tools 用于建立远程设备中心的testbed工具、doxygen生成文件

2.3 AliOS Things开发与调试方式

AliOS Things支持多种调试手段,针对不同的功能模块,不同的使用场景,开发者可以根据需要自己选择:

  • linux host模拟环境:适合于硬件无关的模块或者代码,可以使用gdb,valgrind等流行的工具
  • CLI环境:适合板上轻度调试,使用系统的各种内存调试工具
  • JTAG环境:适合板上调试,利用硬件调试能力与IDE功能(MDK\IAR\AOS Studio)本身提供的在线调试功能

具体可参看《AliOS-Things调试概述 Debugging-Overview》

3 AliOS Things MDK环境搭建

AliOS Things MDK环境搭建目前可以有两种方式,一种是通过aos-cube工具(aos-cube 是 AliOS Things 在 Python 下面开发的项目管理工具包)通过aos make等构建命令自动生成MDK工程,另外一种是使用MDK自己新建工程,添加项目文件。

AliOS Things uCube ≈ RT-Thread ENV (都是基于命令行的项目管理工具包)
目前这块RT-Thread支持的比较成熟,通过ENV工具的Scons快速编译生成KEIL工程,同时对于新的平台,也可以通过现有的文件,快速修改得到。

3.1 aos-cube自动生成MDK

Alios-things 支持将特定的目标转化成keil和iar来进行开发。自动生成keil或iar工程的命令就是在原有构建命令的基础上加上 IDE=keil 或 IDE=iar 的选项,会自动生成一个keil工程或者iar工程。构建命令:

aos make mqttapp@b_l475e IDE=keil
aos make mqttapp@b_l475e IDE=iar

当前使用aos-cube工具自动生成MDK的板子还比较少,具体可以参看《AliOS-Things自动生成KEIL\IAR工程 Auto-generate-keil-iar-project》这篇文章

支持情况

  1. 目前支持 b_l475e 和 startkit 两个board工程自动生成。其他stm32系列的自动生成的工程可能需要人为做一些修改。
  2. 转化出的工程默认未开优化选项
  3. 工程内存信息,可能与board实际的有所差别,需要完善

3.1.1 AliOS Things 2.1版本KEIL工程

从2.1.0版本,keil目录下已经不再包含示例工程,是通过aos-cube工具自动生成。

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第3张图片

3.2 手动新建MDK工程

虽说是手动搭建新工程,但最好还是找到源代码版本一致情况下的KEIL模板工程或者相似平台(比如采用上述提到的“aos-cube自动生成MDK”工程),直接复制,重命名,然后再根据实际修改。
因为AliOS Things最新发布2.1.0代码库中,KEIL默认采用自动生成方式,project目录下里面没有包含KEIL工程,当前采用的办法是参考之前版本(包含了KEIL示例工程)(可以到develop等分支下载),由于AliOS Things 2.1.0版本与之前版本对文件目录结构等做了不少调整,因此不能直接使用,需要适当修改。
相比于之前版本,2.1版本的变化如:

  • 从直接mcu文件夹中分离出board相关文件,放在新增加了board文件夹内,这样有利于共用mcu中的文件
  • kernel文件夹删去子文件夹core分类
  • arch增加了common文件夹,用来存放port_c.c
  • 新增了osal文件夹,用于存放aos api文件

接下来第4部分内容,将详细说明MDK工程的搭建过程与可能遇到的问题。

4 搭建AliOS Things第一个MDK工程

以手动搭建AliOS Things 2.1.0版本中 STM32L476RG-Nucleo的hello world MDK工程为例
首先直接拷贝之前版本的AliOS-Things\project\STM32L476RG-Nucleo\helloworld到2.1.0相同路径下面

4.1 AliOS Things系统所需基础依赖文件

基于MDK与STM32L4,AliOS Things 2.1.0系统所需的基础依赖文件主要包括如下内容,下面具体展开的是移植中比较容易出错的部分文件:

  • 具体应用文件
    • example
      • helloworld
  • AOS API文件,应用层或者中间件通过这层API接口访问内核
    • osal\aos
      • rhino.c
        • aos_init初始化入口
        • aos_start 内核启动入口
        • aos_msleep 系统延时
        • *aos_malloc、aos_free…
  • 具体硬件平台文件
    • board\STM32L476RG-Nucleo
      • 启动文件startup_stm32l476xx_keil.s
      • 分散加载文件STM32L476RGTx_FLASH.sct
    • board\STM32L476RG-Nucleo\aos
      • 内核特性移植与裁剪文件k_config.h,通过修改k_config.h来使能kernel的功能模块
  • 堆分配等文件
    • utility\libc\compilers\armlibc\armcc_lib.c
  • 内核特性移植相关文件.soc_impl.c、aos.c
    • platform\mcu\stm32l4xx\aos
      • soc_impl.c里面必须要实现的是内存分配这块的配置g_mm_region
      • aos.c包含了main入口函数
  • 内核文件
    • kenerl\rhino
      • 内核初始化文件
        • kernel\rhino\core\init\aos_init.c
  • 面向板级的HAL驱动文件
    • platform\mcu\stm32l4xx_cube\hal
  • STM32L4 cube库文件
    • platform\mcu\stm32l4xx_cube\Drivers\STM32L4xx_HAL_Driver\Src
  • 硬件体系架构所需要的移植接口实现文件
    • platform\arch\arm\armv7m\armcc\m4\port_s.S
    • platform\arch\arm\armv7m\common\port_c.c

4.2 可能遇到的问题

打开STM32L476RGTx.uvprojx工程,会发现有左边的工程文件很多感叹,主要是因为文件路径发生变化,可以对STM32L476RGTx.uvprojx使用文本编辑器打开(比如Sublime Text3…),将相关出现感叹号的文件替换为新版本的对应路径。
具体方法是:

  1. 点击出现感叹号image.png的文件,会弹出提示框,根据对应当前老版本的文件路径调整,然后修改为新版本AliOS Things 2.1.0下的对应路径
  2. 如果刚上手不熟悉AliOS Things,如何找到AliOS Things 2.1.0下的对应.c、.h文件路径?
  3. 一种方式是在AliOS Things的github代码仓库搜索,github提供了非常强大搜索功能
  4. github搜索示例:AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第4张图片
  5. 在文本编辑器中修改了STM32L476RGTx.uvprojx,保存后,切换会MDK工程,MDK会自动重载STM32L476RGTx.uvprojx中修改的文件。如果修改顺利,则可以看到文件的感叹号已有消失了。

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第5张图片

4.2.1 core文件路径找不到

    ![image.png](https://cdn.nlark.com/yuque/0/2019/png/253586/1559173436777-2bdae2ec-6009-4ca7-9dc1-f2a0c4f00c11.png)

错误原因:由于2.1.0删去了core文件夹
解决方式:

\kernel\rhino\core
修改为
\kernel\rhino

image.png

4.2.2 soc_init.c路径找不到

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第6张图片 错误原因:2.1.0文件结构调整
解决方式:

原始
\platform\mcu\stm32l4xx\src\STM32L476RG-Nucleo\helloworld
修改为
\board\stm32l476rg-nucleo\aos\

4.2.3 stm32库路径重命名

    ![image.png](https://cdn.nlark.com/yuque/0/2019/png/253586/1559173743846-a9cdf53e-7059-4b51-bbcf-ebff13a6f145.png)

错误原因:stm32库文件重命名
解决方式:

\mcu\stm32l4xx\Drivers\
修改为
\mcu\stm32l4xx_cube\Drivers\


AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第7张图片

错误原因:stm32库文件重命名
解决方式:

\platform\mcu\stm32l4xx\aos
修改为
\platform\mcu\stm32l4xx_cube\aos\

4.2.4 新增board文件夹

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第8张图片
错误原因:新增board文件夹
解决方式:

\platform\mcu\stm32l4xx\src\STM32L476RG-Nucleo\修改为
\board\stm32l476rg-nucleo\

4.2.5 新增arch common文件夹

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第9张图片
错误原因:新增arch common
解决方式:

\platform\arch\arm\armv7m\armcc\m4
修改为
\platform\arch\arm\armv7m\common

4.2.6 头文件找不到

问题:

…\platform\mcu\stm32l4xx_cube\Drivers\STM32L4xx_HAL_Driver\Inc\stm32l4xx_hal.h(46): error: #5: cannot open source input file “stm32l4xx_hal_conf.h”: No such file or directory

解决方式:

添加board子路径
…\board\stm32l476rg-nucleo\Inc


问题:

…\kernel\rhino\include\k_api.h(16): error: #5: cannot open source input file “k_config.h”: No such file or directory

解决方式:

添加board子路径
…\board\stm32l476rg-nucleo\aos


问题:

…\kernel\rhino\include\k_api.h(19): error: #5: cannot open source input file “k_types.h”: No such file or directory

解决方式:

添加common子路径
…\platform\arch\arm\armv7m\common


问题:

…\kernel\rhino\k_err.c(5): error: #5: cannot open source input file “debug_api.h”: No such file or directory

解决方式:

添加路径
…\kernel\debug\include


问题:

…\kernel\debug\include\debug_api.h(16): error: #5: cannot open source input file “debug_dft_config.h”: No such file or directory

解决方式:

添加路径
…\kernel\debug


问题:

…\board\stm32l476rg-nucleo\aos\soc_init.c(15): error: #5: cannot open source input file “hal_uart_stm32l4.h”: No such file or directory

解决方式:

…\board\stm32l476rg-nucleo\hal


问题:

…\platform\mcu\stm32l4xx_cube\aos\aos.c(5): error: #5: cannot open source input file “aos/kernel.h”: No such file or directory

解决方式:

…\include\aos


问题:

…\platform\mcu\stm32l4xx_cube\aos\aos.c(5): error: #5: cannot open source input file “aos/init.h”: No such file or directory

解决方式:

…\kernel\init\include

4.2.7 sct文件未定义

问题:

STM32L476RGTx\STM32L476RGTx.axf: error: L6031U: Could not open scatter description file …\board\stm32l476rg-nucleo\STM32L476.sct: No such file or directory

解决方式:
>在工程的Options选项中,重新设定.sct路径AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第10张图片

4.2.8 SysTick_Handler重定义

问题:

STM32L476RGTx\STM32L476RGTx.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by stm32l4xx_it.o and soc_init.o).

原因:

soc_init.c定义了SysTick_Handler实现OS系统心跳,上下文切换

解决方式:

工程中删去stm32l4xx_it.c文件

4.2.9 PendSV_Handler重定义

问题:

STM32L476RGTx\STM32L476RGTx.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port_s.o and stm32l4xx_it.o).

原因:

port_s中定义了PendSV_Handler实现上下文切换

解决方式:

工程中删去stm32l4xx_it.c文件

4.2.10 main入口在哪里

问题:

STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol main (referred from entry9a.o).

原因分析:

  1. AliOS Things之前版本是放在具体的应用中,rhinorun.c中
  • int main(void)
  1. 2.1.0 开始放在AliOS-Things\platform\mcu\stm32l4xx_cube\aos\aos.c,放在通用库中,因此应用层代码可以统在application_start()处理

4.2.11未定义aos api接口文件

问题:

STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_free (referred from armcc_libc.o).

STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_malloc (referred from armcc_libc.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_realloc (referred from armcc_libc.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_init (referred from aos.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_start (referred from aos.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_msleep (referred from helloworld.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_mutex_free (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_mutex_is_valid (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_mutex_lock (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_mutex_new (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_mutex_unlock (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_sem_free (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_sem_is_valid (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_sem_new (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_sem_signal (referred from hal_uart_stm32l4.o).
STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_sem_wait (referred from hal_uart_stm32l4.o).

原因:

AliOS Things 2.1.0版本封装了一层AOS API接口,方便上层调用内核相关功能,增加osal\aos的rhino.c文件

解决方式:

增加osal\aos\rhino.c文件
image.png

4.2.12 内核初始化文件未定义

问题:

STM32L476RGTx\STM32L476RGTx.axf: Error: L6218E: Undefined symbol aos_components_init (referred from aos.o).

解决方式:

增加kernel\rhino\core\init\aos_init.c文件

    ![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAxOS9wbmcvMjUzNTg2LzE1NTkyNTc4NTM5NzgtNzM4Yjg1NTEtYjU1MC00YmJiLWExOGItMzFlM2I1M2ZmMzFlLnBuZw?x-oss-process=image/format,png)

4.2.13 wifi.h文件未定义

问题:

…\kernel\init\aos_init.c(13): error: #5: cannot open source input file “hal/wifi.h”: No such file or directory

解决方式

增加路径 …\include\network

4.2.14 启动文件.s文件未定义

问题:

…\board\LR-Assistant-L476\STM32L476RGTx_FLASH.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.

原因:

工程中没有添加xx_startup.s启动文件

解决方式:

双击左边工程框的文件夹,添加Startup开头的.s文件即可,比如本文使用到的startup_stm32l476xx_keil

4.2.15 port_s.S汇编代码嵌入C代码异常

问题:

AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第11张图片

port_s.S中引入了宏语言
AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第12张图片
原因:

使用GCC可以通过.S后缀识别,来进行预处理,但是armcc默认不行,需要其他参数设定

解决方式:

简单的一种处理方式是在MDK工程中,根据实际宏定义功能需求,屏蔽相应的C代码(宏定义、投入)

5 参考

  • AliOS-Things技术架构 AliOS Things Technical Overview
  • AliOS Things内核驱动移植指导V2.1 Kernel and driver porting guide
  • AliOS Things Rhino内核移植指导 AliOS-Things-Rhino-Porting-Guide
  • AliOS Things与FreeRTOS移植指导 AliOS Things FreeRTOS Porting Guide.zh
  • AliOS-Things 2.1版本板级支持目录规范
  • AliOS-Things调试概述 Debugging-Overview
  • AliOS-Things自动生成KEIL\IAR工程 Auto-generate-keil-iar-project
  • AliOS Things 2.1构建与配置 AliOS Things Build Configuration
  • AliOS Things Windows开发环境设置 AliOS Things Windows Environment Setup

附件

AliOS Things + MDK + STM32L4 + Hello world工程 下载链接
https://download.csdn.net/download/nich2009/11823335
AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境_第13张图片

你可能感兴趣的:(IoT,RTOS)