This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC1310:如何为 TI 驱动程序启用日志记录?

Guru**** 2410050 points
Other Parts Discussed in Thread: HDC1080

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/713183/rtos-cc1310-how-to-enable-logging-for-ti-drivers

器件型号:CC1310
主题中讨论的其他器件:HDC1080

工具/软件:TI-RTOS

大家好、

我正在尝试将我为读取 TI HDC1080 (I2C 温度+湿度传感器)而编写的旧代码库移植到最新的 SimpleLink SDK。  它是上次编译并使用旧的1.60版本,但我发现使用2.10时,我的库在 I2C_open()上失败... 非常奇怪、因为这不是很重要。

为了进一步诊断、我想启用 source/ti/drivers/I2C 中 I2CCC26XX.c 文件中的所有 DebugP_log1 ()等类型的东西。  不过、我可以告诉大家、为此、我需要在 SYS/BIOS 中启用一些日志记录基础架构、并在 CCS 工程中的预定义符号中添加"DebugP_log_enable=1"。

我已经完成了所有这些、但我仍然看不到 TI-Drivers 日志消息。  在我看来、默认情况下、工程还导入了 TI-Drivers 和 DPL 填充的二进制库编译、如首选项- Build > ARM Linker >文件搜索路径中所示、请参阅"ti/drivers/lib/drivers_cc13x0.aem3"和"ti/ddl/lib/ddl_cc13x0.aem3"。

那么、终端开发人员"打开" TI 驱动程序调试以查看我们的驱动程序调用正在进行的 WTF 的典型方式是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Eric:

    当 DebugP API 环绕 Log API 时、您还必须在 TI-RTOS 中启用"Log"模块。

    一种更快速的(也不向现有工程添加任何代码的方法)是将 I2CCC26XX.c 文件包含到工程中并单步执行、然后找出返回 NULL 的 I2C_open 部分。 有几个原因可能会导致这种情况:

    I2C 已打开、或者您没有调用 I2C_init。

    IO 无法初始化->板级配置文件中很可能存在 PIN 冲突。

    您是否可以尝试单步执行它并查看以下哪些原因导致 NULL 返回?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="M-W">您好 Eric、

    当 DebugP API 环绕 Log API 时、您还必须在 TI-RTOS 中启用"Log"模块。

    一种更快速的(也不向现有工程添加任何代码的方法)是将 I2CCC26XX.c 文件包含到工程中并单步执行、然后找出返回 NULL 的 I2C_open 部分。 有几个原因可能会导致这种情况:

    I2C 已打开、或者您没有调用 I2C_init。

    IO 无法初始化->板级配置文件中很可能存在 PIN 冲突。

    您是否可以尝试单步执行它并查看以下哪些原因导致 NULL 返回?

    [/报价]

    感谢您的回答-我最终确定了它,我忘记了执行 Board_initGeneral()和 I2C_init()等操作  之后、我的库将再次工作。

    但现在我遇到了另一个问题--无线电似乎不起作用(我今天将介绍一个故障排除过程), 我认为最好能够发布这些 DebugP_log*消息,例如可能会改变某些驱动程序功能的未来 SimpleLink SDK 版本。 或者对我以前从未使用过的驱动程序的使用进行故障排除-有时需要从驱动程序中获得提示、以告诉我发生了什么错误。

    我在 release.cfg fyi 中启用了 Log 模块。  这是自动使用 System_printf()还是 whatnot?  如何配置日志模块?

    当您启用所有这些功能时、CCS 编译器是否通过磁性方式知道从源代码重新编译 TI-Drivers 而不是使用编译的库?  从我可以知道的调试器组件是否已关闭的情况来看、这些 DebugP_log1 ()等编译为完全不执行任何操作。  是否在打开或关闭 DebugP 的情况下编译库存驱动程序二进制文件?  或者、我们能否像您所说的那样做-在项目中包含特定的 TI-Drivers 源文件、以迫使它们实现 DebugP_log*、同时忽略其余的 TI-Drivers 堆栈(并使其从分布式二进制文件链接)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    日志输出的存储或显示方式取决于当前使用的 ILogger。 例如、模块 LoggerBuf 将信息存储在缓冲区中、或者使用 System_printf 函数的 LoggerSys:  

    http://dev.ti.com/tirex/#/?link=Software%2FSimpleLink%20CC13x2%20SDK%2FDocuments%2FKernel%2FTI-RTOS%20Kernel%20Runtime%20APIs%20and%20Configuration

    看一下示例、他们会很好地提示如何将所有内容整合在一起(这不是很重要)。

    当您在 TI-RTOS 中启用了所有这些功能时、驱动程序仍不会使用调试语句进行编译。 您应该能够将感兴趣的驱动程序源文件添加到相关项目中。 我将研究您是否还需要执行其他操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。。。 我看到一个示例:

    VAR Defaults = xdc.useModule('xdc.runtime.Defaults');
    var Diags = xdc.useModule('xdc.runtime.Diags');
    var LoggerSys = xdc.useModule('xdc.runtime.LoggerSys');
    
    var LoggerSysParams = new LoggerSys.Params ();
    Defaults.common$.logger = LoggerSys.create (LoggerSysParams);
    Diags.setMaskMeta("my.pkg.%"、Diags.User1、Diags.RUNTIME_ON); 

    这会进入 TI-RTOS .cfg 文件中、然后默认情况下所有模块都会记录到该文件中。  我会用什么代替"my.pkg.%"、或者应该忽略该行以调试 TI-Drivers?

    编辑:不确定在绕 XDCtools 源查找之后,如果这里甚至需要诊断程序,TI-Drivers DPL 层只直接使用 XDC Log_*函数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    日志记录基础设施简直是一团糟!  现在、我看到日志记录的概念在整个 RTOS 中无处不在、日志级别由其 printf 的模板定义...

    那么、这里是 :http://processors.wiki.ti.com/index.php/CC26xx_Ouput_TI-RTOS_Log_statements_over_UART

    这一点非常酷、因为它使用 LoggerCallback 为不同日志级别使用 ANSI 颜色样式模板来实现日志记录。

    我想"Main"也适用于我的代码和 TI-Drivers 代码?

    //打开主模块中的 User1日志和信息(用户代码)。 关闭 User2以获得乐趣。
    Main.common$.diags_USER1 = Diags.always_on;
    Main.common$.diags_USER2 = Diags.always_off;
    Main.common$.diags_INFO = Diags.always_on; 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试在我的应用程序中仅使用基本 Log_info0()。

    下面是我对 release.cfg 所做的操作:

    var LoggerSys = xdc.useModule('xdc.runtime.LoggerSys');
    var LoggerSysParams = new LoggerSys.Params();
    Main.common$.logger = LoggerSys.create (LoggerSysParams);
    Main.common$.diags_INFO = Diags.always_on; 

    必须取消注释诊断。  然后在我的 main()函数中:

    int main (void)
    {
    pthread_t 线程;
    pthread_attr_t attrs;
    struct sched_param primParam;
    内部 REC;
    内部 detachState;
    
    /*调用驱动程序初始化函数*/
    Board_initGeneral();
    
    log_info0 ("Hello world from Log_info0");
    
    /*设置优先级和堆栈大小属性*/
    pthread_attr_init (atttrs);
    priParam.sched_priority = 1;
    
    detachState = pthread_create_detached;
    retc = pthread_attr_setdetachstate (&attrs、detachState);
    如果(retc!= 0){
    /* pthread_attr_setdetachstate()失败*/
    while (1);
    }
    (笑声) 

    最终打印到控制台的内容是:

    [Cortex_M3_0][t=0x00000000]{MODULE#9}:{evt:7、args=[0x4a60、0x47...]}
    smaC_NPI RTOS init-
    smacnpi_controlTaskFxn 已开始 

    始终写入[Cortex_M3_0]、但[t=0x000.... 填充是新的,当我注释掉 Log_info0()行时消失。  所以我非常接近,但我不确定为什么 LoggerSys(?) 使用类似的尴尬显示格式显示 Log_info0()文本,而不是仅打印文本。

    ("SMaC"内容是我的主应用线程中的 System_printf ()))

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    您似乎是显示日志输出的好方法。 要以纯文本(而不是原始格式)打印记录的信息消息、您必须在 TI-RTOS 配置中添加一些额外的行:

    text.isLoaded = true; 

    log.L_info ={
    
    mask:diags.info、
    
    msg:"[info:(%s:%d)%$S]
    
    }; 

    您也可以添加  

    log.L_error ={
    mask:diags.status、
    级别:diags.error、
    MSG:"\x1b[31;1mERROR:\x1b[0m (%s:%d)%$S"
    };
    
    和 Log.L_warning ={ mask:diags.status、 级别:diags.warning、 MSG:"\x1b[33;1mWARNING:\x1b[0m (%s:%d)%$S" };

    以同时处理记录的警告和错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢!  最终完成了-

    [Cortex_M3_0][t=0x00000000] xdc.runtime.Main:[信息:(./main_tirtos.c:71) Log_info0] smaC_NPI
    RTOS 初始化-
    smacnpi_controlpi TaskFxn 已开始
    SMaC 已打开
    UART 打开
    smacnWorker 线程已启动
    smacnbegin UART 读取 smacnpi
    线程控制主循环