分类:mcu

sample light/switch 代码走读

对于抓包详细走读 sample_light/switch 工程。

osal 是ti cc25x0 系列用以实现ble、zigbee 复杂协议栈的一个操作系统抽象层,算不上一个完整的操作系统,但是也完成操作系统内核的部分功能,可以总结为一个基于事件驱动的优先级任务管理,同时实现了任务间通信的基本事件、消息机制,并且实现动态内存管理。同时整个osal还维护一个时间节拍。

osal每一个完整任务由task_init和task_event_loop组成,前者完成任务初始化,后面用以处理任务通过事件被触发后的事件处理函数。每一个事件处理函数(task_event_loop)包含一个多个事件处理,其中一个事件包含消息处理,消息头会携带消息id。

如下框图所示,sample_light 应用任务包含zclSampleLight_Init和zclSampleLight_event_loop ,后者为处理任务事件,其中任务事件中有个SYS_EVENT_MSG特殊事件,用以处理任务消息。同样地,zcl任务也包含相同任务结构。

值得一提是,每一个任务都是《zigbee 协议概述》中的zigbee协议规范框架中的功能分层,熟悉的mac、nwk、zdo、af、zcl、bdb都会根据功能独立实现一个任务。不同层任务之间的需要通过层接口(api、回调函数)和数据接口(消息、事件)完成分层之间通信。

在《基于zstack ...

zigbee 协议概述

对于复杂协议的深入学习,我们都建议一个通用的学习方法,从规范->实现->抓包,规范是无关编程语言、语法的自然语言表达,实现是各家sdk、api、源码的集合,对于抓包则是对应实现理解规范的中间过程。一旦对zigbee有了感性认识,都建议从直接入手规范文档,做到知其所有然。

如上架构图详细展示了zigbee 协议规范的系统框图,不管是采用ti、silicon-labs、nordic的soc方案,以及它们对应不同sdk实现,核心标准都来自如上规范。这些规范主要是由ieee 组织zigbee 联盟共同定义,并且公开了完整的规范文档。

需要一提的是不同厂商的zigbee 实现协议栈有不同策略,ti是半开源,aps以上应用层是开放源码的,包含完整的af、zdo、zcl、bdb,所以对于新手入门来说并不能急于求成,必须打好基本功,对于nordic实现协议栈采用zboos3.1,几乎是一个全闭源的sdk,厂商应用只需要基于应用层(bdb、zcl)一些公共接口和实现其回调函数同协议栈交互。相对新手入门相对容易,但是可能出现不可控。

如下列出各个分层协议规范,并且详细阐述其功能。

  • ieee 802.15.4

    由ieee组织定义,最新版本。802.15.4-2011.pdf

  • ZigBee Specification, revision 21 and revision 22

    Zigbee PRO 20...

Operating System Abstraction Layer (OSAL)

The BLE protocol stack, the profiles, and all applications are all built around the Operating System Abstraction Layer (OSAL). The OSAL is not an actual operating system (OS) in the traditional sense, but rather a control loop that allows software to setup the execution of events. For each layer of software that requires this type of control, a task identifier (ID) must be created, a task initialization routine must be defined and added to the OSAL initialization, and an event processing routine must be defined.

Optionally, a message processing routine may be defined as well. Several layers of...

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->...

cc2530 存储架构

在理解CC2530的51内核存储结构上面吃力了。先提出疑问,在swru191f-CC253xSystem-on-ChipSolutionfor2.4-GHz IEEE 802.15.4andZigBee® Application .pdf上面介绍如下的存储空间,但是确找不到对应的sram和256kb的flash 映射空间。

在CC2530的Dtasheet上面详细介绍了8051 CPU的存储架构

对于8051的CPU存储空间,区分以下4类;

  • CODE 只读存储空间,应用存储,64KB;
  • DATA 读写存储空间,单CPU指令周期读写,256个字节,低128字节支持直接或者间接访问,高128字节支持间接访问;
  • XDATA读写存储空间,访问周期在4-5个CPU指令周期,64KB,访问速度慢于 DATA空间,同时CODEXDATA共享一部分的公用总线,因为,CODE预取指和XDATA的访问不能并行。
  • SFR 可读写的特殊功能寄存器存储空间,支持单CPU指令周期直接访问,128字节,对于寄存器,划分为字节单位,直接位直接访问。

对于以上CODE和DATA存储空间需要特别注意

  • 方便DMA的获取,如上的 SRAM、8051 DATA SPACE、 XREG、8051 SFR SPACE被映射在XDATA的低30KB;
  • 2KB的INFORMATION PAGE 用以存储IEEE地址的信息;
  • 高32KB用以映射需...

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 设计。

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

ble 吞吐量测试

本章分别测试了 TI CC2640R2F LaunchPad 和 LECONIOT CC2640R2F Evaluation Board开发板吞吐量,并提供了两个例程供大家参考测试,分别是 ble5_throughput_peripheral 和 ble5_throughput_central 。文末附对应测试程序下载链接。

该工程中进行了一些修改以方便进行吞吐量测试:

  • 改变项目 MTU 大小
  • 通过消息计数器发送通知
  • 增加 Throughput 配置文件
  • 增加按键菜单

使用 USB 连接 CC2640R2F Evaluation Board ,确保跳线帽正确连接,如下图所示:

基本思想是不断发送 GATT 通知,尽可能减少开销,尽可能减少停机时间。以下参数在增加吞吐量时必须加以考虑:

有关最大传输单元(ATT_MTU)的说明,请参见 LE Data Length Extension Logical Link Control and Adaptation Layer Protocol (L2CAP)

这里定义 6 个Tx缓冲区,每个缓冲区 251 字节。用户应用程序应根据自身堆栈情况进行分配。如果没有足够的堆栈,可以减少 MAX_NUM_PDU ,但这样可能导致吞吐量的损失。实际使用中的最坏情况是 MAX_NUM_PDU 和 MAX_PDU_SIZE 的乘积,即缺乏堆栈时能减少的最大值。设...

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...

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...

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...