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.LoggerBuf 和 xdc.runtime.LoggerSys 这几个模块用于日志记录. 日志信息在 应用程序调试和状态监控中非常实用. 日志记录函数相较于 System_printf() 占用的时间更短, 且可以区分事件的等级, 如: Info, Warning 和 Error 等.
此例程实现将 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进制显示的. 看图自行体会.

相关文章:
DSP开发例程(4): logbuf_print_to_uart
目录 DSP开发例程: logbuf_print_to_uart新建工程源码编辑app.cfgos.cmain.c 调试说明 DSP开发例程: logbuf_print_to_uart SYS/BIOS 提供了 xdc.runtime.Log, xdc.runtime.LoggerBuf 和 xdc.runtime.LoggerSys 这几个模块用于日志记录. 日志信息在 应用程序调试和状态监控中非…...
计算机毕业设计选题推荐-超市售货微信小程序/安卓APP-项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
Azure 机器学习 - 使用 Visual Studio Code训练图像分类 TensorFlow 模型
了解如何使用 TensorFlow 和 Azure 机器学习 Visual Studio Code 扩展训练图像分类模型来识别手写数字。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员…...
Vue 创建自定义 ref 函数
Vue 创建自定义 ref 函数 customRef customRef 用于:创建一个自定义的 ref 函数,并对其依赖项跟踪和更新触发进行显式控制。 使用 customRef 创建自定义 ref 函数 // 创建自定义 ref 函数 function myRef(value) {return customRef((track, trigger) &…...
[2016-2018]phpstudy的exp制作
[2016-2018]phpstudy的exp制作 用python的requests模块进行编写 修改请求数据包进行远程代码执行 import requests import base64 def remove_code_execute():try:url input("请输入要测试的网址:")cmd input("想要执行的命令:")cmd f"system({…...
服务器数据恢复—Zfs文件系统下文件被误删除的如何恢复数据?
服务器故障: 一台zfs文件系统服务器,管理员误操作删除服务器上的数据。 服务器数据恢复过程: 1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做扇区级别的镜像备…...
关于嵌入式rtthread系统与单片机芯片
简介 我估计已经有很久没更新了,近一年都在某个国企里工作,我做的就是嵌入式工程师的岗位,最近才刚刚退出来,想来说说自己的工作使用的软件和系统。 本身进公司的时候,其实做的就是写单片机的板子的程序的工作&#x…...
在Ubuntu上安装Redis并学习使用get、set和keys命令
目录 安装Redis切换到root用户搜索redis相关软件包安装redis修改配置文件重启服务器使用redis客户端连接服务器 get与set命令keys 安装Redis 我们在Ubuntu20.04上进行Redis的安装 切换到root用户 使用su命令: 在终端中,输入su并按回车键。然后输入roo…...
Ubuntu更换镜像源
Ubuntu更换镜像源 镜像源设置文件镜像源设置focal版本镜像源设置bionic版本镜像源设置 更新源问题 镜像源设置文件 备份镜像源设置文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑镜像源设置文件 sudo gedit /etc/apt/sources.list镜像源设置 Ubuntu有不…...
Sulfo-CY5 NHS荧光染料的生物应用2230212-27-6星戈瑞
Sulfo-CY5 NHS ester是一种用于生物学和生物医学研究中的荧光染料,它在生物应用方面具有许多重要用途,包括但不限于以下几个方面: **生物标记:**Sulfo-CY5 NHS ester可以与生物分子(如抗体、蛋白质、核酸等)…...
Python Django 之模板继承详解(extends)
文章目录 1 概述1.1 目的1.2 标签:block、extends1.3 目录结构 2 templates 目录2.1 base.html:父页面2.2 login.html:子页面 3 其它代码3.1 settings.py3.2 views.py3.3 urls.py 1 概述 1.1 目的 模板继承 和 类继承 的目的是一样的&#…...
混合式ANC主动降噪耳机系统设计(含C源代码)
混合式ANC主动降噪耳机系统设计(含C源代码) 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙音频,DSP音频项目核心开发资料, 1 FF信号链路与FB 链路算法处理上一样 X(n)为噪声输…...
Linux查看磁盘、内存、cpu信息
1. 查看磁盘空间信息:lsblk 2. 查看内存信息:awk $3"kB"{$2$2/1024^2;$3"GB";} 1 /proc/meminfo | column -t 3. 查看cup相关信息:lscup...
C语言 强制类型转换的各种代码示例
在C语言中,强制类型转换可以通过使用类型转换运算符来完成。以下是一些关于C语言强制类型转换的代码示例: int num 10; float fnum (float) num; // 将整数num转换为浮点数float fnum 3.14; int num (int) fnum; // 将浮点数fnum转换为整数&a…...
python 二维码使用
python 二维码使用 segno官网...
uniapp的启动页、开屏广告
uniapp的启动页、开屏广告 启动页配置广告开屏 启动页配置 在manifest.json文件中找到APP启动界面配置,可以看到有Android和iOS的启动页面的配置 ,选择自定义启动图即可配置 广告开屏 在pages中新建一个广告开屏文件并在pases.json的最顶部配置这个页…...
基于人工势场法的航线规划
GitHub - zzuwz/Artificial-Potential-Field: 2D平面下的人工势场法 GitHub - mellody11/Artificial-Potential-Field: 机器人导航--人工势场法及其改进 matlab2020a可以运行...
在紫光同创盘古50K开发板上进行DDR读写测试
本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGL50H开发平台(盘古50K开发板) 一:软硬件平台 软件平台:PDS_…...
MySQL BinLog实战应用之二
一、前言 上篇 MySQL Binlog实战应用之一 主要讲了BinLog的开启以及用MySQLBinLog读取BigLog二进制文件,但MySQLBinLog很难直接对接Java,所以有了Canal这个Alibaba开发的用于MySQL增量日志解析,提供增量数据的订阅和消费组件。 二、Canal原…...
Visual Studio Code 快 捷 键
个人总结 Visual Studio Code 快 捷 键!满足日常使用,提高工作效率!! 1、搜索文件: Ctrl p 2、移到某一行: Ctrl g 一、切 换 行 注 释、切 换 块 注 释 1、行注释"//"快捷键…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
