zephyer系统在STM32F411-Nucleo平台上运行和基于openOCD的裸机调试环境搭建

来源:互联网 发布:win32系统编程电子书 编辑:程序博客网 时间:2024/05/17 02:33

zephyr系统是针对物联网应用而设计的一种“小”而“精”的实时操作系统内核,可以在cpu,rom和ram等资源非常有限的嵌入式平台上运行。 官方声称最小系统可以做到只占用2k FLASH, 8k ram, 目前最新的内核版本是v1.6.0. 由于收到intel,nxp等巨头的支持,在加上linux 基金会负责管理和开发,相信未来的应用前景应该是一片光明,zephyr社区目前非常活跃,每天都有新的bug报出来以及solution commit的提交,感兴趣的可以上它的官方网站。
http://www.zephyr.org
了解, 如果对开发感兴趣,也可以根据指导加入他的邮件列表,参与到大牛们的开发讨论中。 
我手头上有一块stm32f411-nucleo的开发版,官方是用来给开发者提供基于arm mbed os的应用开发的,但也收到最新的zephyr内核的支持, 所以本文主要 zephyr在ST-F411re平台上的hello-world的运行,接着介绍使用openOCD搭建裸机调试环境。闲话少述,马上进入主题。

F411RE比较方便的地方在于,这块平台集成了st-link调试器,所以不用在单独购买 jtag 仿真器,例如J-link, USB-blaser等等, 集成的st-link调试器能够帮助OpenOCD控制板上资源, 这种Case不是所有平台都支持的,例如我用的另外一个块开发版arduino_due就必须额外连接一个jtag仿真器才能进行裸机调试.

Step1. 下载内核源码。
mkdir stm32f411-nucleo && cd stm32f411-nucleo&& git clone https://gerrit.zephyrproject.org/r/zephyr
Zephyr代码由git托管并且通过gerrit来进行代码审查,保证了代码的质量。
我使用的是开发中最新的一个版本。

这里写图片描述

Zephyr目前只支持arc, x86, cm-3 nios有限的几个架构,不过现在已经够用了
Board/arm目录下,目前已经支持的所有平台列表,每个平台单独一个目录,结构清晰:

这里写图片描述

可以看到nucleo_f411re赫然在列

Step2: 安装sdk.
Sdk主要包括编译过程中要用到的 交叉gcc, ld, ar等等工具,其实也就是编译器gcc和 binutils, 除此之外, 还有qemu虚拟机以及本文接下来要用到的openOCD调试服务等等,总之,安装就对了。
下载安装方法, 本文使用的是最新版本:
wget https://nexus.zephyrproject.org/content/repositories/releases/org/zephyrproject/zephyr-sdk/0.8.2-i686/zephyr-sdk-0.8.2-i686-setup.run

增加执行权限:
Chmod a+x zephyr-sdk-0.8.2-i686-setup.run

运行安装:
./zephyr-sdk-0.8.2-i686-setup.run
安装过程中会让你选择安装路径, 我选择的是/home/user/zephyr-1.5.0/,这个没关系,可以自由选择。
个人认为, 官方提供的sdk提供的工具可以自己独安装, 不必依赖官方SDK.  Qemu , openOCD,
arm-none-eabi-xxx 工具链等等都可以在ubuntu下用apt-get安装。

Step4.配置内核:
首先,在用户主根目录下建立.zephyrrc文件并编辑:

这里写图片描述

设置环境变量指向sdk cross-toolchain, 编译的时候要用到。
然后进入到源码根目录,执行:
Source ./.zephyrrc
Source./zephyr-env.sh

这里写图片描述
Step5 编译内核。
Zephyr完全复用了linux的kbuild系统,所以对Linux编译框架很熟悉的很容易上手, 我大概看了一下几个关键的Makefile , 感觉除了版本号,内核名等改成了zephyr的特性之外,其余是完全copy过来,编译逻辑更是完全一样。
Zephyr提供了很多的测试用例,先来个最简单的。 进入到./samples/hello_world/目录, 执行:
make BOARD=nucleo_f411re flash

这里写图片描述

编译过程产生的中间文件和编译结果全部保存在outdir目录中,其中就包含含有符号表,调试信息的zephyr.elf文件。 简单的命令,编译,烧写一步到位,后面我们讲看到,烧写只是调用了/zephyr/scripts/support/openocd.sh脚本,脚本里面使用openocd将binary烧录到soc片内flash中。

当然, 前面说既然和linux的Kbuild方式几乎完全一样, zephyr也支持menuconfig配置,只要在刚才的hello_world目录执行 make BOARD=nucleo_f411re menuconfig 命令, 就会出现类似的配置界面:

这里写图片描述

刚才我们绕过这条命令直接编译, 是因为默认情况下会通过merge.sh脚本将平台默认的defconfig和prj.conf进行合并, 然后调用conf通过参数 –olddefconfig 生成默认配单。 这点和linux也是一样的。
Step6:
 接下来,应该能通过串口看到现象了, 这里要注意的是F411re使用的是uart-转usb口, 所以要通过/dev/ttyACM0节点来看串口打印。

这里写图片描述

平台测试完成, 接下来建立裸机调试环境。

裸机调试环境搭建:
Step1: 进入源码根目录,执行/home/user/zephyr-1.5.0/sysroots/i686-pokysdk-linux/usr/bin/openocd -s /home/user/zephyr-1.5.0/sysroots/i686-pokysdk-linux/usr/share/openocd/scripts -f /DISK0/WorkSpace/stm32f411-nucleo/zephyr/boards/arm/nucleo_f411re/support/openocd.cfg

这里用到了sdk包中的openocd命令, 

这里写图片描述

可以看到openocd已经启动成功,此时,后台已经启动了两个端口监听客户连接,
Step2:telnet 4444端口。
 新开一个shell, 执行telnet localhost 4444命令:

这里写图片描述

Step3:启动gdb会话:
安装arm-none-eabi-gdb调试工具, 如果安装遇到文件依赖冲突的问题,可以用下面的命令强制安装:
sudo apt-get -o Dpkg::Options::=”–force-overwrite” install gdb-arm-none-eabi
安装成功后, 新开一个终端,执行arm-none-eabi-gdb ./outdir/nucleo_f411re/zephyr.elf

这里写图片描述

接着,执行target remote 127.0.0.1:3333 然后回车:

这里写图片描述

可以看到,系统已经在_reset异常入口出断住,等待gdb输入交互命令, 这里可以看到汇编指令了, 接下来可以设置观察点,断点了,和通常的GDB 用法毫无二致。

这里写图片描述

附图:
 下图是一个调试系统的例子,本文介绍的调试系统没有使用类似OpenJTAG这样的仿真器, 调试PC和 F411RE直接通过usb线链接,平台上可能有替代ICE的桥梁作用的模块, 具体没有仔细研究还不清楚。 另外,上位机这里可以使用eclipse,这本身属于UI界面的范畴, 这里不做论述。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

0 0
原创粉丝点击