DSP开发例程(4): logbuf_print_to_uart

目录

  • DSP开发例程: logbuf_print_to_uart
    • 新建工程
    • 源码编辑
      • app.cfg
      • os.c
      • main.c
    • 调试
    • 说明

DSP开发例程: logbuf_print_to_uart

SYS/BIOS 提供了 xdc.runtime.Log, xdc.runtime.LoggerBufxdc.runtime.LoggerSys 这几个模块用于日志记录. 日志信息在 应用程序调试和状态监控中非常实用. 日志记录函数相较于 System_printf() 占用的时间更短, 且可以区分事件的等级, 如: Info, WarningError 等.

此例程实现将 SYS/BIOS 日志信息通过串口输出, 并在 EVM6678L 开发板上进行了测试. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程(0): 汇总查看其他例程说明.

新建工程

此示例工程直接在 sys_print_to_uart 工程基础上修改.

  • 选中 sys_print_to_uart 工程, 右键选择 Copy 或 使用快捷键 Ctrl+C 复制工程.

在这里插入图片描述

  • 在工程浏览视图中, 右键选择 Paste 或使用快捷键 Ctrl+V 粘贴工程.
    在这里插入图片描述
  • 在弹出的 Copy Project 对话框中 修改工程名为: logbuf_print_to_uart, 点击 OK.

在这里插入图片描述

  • 删除 logbuf_print_to_uart 工程中的 Debug目录, 右键选择 Build Project, 编译此工程.

源码编辑

app.cfg

  • 使用 XGCONF 打开 app.cfg 文件.
    在这里插入图片描述
  • 点击 logger0.

在这里插入图片描述- 将 logger0 的句柄设置为 logger0.

在这里插入图片描述- 点击 Timestamp 模块.

在这里插入图片描述

  • 勾选 Add Timestamp to my configuration.

在这里插入图片描述

  • 保存修改.

os.c

编辑 os.c 源文件, 其内容如下:

/** os.c**  Created on: 2023-10-26*      Author: falwa*/
#include <xdc/std.h>
#include <xdc/runtime/Log.h>
#include <xdc/runtime/LoggerBuf.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Text.h>
#include <xdc/runtime/Types.h>
#include <xdc/runtime/Timestamp.h>extern LoggerBuf_Handle logger0;/**  ======== doPrint ========*/
Void myLog_doPrint(Log_EventRec *er)
{Text_RopeId rope;String fmt;Bits32 hi, lo;Types_FreqHz freq;uint32_t msec;Timestamp_getFreq(&freq);/* print timestamp if there is one; ~0 isn't a valid timestamp value */hi = er->tstamp.hi;lo = er->tstamp.lo;msec = (((uint64_t)hi << 32) | lo) / (freq.lo/1000);System_printf("[%5d.%03ds] ", msec/1000, msec%1000);/* print event */rope = Types_getEventId(er->evt);   /* the event id is the message rope */if (rope == 0) {/* Log_print() event */System_aprintf((String)iargToPtr(er->arg[0]),er->arg[1], er->arg[2], er->arg[3], er->arg[4],er->arg[5], er->arg[6], 0,          0);}else {/* Log_write() event */fmt = Text_ropeText(rope);if (Text_isLoaded) {System_aprintf(fmt, er->arg[0], er->arg[1], er->arg[2], er->arg[3],er->arg[4], er->arg[5], er->arg[6], er->arg[7]);}else {System_aprintf("{evt: fmt=%p, args=[0x%x, 0x%x ...]}",fmt, er->arg[0], er->arg[1]);}}System_putch('\n');
}/**  ======== LoggerBuf_flush ========*/
Void myLoggerBuf_flush(LoggerBuf_Object *obj)
{Int nEntries;Log_EventRec evtRec;for (;;) {nEntries = LoggerBuf_getNextEntry(obj, &evtRec);if (nEntries == 0) {break;}else {if (nEntries != -1) {myLog_doPrint(&evtRec);}}}
}/*** 添加此函数到 Idle Thread.** ```xdc* var Idle = xdc.useModule('ti.sysbios.knl.Idle');** Idle.idleFxns[0] = "&os_systemFlush";* ```*/
void os_systemFlush()
{if (logger0)myLoggerBuf_flush(logger0);System_flush();
}/*** 将  System_printf() 重定向到  platform_uart_write().** 请在 .cfg 中添加:* ```* SysMin.outputFxn = "&os_systemOutput";* ```*/
Void os_systemOutput(Char *str, UInt len)
{UInt i;for(i = 0; i < len; i++){platform_uart_write(str[i]);}
}

其中新增了两个函数 myLog_doPrint()myLoggerBuf_flush() , 这两个函数参考 C:\ti\xdctools_3_25_03_72\packages\xdc\runtime\LoggerBuf.c 中的 Log_doPrint()LoggerBuf_flush() 进行设计. 其中,

  • myLog_doPrint() 用于调用 System_printf() 格式化打印一条日志事件;
  • myLoggerBuf_flush() 负责调用 myLog_doPrint() 格式化 并 flush logBuf 中的所有日志事件.

os_systemFlush() 函数中调用 myLoggerBuf_flush(logger0); 完成日志的 flush.

main.c

编辑 main.c, 其内容如下:

/**  ======== main.c ========*/
#include <stdio.h>
#include <string.h>#include <xdc/std.h>#include <xdc/runtime/Error.h>
#include <xdc/runtime/Log.h>
#include <xdc/runtime/System.h>#include <ti/sysbios/BIOS.h>#include <ti/sysbios/knl/Task.h>#include <ti/platform/platform.h>/**  ======== taskFxn ========*/
Void task_ledFlash(UArg a0, UArg a1)
{int i = 1;Log_info0("enter task_ledFlash().");while(1){platform_led(0, PLATFORM_LED_ON, PLATFORM_USER_LED_CLASS);Log_info1("LED 0 ON at %d times.", i);Task_sleep(500);platform_led(0, PLATFORM_LED_OFF, PLATFORM_USER_LED_CLASS);Log_info1("LED 0 OFF at %d times.", i);Task_sleep(500);i++;}
}/*** 平台初始化*/
void EVM_init()
{platform_init_flags init_flags;platform_init_config init_config;// plaform initializememset(&init_flags, 1, sizeof(platform_init_flags));init_flags.phy = 0;memset(&init_config, 0, sizeof(platform_init_config));if (platform_init(&init_flags, &init_config) != Platform_EOK){printf("Platform failed to initialize, errno = 0x%x \n", platform_errno);while(1);}platform_uart_init();
}/**  ======== main ========*/
Int main()
{ Task_Handle task;Error_Block eb;Log_info0("enter main().");Log_error1("Log_error1(%d)", 1);Log_warning2("log_warnning2(%d, %d)", 1, 2);Error_init(&eb);task = Task_create(task_ledFlash, NULL, &eb);if (task == NULL) {System_printf("Task_create() failed!\n");BIOS_exit(0);}BIOS_start();    /* does not return */return(0);
}

其中 调用了 Log_info#(), Log_error#()Log_warning#() 这几个日志事件记录函数进行测试.

保存上述更改, 并编译工程.

调试

完成编译后, 在 EVM6678L 上调试.

串口通过USB连接计算机. 请确保 COM_SEL1 跳线设置在正确位置. 且在计算机设备管理器中能够找到对应板卡的串口.

在这里插入图片描述

打开串口终端, 连接对应串口, 串口设置如下:

在这里插入图片描述
点击运行按钮, 运行程序. 此时在串口终端中能够看到打印的日志信息. 相较于 System_printf(), 增加了 时间戳, 文件名, 行数等信息.

在这里插入图片描述

说明

这只是 打印日志信息到串口的一种方式. 启用 xdc.runtime.LoggerSys 模块, 也可以实现日志信息的打印, 不过打印的格式不是很好看, 其中的时间戳是16进制显示的. 看图自行体会.

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/157484.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资源限流 + 本地分布式多重锁——高并发性能挡板,隔绝无效流量请求

前言 在高并发分布式下&#xff0c;我们往往采用分布式锁去维护一个同步互斥的业务需求&#xff0c;但是大家细想一下&#xff0c;在一些高TPS的业务场景下&#xff0c;让这些请求全部卡在获取分布式锁&#xff0c;这会造成什么问题&#xff1f; 瞬时高并发压垮系统 众所周知…

leetcode:27. 移除元素(python3解法)

难度&#xff1a;简单 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

【网络协议】聊聊HTTPS协议

前面的文章&#xff0c;我们描述了网络是怎样进行传输数据包的&#xff0c;但是网络是不安全的&#xff0c;对于这种流量门户网站其实还好&#xff0c;对于支付类场景其实容易将数据泄漏&#xff0c;所以安全的方式是通过加密&#xff0c;加密方式主要是对称加密和非对称加密。…

FPGA时序分析与约束(9)——主时钟约束

一、时序约束 时序引擎能够正确分析4种时序路径的前提是&#xff0c;用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息&#xff0c;这些信息只能由用户主动告知&#xff0c;时序引擎对有些信息可以自动推断&#xff0c;但是推断得到…

centos 7 kafka2.6单机安装及动态认证SASL SCRAM配置

目录 1.kfaka安装篇 1.1 安装jdk 1.2安装kafka 2.安全篇 2.1 kafka安全涉及3部份&#xff1a; 2.2 Kafka权限控制认证方式 2.3 SASL/SCRAM-SHA-256 配置实例 2.3.1 创建用户 2.3.2 创建 JAAS 文件及配置 3.测试 3.1 创建测试用户 3.2 配置JAAS 文件 3.2.1 生产者配…

打造教育新高地 | 拓世法宝AI智能直播一体机,教育界的不二之选

教育是社会进步和个人成长的基石&#xff0c;它不仅是知识传授的载体&#xff0c;更是塑造未来社会精英的摇篮。近年来&#xff0c;数字化、智能化以及个性化教育模式成为当下教育改革的关键词&#xff0c;它不断引领着人类文明的发展&#xff0c;开启着每个人成长的无限可能。…

洗衣洗鞋柜洗衣洗鞋小程序

支持&#xff1a;一键投递、上门取衣、自主送店、多种支付方式 TEL: 17638103951(同V) -----------------用户下单-------------- -------------------------多种支付和投递方式------------------------- -----------------商家取鞋--------------

uniapp 微信小程ios端键盘弹起后导致页面无法滚动

项目业务逻辑和出现的问题整理 新增页面 用户可以主动添加输入文本框 添加多了就会导致当前页面出现滚动条,这就导致ios端滚动页面的时候去点击输入框键盘抬起再关闭的时候去滚动页面发现页面滚动不了(偶尔出现),经过多次测试发现是键盘抬起的时候 主动向上滑动 100%出现这种问…

IntelliJ IDEA快捷键sout不生效

1.刚下载完idea编辑器时&#xff0c;可能idea里的快捷键打印不生效。这时你打开settings 2.点击settings–>Live Templates–>找到Java这个选项&#xff0c;点击展开 3.找到sout 4.点击全选&#xff0c;保存退出就可以了 5.最后大功告成&#xff01;

京东平台数据分析(京东销量):2023年9月京东吸尘器行业品牌销售排行榜

鲸参谋监测的京东平台9月份吸尘器市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年9月&#xff0c;京东吸尘器的销量为19万&#xff0c;环比下滑约12%&#xff0c;同比下滑约25%&#xff1b;销售额为1.2亿&#xff0c;环比下滑约11%&…

【基于HTML5的网页设计及应用】——实现个人简历表格和伪类选择器应用

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Java 设计模式——命令模式

目录 1.概述2.结构3.案例实现3.1.命令接口3.2.具体命令3.3.接受者3.4.调用者3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Runnable 1.概述 &#xff08;1&#xff09;日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景&#xff1a; &#xff08;2&#xff09;命令模…