分类:cc2640r2f

ti-rtos 异常解密

详细介绍基于ti-rtos高级调试组件rov用以cc1310/cc2640 等sdk异常主动调试。

正常的,程序会进入IDLE模式,程序会停留在(0x10001486),也就是IDLE模式;通常的,在我们完成我们程序功能时候,不可避免会遇到程序运行至一个死循环。如下图所示:这个时候,我们要考虑程序异常了。

  • swcu117d-CC13xx, CC26xx SimpleLink Wireless MCU Technical Reference Manual.pdf
  • swru393c-CC2640 and CC2650 SimpleLink Bluetoothlow energy Software Stack 2.2.0.pdf ->Chapter 9.8 Deciphering CPU Exceptions Page.157
  • http://docs.leconiot.com/cc2640r2f/debugging

导致异常的原因可以在 View->Registers CFSR寄存器的CPU_SCS 组中确定。最常见的异常有以下几个原因:

  • 栈溢出;
  • NULL 空指针被写操作应用;
  • 外设模块在没有供电的情况下操作;

对于任务栈溢出,我们可以通过TI-RTOS->Task->Detailed 分析任务栈使用情况。但是IAR这里报错了。

通过TI-RTOS->BIOS->...

ble5.0 蓝牙协议概述

从这部分开始详细介绍蓝牙协议栈功能、接口、协议栈工程关联、实现协议栈的文件和任务,该任务也作为协议栈应用的最高优先级任务。TI 采用库文件的方式作为协议栈的一个主策略,尽管如此,还是需要开发者了解协议栈各个抽象的功能和相互作用。

蓝牙 5.0 核心规范包含 LE 和 BR/EDR 两种设备类型,其中 LE 主要是设计为低功耗、小数据终端产品。BLE5.0 核心主要包含以下功能:

  • 2M Sym/s PLY 层设计(2M Symbol Rate 物理层)。
  • LE 信道选择算法 #2
  • LE 安全连接
  • LE 数据长度扩展
  • LE 隐私
  • LE LCAP 面向连接的信道支持
  • LE 链路层拓扑结构
  • LE Ping
  • 从机功能扩展
  • 连接参数请求

以上功能均在蓝牙 5.0 协议栈实现,并且可以选择编译。

如图 1 ,蓝牙协议栈包含一个 Host 和 Controller 两个逻辑实体。这种区分从经典蓝牙的 BR/EDR 就存在了,各种功能独立实现,任务配置文件和应用相关都在 Host 的 GAP、GATT 抽象层。

图1. 协议栈基础

BLE 工作在无需认证的 2.4G 免费频段,该频段广泛应用于 ISM(工业、科学、医疗)领域。BLE 通过跳频通信实现抗干扰特性,是 GFSK 调制信号,它采用 1Mbps 码元率 PHY 层设计,可以实现 1Mbps 波特率通信。BLE5.0 优化的物理层设计可以实现 2Mbps 的 PHY 层。

simple_peripheral 应用框架

本章节将详细讲解 CC2640R2F BLE5.0 的应用程序框架,我们希望您已经按照学习线路图储备了 CC2640R2F平台的软硬件架构知识 ,明白应用工程区分 App 和 Stack 工程管理。本章主要内容是围绕基于 TI-RTOS 的 App 应用程序框架。

图1. 应用程序框架图

以 simple_peripheral Demo 应用程序部分为例,包括以下内容:

  • Pre-main initialization
  • ICall
  • Simple Peripheral Task
  • Intertask Messages

main 函数包含在 IDE Startup 文件夹的资源文件 main.c 中。作为程序的入口,主要完成全局中断禁止、外设驱动初始化、电源管理、TI-RTOS 任务创建或构造、在启用 SYS / BIOS 内核调度时完成全局中断使能。main 函数不返回,将在整个项目生命周期内保留其资源。

基本 main.c 功能。

软件架构章节阐述了由于历史兼容原因会把整个应用工程区分 App 和 Stack 两个工程管理。因此,无法采用常规 API 调用和全局变量方式完成消息传递,App 和 Stack 之间的通信就需要重新考虑了。TI 引入了 ICALL 消息机制完成 App 和 Stack 独立工程管理的相互通信,接下来就着重理解原理和代码实现。

Indirect Call Framework (

Generic Access Profile (GAP)

GAP 分层负责设备建立连接的相关功能,包括设备发现、数据链路建立、终止、初始化安全管理和设备配置,参见下图 1 。

图1. GAP 分层的建立连接的示意图

在 Standby 状态,双方设备都处于未连接状态。Advertiser 尝试广播数据,Scanner 接收到广播数据后尝试进行扫描请求,并且得到扫描回复。此时 Scanner 产生连接意图,转变成 Initiator 发送连接请求,成功连接后发送广播的 Advertiser 作为 Master ,进行连接请求的 Initiator 成为 Slave。

  • Standby:复位后设备处于初始空闲状态。
  • Advertiser:设备正在通过特定数据进行广告,让任何 Initiator 设备知道它是可一个连接设备(此广告数据负载可以包含设备地址和一些其他数据,如设备名称)。
  • Scanner:扫描设备收到广告后,向广告客户发送扫描请求。广播者响应扫描响应。这个过程称为设备发现。当然扫描设备已经知道广告设备可以发起与其的建立连接。
  • Initiator:启动时,启动器必须指定要连接的对等设备地址。如果接收到与对等设备地址匹配的广告,则发起设备发送连接请求,该请求包含与广告设备连接所需的连接参数。
  • Master/Slave:当连接形成时,广播的发起者作为 Slave ,Initiator 建立者作为 Master。
  • Advertiser 进行广播

  • Scanner...

Generic Attribute Profile (GATT)

GAP 层负责连接相关的功能,GATT 主要是负责在两个已经连接的设备之间进行交互数据。GAP 层把 BLE 设备区分为主机 Master(Central)和从机 Slave(Perpherial),在 GATT 层则区分为 Server 和 Client 。客户端读取和写入存储在服务端的特征值( Characteristics )。

Server 该设备包含由 GATT 客户端读取或写入的 characteristic。

Client 从 GATT 服务器读取或写入数据的蓝牙设备。

图1. Server 和 Client

GATT 层的 Profile、Service、Characteristics、Attributes 概念一定要深入理解,因为一旦建立连接后,不管是嵌入式端还是应用端进行数据交互的都是这些概念。为了帮助理解,抽象以下包含关系:

图2. GATT 层四种概念之间的抽象包含关系

如图 2 ,一个或者多个 Characteristic 组成一个 Service。一个多个 Service 组成 Profile。Characteristic 又由多个 Attributes 组成。每个 Attribute 由包含 Handle、Type、Permissions 三个属性。

下面着重理解 Characteristic,它是数据交互的最终实体,每个特征包含以下 4 个 Attribute...

LE Data Length Extension

数据长度扩展( LE Data Length Extension )功能允许 LE 控制器在连接状态下发送高达 251 字节的 PDU,在连接期间的任何时刻,主从设备可以协商该 PDU 大小。

对比 BLE4.0/4.1 的控制器数据通道最大有效载荷为 27 字节,使能数据扩展功能后的 BLE4.2/BLE5.0 能够达到 251 ,数据速率提高了大约 2.5 倍。

一旦建立连接,控制器将以两种可能的方式之一进行操作:

  • 如果在连接之前,PDU 大小和传输时间都被设置为默认值(即 TX 和 RX 都为 27B,328us),则 CC2640R2F 将不会发起数据长度交换命令(即 LL_LENGTH_REQ 不发送)。

    如果对等连接的主从设备发送 LL_LENGTH_REQ ,此时对等设备同样以默认大小 LL_LENGTH_RSP 回应。

  • 如果在连接之前,PDU 的大小和传输时间收发双方或者有一方不是默认值,则设备的 LE 控制器将使用 LL_LENGTH_REQ 和 LL_LENGTH_RSP 控制 PDU 协商,选择一个较大的 PDU 有效负载。

    数据长度更新可由 Host 发起或 Controller 自主执行,主机或从机可以启动该过程。

数据长度更新过程完成后,两个控制器都会根据两个参数选择新的数据长度:PDU 大小和传输时间,同时被主从设备支持的最大长度将会被选择。考虑到时间来支持不同的数...

BLE一次能传多少数据(ATT_MTU设置/LE Data扩展)

BLE 到底一包能够收发多少数据是很多开发者都会关心的。我们知道 BLE 5.0 物理层设计 2Mpbs 的码元率,实际数据传输速率远远到不了这个级别。主要原因是无法直接单次发送 1M 或者 1K 数据,必须按照我们知道的 ATT_MTU 作为最大值进行拆包发送,不断拆包的过程中导致整体蓝牙有效数据吞吐量下降。本章节,我们实用性出发研究如何究竟蓝牙一包能够发送多少数据。

以下是 GAPP Client 进行特征值写请求的完整抓包,AttValue 表示写入的值,该值的最大长度到底是多少呢?本文将详细研究并且验证。

本文的正确打开姿势,我们希望你已经仔细阅读并理解协议栈的 L2CAP,和 BLE4.2/5.0 全新支持的 LE 数据扩展功能。

在 BLE PHY 包格式由以下组成:排除 前导码、访问地址、CRC 地址 对于 BLE4.0/BLE4.1 上层协议(LL)最大可以包含 39 字节长度的 PDU(协议数据单元)。

更新后的 BLE4.2/BLE5.0 直接升级硬件将这一长度扩展到 257 ,默认了兼容 BLE4.0/4.1 还是采用了上面的 39 设计。

从蓝牙协议分层设计来看,逻辑链路层是最底层,已经正常连接的两...

pack sniffer 用以ble抓包

对于任何复杂协议的深入学习,我们都建议一个通用的学习方法,从规范->实现->抓包,规范是无关编程语言、语法文档表达,实现是各家SDK、API、源码,对于抓包则是对应实现理解规范。所以在BLE学习、研发过程抓包尤为重要。TI在这方面相比来说是做得相当好了,极大的简化了BLE的学习,熟练使用抓包工具,会大大降低蓝牙协议的技术入门槛,起到事半功倍的效果。对于蓝牙空中抓包,暂时地我们只有使用CC2540 USB Dongle。成功下载PacketSniffer直接双击安装。

成功安装PacketSniffer,我们直接插入CC2540 USB Dongle到PC,会自动安装驱动,成功安装驱动后,再设备管理器我们能够发现以下设备。

选择启动PackeetSniffer,并且选择Bluetooth Low Energy

我们将详细讲解界面功能,

  • 开始/停止抓包 自动滚轮
  • Capturing Device 当前用以抓包的的硬件设备,我们这里的为CC2540 USB Dongle
  • Radio ConfigurationAdvertising Channel 广播信道,在蓝牙概述 我们已经讲到 蓝牙40个信道保留了3个用以广播,默认广播信道会配置37、38、39全部进行广播,这里我们也可以指定某一个信道进行广播抓包。
  • Select fields 选择抓包指定协议层,指定类型显示,除非我们对协议分层和P...

SemiHosting

IAR和CCS都支持一种Semi-Hosting技术(半独立主机),这对产品早期开发的使用 printf和 System_printf 是非常方便的,轻易将调试信息打印在IDE的终端。但是一旦Semi-Hosting 使能,绝大的TI-RTOS例程在没有连接的IDE到时候不会运行,主要是因为类似 System_flush() API 需要等待IDE应答。区别其他IDE,CCS的握手机制不太一样,通过CCS编译生成的工程可以独立IDE运行。

对于Semi-Hosting,我们参考以下模型理解

本文以下CC2640R2F BLE5.0 SDK下面的 C:\ti\simplelink_cc2640r2_sdk_1_40_00_45\examples\rtos\CC2640R2_LAUNCHXL\sysbios\hello 工程为例,介绍如何使用SemiHosting支持的System_printf用以打印调试信息。

在IAR 导入Examples已经详细讲解如何导入Examples,参考它,导入Hello 例程。在Main函数中,以下代码段实现主要功能:

对于以上代码的 System_printf("hello world\n");需要借助仿真器Debug的时候在Terminal打印。

IAR-View->Terminal I/O

CCS的Console 比较明显

Win...

CC2650 Contiki 开发环境搭建

对于Contiki 6Lowpan所有开发资源,我们建议直接从官方推荐链接下载,同时我们维护一个百度云盘的链接。方便大家下载。

Instant Contiki是VMware的虚拟机镜像文件,Contiki已经部署好所有6LowPan交叉编译、仿真环境,同时打包好工具、源码到这个Instant Contiki镜像文件。所以我们只需要下载后解压,并且尝试VMware虚拟机软件打开。

大文件(3个G),如果官方链接下载速度比较慢,尝试我们百度云盘下载,下载后直接解压。接下来,我们只需要在安装虚拟机打开编译运行。

对于虚拟机,为了不必要麻烦,建议同我们版本保持一致。直接双击安装VMware-workstation-full-12.1.0-3272444.exe一路Next。成功安装VMware后,我们双击桌面图标启动软件。选择打开虚拟机->刚才Contiki的解压路径选择打开。在启动InstantContiki3.0前,我们先配置网络连接为桥接模式,方便同Windows进行SSH远程连接实现文件共享。右键选择InstantContiki3.0->设置(S),配置后我们选择开启此虚拟机。成功启动Ubuntu后,我们需要在此界面输入密码:user

成功进入桌面后,我们首先确定网络连接状态。确定其正常桥接了Windows的网络适配器,并且成功分配I...