0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用Trace机制实现LLCP预览功能

桃芯科技 来源:桃芯科技 2025-10-09 17:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

蓝牙协议栈开发过程中,有时需要预先知道 LLCP。本文将介绍如何利用 Trace 机制实现 LLCP 预览功能。

实现原理

打开 TracePLATFORM_TRACE_ID_LLCP类型,Controller 会在接收到 LLCP 时通过 Trace 回调函数导出数据。 我们可以在回调函数里截获PLATFORM_TRACE_ID_LLCP,并预览数据。这个的“预览”包含两层含义:

Controller 尚未处理该 PDU(Controller 将于 Trace 回调完成后处理 PDU);

只可读取 PDU 内容,不可修改。

让我们详细介绍实现方法。

1.Trace数据结构

PLATFORM_TRACE_ID_LLCPTrace 类型使用的头信息结构如下:

#pragmapack (push, 1)
typedefstruct
{
 uint32_tA;
 uint32_tB;
 uint8_t id;
 uint8_t tag;
}header_t;
#pragmapack (pop)

这个结构使用#pragmapack (push, 1)指令确保内存对齐。

2.Trace回调处理

假设cb_trace_read_llcp函数为 Trace 回调函数,在函数开头添加代码截获接收到的 LLCP:

staticuint32_tcb_trace_read_llcp(constplatform_evt_trace_t*Trace,void*ctx)
{
 if(Trace->len1 ==sizeof(header_t))
  {
   constheader_t*p = (constheader_t*)Trace->data1;
   if((p->id == PLATFORM_TRACE_ID_LLCP) && (p->tag &1))
    {
     constuint8_t*p8 = (constuint8_t*)Trace->data2;
     llcp_preview(p->tag >>1, p8[0], p8 +1, Trace->len2 -1);
    }
  }
 // ...
 return0;
}
3.PUD预览显示

llcp_preview函数负责预览 LLCP。下面的参考代码打印了关于 LLCP 的完整信息:

连接句柄(handle)

操作码(op_code)

控制数据

staticvoidllcp_preview(hci_con_handle_thandle,uint8_top_code,constuint8_t*ctr_data,intctr_data_len)
{
 platform_printf("LLCP[%d] OP %02x: ", handle, op_code);
 printf_hexdump(ctr_data, ctr_data_len);
 platform_printf("
");
}

特殊用法

目前 SDK 未提供设置公司 ID 的接口,暂时可以通过直接修改LLCP_VERSION_IND内容的方法修改公司 ID(修改这个值不影响 Controller 的行为和流程。) 在下面的代码里,公司 ID 被修改为0xABCD,小版本号被修改为0x1234。

#pragmapack (push, 1)
typedefstruct
{
 uint8_t version;
 uint16_tcompany_id;
 uint16_tsubversion;
}llcp_version_ind_t;
#pragmapack (pop)
staticuint32_tcb_trace_read_llcp(constplatform_evt_trace_t*trace,void*ctx)
{
 if(trace->len1 ==sizeof(header_t))
  {
   constheader_t*p = (constheader_t*)trace->data1;
   // 判断是否为发送方向的 LLCP
   if((p->id == PLATFORM_TRACE_ID_LLCP) && (0== (p->tag &1)))
    {
     constuint8_t*p8 = (constuint8_t*)trace->data2;
     constuint16_tcon_handle = p->tag >>1;
     constuint8_t op_code  = p8[0];
     constintctrl_data_len  = trace->len2 -1;
     uint8_t* ctrl_data    = (uint8_t*)p8 +1;
     // 判断是否为 LLCP_VERSION_IND
     if((op_code ==0x0c) && (ctrl_data_len ==sizeof(llcp_version_ind_t)))
      {
       llcp_version_ind_t*ver_ind = (llcp_version_ind_t*)(ctrl_data);
        ver_ind->company_id =0xABCD;
        ver_ind->subversion =0x1234;
      }
    }
  }
 // ...
 return0;
}

总结

利用 Trace 机制实现的 PDU 预览功能,能帮助开发者实时监控 LLCP 通信,实现必要功能。

温馨提示:不要忘记设置PLATFORM_CFG_TRACE_MASK,其中要包含PLATFORM_TRACE_ID_LLCP。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 蓝牙
    +关注

    关注

    117

    文章

    6197

    浏览量

    177281
  • Trace
    +关注

    关注

    0

    文章

    20

    浏览量

    10907
  • PDU
    PDU
    +关注

    关注

    0

    文章

    99

    浏览量

    17569
  • 回调函数
    +关注

    关注

    0

    文章

    93

    浏览量

    12103

原文标题:《软件设计指南》之四-基于 Trace 实现 LLPC预览功能

文章出处:【微信号:INGCHIPS_OFFICIAL,微信公众号:桃芯科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问STM32H7是否支持Trace功能

    以前用JLNK 和 keil MDK 开发stmF1,StmF2,stm32F4都可以使用Trace功能,这样就可以使用逻辑分析仪调试程序,但开发stmH7就不行了,如果勾选了Trace,就会
    发表于 04-25 07:38

    如何使用MCUXpresso IDE中内置的SWO Trace功能?

    如何使用MCUXpresso IDE中内置的SWO Trace功能?
    发表于 03-17 08:08

    程序的TRACE需求及功能

    面向用户的最终发行版中,TRACE功能需要被卸掉以保证不会对程序的执行效率造成影响。 2. 需求 * 要求程序在执行过程中能够给出反映程序状态的可视化信息,如包括时间、当前线程、源文件及代码行号等
    发表于 07-05 08:27

    IAR EWARM的SWO Trace调试功能

    采样。IAR支持SWO Trace调试这一强大的调试功能利用SWD接口中的SWO串行线输出调试时产生的跟踪信息。使用SWO调试需要将调试器的SWO引脚连接到芯片的SWO。本文将简单介绍几种SWO
    发表于 11-10 13:36

    使用IAR ETM Trace调试功能的要求

    嵌入式跟踪宏单元所记录的跑飞前后一段时间内MCU执行的所有指令,在查找此类复杂问题的原因时非常有帮助。ETM嵌入式跟踪宏单元ETM Trace调试功能实现依赖于芯片上的ETM嵌入式跟踪宏单元,ETM
    发表于 03-05 14:49

    自己如何利用C语言封装一个TRACE函数?

    自己如何利用C语言封装一个TRACE函数?
    发表于 10-18 09:03

    如何利用STM32实现红外收发机制的人体感应设计?

    如何利用STM32实现红外收发机制的人体感应设计?
    发表于 11-18 07:50

    如何利用pdf.js 实现在前端预览 .pdf 文件?

    如何利用pdf.js 实现在前端预览 .pdf 文件?
    发表于 12-20 06:49

    MDK上如何使用ULINK2设备上的SW调试实现STM32的trace功能

    MDK上如何使用ULINK2设备上的SW调试实现STM32的trace功能
    发表于 02-10 06:56

    如何使用SEGGER J-Trace Pro流模式实现指令跟踪功能

    的了解SeggerJ-Trace Pro产品流模式指令跟踪功能的强大之处。(1)使用MCU片上缓存实现指令跟踪一些MCU内部包含指令缓存区域,缓存区域依据不同芯片型号命名可能有所不同,例如
    发表于 09-07 11:10

    Trace32的高级功能特性

    Trace32的高级功能特性 Logic analyzer Real-time Streaming and Profiling Boundary Scan Third Party Tools Intergrations Virtual Targets Debugging
    发表于 11-16 12:52 29次下载
    <b class='flag-5'>Trace</b>32的高级<b class='flag-5'>功能</b>特性

    Trace辅助工具实现代码分析与实时覆盖率统计

    都有哪些优势和提升。 以上图片是 segger 官方对 J-Trace 的定位: 使用基于 segger 领先的 trace 方案 J-Trace PRO 实现对代码的收集、验证、分析
    的头像 发表于 10-09 15:33 4005次阅读
    <b class='flag-5'>Trace</b>辅助工具<b class='flag-5'>实现</b>代码分析与实时覆盖率统计

    TRACE功能概述

    在TIA博途软件中,通过轨迹功能记录测量值变化,并通过逻辑分析器对记录进行评估分析。将配置好的TRACE下载到PLC中,从而根据条件采样变量值。多个采样值形成了以时间变化为横坐标的曲线,称为记录。
    的头像 发表于 03-11 14:08 5832次阅读

    轻松实现相机预览 | Camera Viewfinder 全新上线

    从一开始便一直是 Android 设备最重要的使用场景之一。如今,相机功能仍然是消费者购买手机的首要考虑因素之一。 作为开发者,您希望在您的应用中利用相机功能,因此决定采用 Android 相机框架
    的头像 发表于 02-20 20:20 2924次阅读

    Trace功能的添加、组态及测试

    本节为工程添加Trace曲线,在Trace中配置Diagram,并为每个Diagram组态变量监控。 具体操作介绍 1.在Application下添加Object,选择Trace。添加Trac
    发表于 03-08 14:42 1835次阅读