【BLE进阶日记】⑦嵌入式应用程序开发

【BLE进阶日记】专栏目录

第一章 BLE介绍
第二章 BLE协议基础知识
第三章 BLE–GAP (Advertising and Connections)
第四章 BLE–GATT (Services and Characteristics)
第五章 BLE硬件平台
第六章 BLE调试工具
第七章 嵌入式应用程序开发



前言

本专栏旨在提供对低功耗蓝牙的一个坚实的、实用的、高水平的理解:数据是如何组织的,设备之间如何相互通信,以及协议设计团队所
做出的关键设计决策和权衡。
1. 第1~4章提供了低功耗蓝牙技术的高级概述,解释了数据是如何组织的以及它的关键限制,同时也介绍了所有你在使用BLE时可能遇到
   的关键概念。
2. 第5~6章介绍用于开发或对支持ble的应用程序或设备进行测试的有用工具(包括硬件和软件)。这些章节集中在低成本,易于访问的
   工具,以帮助你开始低成本开发。
3. 第7章介绍了您可能为BLE使用的主要开发平台(用于产品设计和嵌入式硬件工程师的各种嵌入式电子平台)。
本专栏提供了示例代码,您可以免费在程序和文档中使用它。

本章介绍了编译嵌入式设备代码所需的工具。使用在第5章中讨论的nRF51822-EK,结合自由、开源的GNU工具链和ARM交叉编译器,你将创建一个心率监测示例,使其可以本地运行在nRF51822 SoC上。


一、BLE嵌入式开发简介

本章主要介绍了一些针对任何想要为蓝牙低能耗外围设备创建自定义固件的人可用的现成的和开源的嵌入式开发套件和平台。首先介绍了一个高级BLE API,该API利用了由ARM创建和维护的mbed开发平台。如果您对嵌入式开发不太熟悉,这是一个很好的选择,因为它不需要您熟悉如何自己配置嵌入式工具链或在最低级别上使用嵌入式硬件。大部分复杂的固件实现问题和设置问题都方便地隐藏在易于使用的在线工具和高级API中。

第二部分介绍了嵌入式工具链,即一组用于将标准源代码转换为在嵌入式处理器上运行的可执行二进制文件的工具集合。本节展示了如何在Windows、OS X或Linux上设置交叉编译工具链来构建ARM二进制文件。

本章的最后部分展示了如何在实际应用中使用这些工具和概念,利用Nordic的nRF51822片上系统进行示例项目,该示例项目可以使用标准的心率配置文件将心率数据传输到iOS或Android设备。

二、mbed BLE API

ARM和其合作伙伴公司为了使使用ARM Cortex处理器来开发嵌入式硬件尽可能简单,创建了一个开源的开发平台,称为mbed。mbed允许您编写可在多种支持的ARM处理器上运行,并利用构建在这些处理器之上的API和组件的可移植代码。

您也可以使用mbed与免费的在线协作开发工具以及各种离线商业和开源工具链和IDE。大量的工作已经投入到定义高级API上,这些API将大部分低级芯片细节抽象出来,这些细节可能会占用整体开发预算的大部分。这使得可以重复使用在社区中共享的开源软件组件,并使固件工程师能够更多地专注于项目特定的代码,而不是关于他们选择的微控制器(MCU)的低级实现细节。

对于本章的目的来说,与此相关的是,ARM最近在mbed平台中添加了一个BLE API,它允许您在几十行代码和几小时的工作中实现一个简单的GATT服务器,而无需考虑关于堆栈或芯片组的任何特定供应商细节。

mbed提供了一种简单的方法,可以让您快速启动一个概念验证产品,同时仍然使用一个可以后续转移到生产环境的平台(如果需要,可以将代码导出到离线编译器)。BLE周围的高级抽象意味着您不必花费很多时间学习有关您的BLE SoC或模块的具体细节。例如,实例化标准的BLE服务或特征只需一行代码:

GattService hrmService(GattService::UUID_HEART_RATE_SERVICE);
GattCharacteristic hrmRate(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR, 
2, 3, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
GattCharacteristic hrmLocation(GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR,
1, 1, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);

在编写本文时,mbed的BLE API仍处于测试版和积极开发中,但目前已经覆盖了大部分您可能需要的原型和概念验证产品的功能。有关mbed或其BLE API的更多信息,以及示例和更新,请参阅mbed项目网站。

三、嵌入式工具链

尽管mbed作为一种可行的嵌入式开发平台,从原型到量产都经过了明确的路径,但任何供应商中性的高级API或平台都必然会失去对低级实现细节的控制。通常,您会在代码和驱动程序的低级优化与易用性之间进行权衡。这种权衡在许多情况下都是有道理的,但显然不能适用于所有的嵌入式开发方法。

在产品设计领域,性能和控制往往比易用性更重要,许多工程师仍然更喜欢处理所有的实现细节,编写自己的低级驱动程序并设置自己的构建环境。编写自己的低级驱动程序显然需要更多的开发工作,但它也确保您对运行产品的代码具有最大的控制权。它还迫使您更加深入地了解处理器,并允许您更大程度上进行性能和成本优化。

对于嵌入式产品来说,能够完全优化代码的大小和性能非常重要。例如,优化代码大小可能允许您使用更小更便宜的处理器,从而节省2美元或3美元的物料费用,这轻松地可以转化为零售价格上的5美元到10美元甚至更多的差额。这样的节省可能会成为一个产品成功与否的关键,因为它可能会导致产品定价错误。控制最终代码大小和性能的最佳方法是完全控制您的编译器和构建环境,使您能够充分利用嵌入式处理器或SoC上的每个时钟周期。

为小型嵌入式处理器编译代码需要使用一种称为工具链的东西。顾名思义,工具链是用于构建可执行代码的一组工具,其中最重要的部分之一是交叉编译器。交叉编译器是在一个体系结构上运行(例如,使用x86指令集),但生成用于不同体系结构(例如,某个ARM变种)的代码。您可以选择商业和开源工具链中的多个商业和开源选项,但在本节中,我们将重点介绍一种开源解决方案。

近年来,GCC(作为GNU项目的一部分的免费开源编译器集合)在支持ARM方面取得了重大进展。这些进展大多与ARM在移动电话和平板电脑领域的统治地位有关(通常使用ARM Cortex-A处理器),但小型深度嵌入式处理器(例如ARM Cortex-M等)也受益于在这方面进行的巨大投资,因为指令集有重叠之处。

GCC广泛应用于各个行业,并且在任何现代操作系统和体系结构上都很方便使用。针对GCC的代码通常具有高度可移植性,您可以在Linux、OS X、Windows或几乎任何其他环境中构建相同的输出,而编译器输出几乎没有变化。后者是极其重要的,也是使GCC成为嵌入式开发的一个主要因素之一。GCC在当前ARM处理器上的表现非常出色,但某些商业编译器在某些任务上仍然表现更好。然而,没有商业工具链能够提供的是,您永远能够使用同一个编译器版本和依赖项重建固件的保证。如果商业工具链需要激活(因此需要激活服务器),但没有及时更新,它们可能无法保证在当前一代操作系统或个人电脑上运行。

如果您刚开始进行嵌入式开发,很容易忽视这个细节。嵌入式设备的寿命可能长达10年甚至20年以上,远远超过大多数软件包的寿命。您今天使用的商业工具和开发环境在10年后可能不存在,而且供应商可能在未来无法激活多年前您大量投资的过时产品。GCC为您提供了保证,您可以存档完整的交叉编译器源代码,包括任何库依赖项,以及您的固件代码,并知道您可以在未来的任何时间重新构建它们。

在非Linux PC上设置GNU工具链曾经是一项相当复杂的任务,但ARM现在通过提供预编译的、定期更新的GCC版本使其变得非常简单,包括易于使用的安装程序,可以处理许多混乱的细节。

设置ARM开发环境的第一步是下载最新的预构建GNU工具链。如下图所示,您可以下载适用于OS X、Windows和Linux的便捷安装程序,以及原始源代码和在其他平台上构建工具链的指南。

网站上提供的最新版本可能有所不同,但通常您应该选择最新的版本。ARM每个季度提供更新,通常将改进编译器和相关库,并生成更小或更高效的编译代码。

3.1、在OS X和Linux上安装GNU工具

如果您使用的是OS X或Linux,您只需要下载相应的安装程序并运行它。任何其他开发工具(如make、makefile中使用的各种命令等)很可能已经在您的开发机器上可用,或者很容易添加(在OS X上使用Xcode,在Linux上使用包管理器)。

您可以使用以下命令确认是否成功安装了GCC交叉编译器:

arm-none-eabi-gcc --version

在这里插入图片描述
您应该会得到以下类似的回应:

arm-none-eabi-gcc(GNU Tools for ARM Embedded Processors)4.8.3 20131129(发布)[ARM/embedded-4_8-branch revision 205641]
Copyright(C)2013 Free Software Foundation, Inc.

这是自由软件;请查看拷贝条件的源代码。没有任何保证,甚至没有适销性或特定用途的适用性。

如果看到这个输出,说明您的交叉编译器已经成功安装,您可以在开发机器上生成ARM二进制文件。

3.2、在Windows上安装GNU工具

如果您在Windows机器上进行开发,您需要下载适当的Windows安装程序,并以与任何其他安装包相同的方式运行它。

确保选择“将路径添加到环境变量”的后安装选项。这将确保工具链可以从任何地方访问,这通常在使用多个文件夹和文件位置时会更便捷。
在这里插入图片描述

如果一切都设置好了,类似于之前展示的OS X/Linux测试,你应该能够切换到命令行,并输入以下命令来查看你安装的GNU工具链的版本:

arm-none-eabi-gcc --version

与Linux和OS X不同,Windows通常不会拥有GNU工具链通常需要的一些附加命令行工具,比如make和一些*nix命令(如ls,cp等)来处理文件和目录。幸运的是,在Windows上安装这些附加工具很容易。GNU CoreUtils for Windows提供了你将需要的所有文件编辑命令的预编译版本。

下载完整的CoreUtils for Windows软件包(除源代码外),并运行安装程序。你还需要make,用来控制编译过程并把你的源代码转换成你可以在nRF51822上运行的有意义的东西。安装GNU Coreutils for Windows之后,下载并安装Make for Windows。

你可以通过切换到命令行并输入以下命令来测试make是否安装成功,这应该会得到一个版本号作为响应:

make --version

一旦这两个工具都安装好了,你应该拥有了在开发PC上交叉编译ARM代码所需的全部东西。现在,你可以开始使用nRF51822代码库和一个示例项目了。

四、nRF51822 GNU代码库和样例项目

在前一节中配置的ARM工具链可以让您为几乎任何使用ARM处理器的嵌入式设备构建二进制文件。但为了帮助您了解现实世界中与低级嵌入式开发相关的内容,以下简单项目是围绕Nordic的nRF58122-EK设计的,使用GCC和开源工具。虽然相同的原则和设计过程适用于任何其他嵌入式处理器,但您需要从芯片供应商或在线寻找启动代码和工具,以便与不同的微控制器或SoC一起使用。

代码库并不详尽,但它应该作为您自己项目的不错起点。它允许您在各种平台(Windows、OS X或Linux)上编译固件,并提供了一个基本的项目结构,应该易于理解和维护。

nRF51822 GNU代码库以及本书中的所有其他示例代码都托管在GitHub存储库中。值得看一下这个存储库,以获取最新的代码和在本书出版后可能添加的任何有关使用代码库的额外建议。

详细介绍Nordic的API和BLE协议栈超出了本章的范围,这值得单独编写一本书,但我们尽力保持示例代码尽可能简洁、清晰、精确和易于理解。下面的章节介绍如何设置您的PC,以及您需要开始使用此代码库的所有工具,并偏向使用易于安装的工具来构建一个简单的心率监测项目。

4.1、获取nRF51822 GNU代码库

nRF51822 GNU代码库可以在本书的GitHub仓库中找到,包括本书的所有示例代码。如果您使用的是Linux或OS X,您可能已经在命令行上拥有Git。要创建该代码库的本地副本,以便在代码库的更改时进行更新,只需执行以下命令:

git clone git@github.com:microbuilder/IntroToBLE.git

要获取代码的最新版本,请转到项目的根文件夹并输入以下命令:

git pull

如果您使用Windows,可以从预编译的二进制文件(例如msysgit)安装Git并运行上述命令。

如果您不喜欢使用Git或完全避免使用版本控制,也可以简单地在GitHub仓库中下载最新代码的压缩文件,然后点击“下载ZIP”。

4.2、nR51822 GNU代码库结构

一旦您拥有了nRF51822代码库的本地副本,您应该得到一个类似于下图的文件结构。
在这里插入图片描述

projects文件夹中包含示例项目。对于您基于此代码库创建的任何新项目,请在此处添加一个具有描述您项目的有意义名称的新文件夹。

为了帮助您入门,我们在hrm文件夹中包含了一个示例心率监测器项目。该项目实现了蓝牙SIG定义的标准心率服务。

tools文件夹是用于存储开发过程中使用的特定于操作系统的工具的便捷位置。将您的工具包含在此处可以确保它们被添加到您的版本控制系统中,并确保它们在将来的任何时刻都可用。您甚至可能希望将GNU工具链的二进制文件添加到此处,以避免在构建固件和进行调试时出现任何版本的混淆,这可能会使得数个月或数年后的调试更加困难。

lib目录应包含来自Nordic的SDK、SoftDevice和任何其他专有文件。由于许可问题,我们无法包含这些文件,因此您需要直接从Nordic的网站下载这些文件。

要从Nordic Semiconductor的网站上下载适用于nRF51822的SDK和适当的SoftDevice,您需要创建一个MyPages账户并注册产品包装上印刷的产品密钥。该产品密钥使您能够访问此芯片组的所有资源,因此请务必将该产品密钥妥善保管好,以备将来复用。

下载文件后,请按照如图所示的文件结构将其添加到lib目录中。
在这里插入图片描述

在将这些文件添加到项目中之后,您就可以准备编译您的第一个程序了。

4.3、编译项目

如果你已经正确设置了GNU工具链,包括ARM交叉编译器和任何关联的工具(如本章前面所述),那么编译应该很简单,只需在命令行中输入以下命令:

make clean release

这将使make工具解析makefile,makefile告诉编译器和工具链如何将你的文件夹中的源代码转换为能在目标硬件上运行的二进制映像。make命令启动makefile解释器,clean告诉make删除任何先前构建的构件,并以干净的状态开始任何交叉编译,release告诉make对代码进行优化,删除任何未使用的代码和额外的调试信息。

如果这是一个调试构建,你可以输入make clean debug,尽管这将生成更大的可执行代码,因为二进制数据包括更多的调试信息和未使用的代码通常不会被删除。

这表示所有.c文件已被转换为目标代码(扩展名为.o的文件),所有这些目标代码已被汇编,并且链接器已将所有这些数据合并到单个文件中(在本例中为ble_hrm_s110_xxaa.out)。

以下值是代表编译、汇编和链接后代码所占空间的大小(以字节为单位):

  1. text
    最终存储在闪存中的数据量,包括可执行指令和只读数据。这部分中的所有内容将被写入闪存。
  2. data
    已初始化数据使用的空间,这些是在启动时给定特定值的变量(例如int16_t i = 1023,该变量初始化为特定值)。这部分中的所有内容将存储在闪存中,然后复制到SRAM中,在大多数小型微控制器上,SRAM通常是宝贵的资源。
  3. bss
    未初始化数据使用的空间,这些是没有值被赋予的变量(例如int16_t i,该变量没有被赋予值)。这部分中的所有内容将在SRAM中分配。
  4. dec
    总数据大小,包括闪存和SRAM数据。

最后两行是一个有用工具arm-none-eabi-objcopy的输出,它将.out文件转换为其他文件格式,以便第三方工具更容易处理,其中包括Intel Hex,这是在嵌入式系统中常见的文件格式。

4.4、写入nRF51822

要将程序代码写入nRF51822-EK开发板上的非易失性存储器中,您可以使用Nordic的nRFGo Studio工具。该工具可以在Nordic网站的“MyPages”部分找到,就是您下载SDK和SoftDevice的地方。

nRFGo Studio目前仅支持Windows系统,但Roland King也开发了一款名为rknrfgo的OS X替代工具。这个非官方应用程序实现了nRFGo Studio部分功能,可使用简单易用的图形界面来编程nRF51822的闪存存储器。

您还可以使用Segger的J-Link驱动程序和相关工具,在Windows、OS X或Linux的命令行中直接编程nRF51822的闪存存储器。有关如何使用J-Link的文档和示例可在Segger的网站上找到。

如果这是您第一次使用开发板,您需要首先将SoftDevice的.hex文件写入闪存。这将把Nordic的BLE协议栈写入设备的闪存存储器的下半部分。要做到这一点,请在nRFGo Studio的“Program SoftDevice”选项卡中选择SoftDevice的.hex文件(该文件作为SoftDevice软件包的一部分从Nordic的网站下载),如下图所示。
在这里插入图片描述

SoftDevice通常只需要写入一次,除非您想更新到不同的版本。用户代码需要在每次更改程序时进行更新,但是这些用户代码通常不会影响SoftDevice,因为它们存储在闪存的不同区域中。

SoftDevice编写完成后,您可以使用之前生成的.hex文件和相同的nRFGo Studio工具将自定义应用程序代码写入存储器的上半部分,切换到“Program Application”选项卡,如下图所示。
在这里插入图片描述

此时,您的应用程序代码已写入nRF51822 SoC,应自动开始执行。应用程序代码可以调用底层SoftDevice进行任何BLE特定功能的调用,如果一切正常,您应该看到PCA10001开发板上的LED0闪烁。

您可以通过在支持BLE的手机或平板电脑上运行应用程序来测试编译的代码。首先,从Apple的App Store或Google Play下载Nordic的nRF Utility。安装该应用程序后,只需在主菜单中选择HRM,然后点击“Connect”,应显示类似于下图的内容。
在这里插入图片描述

如果您想详细查看nRF51822和应用程序代码在空中传输的内容,或者如果您觉得某些内容不正确,您还可以尝试使用第6章讨论的任何调试工具。

五、更进一步

嵌入式开发是一个广泛涉及各个领域的庞大领域。它涉及到物理学,包括无线电信号传播和天线设计;电子工程,包括硬件设计和零部件选择;机械工程和工业设计,包括外壳和整体产品开发;嵌入式软件开发,包括固件开发;制造知识,包括零部件采购和硬件组装;以及有效的测试和验证策略,以确保问题不会过早出现。

本教程仅涵盖嵌入式开发的一个非常小的部分,专注于固件设计。但如果你对设计和开发自己的嵌入式硬件感兴趣,不管你的技术背景如何,现在可能是一个绝佳的时机。成本有所下降,关于硬件和固件开发以及制造技术的信息从未如此易获取,并且整个在线生态系统围绕着这些技术存在。

如果你对深入从事嵌入式开发感兴趣,可以看一下一些多年来逐渐发展起来的优秀开源硬件社区,比如Adafruit或Make,还有每天发布新项目的Hackaday等网站。这样的社区可能会启发你的思路,或者让你接触到一些之前不熟悉的想法或技术。

此外,Nordic Semiconductor还有一个有用的Nordic Developer Zone论坛,可以成为解决与该芯片组合作时常见问题的良好资源。


总结

本章介绍了编译嵌入式设备代码所需的工具。使用在第5章中讨论的nRF51822-EK,结合自由、开源的GNU工具链和ARM交叉编译器,你将创建一个心率监测示例,使其可以本地运行在nRF51822 SoC上。

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值