当前位置: 首页 > news >正文

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进制显示的. 看图自行体会.

在这里插入图片描述

相关文章:

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-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

Azure 机器学习 - 使用 Visual Studio Code训练图像分类 TensorFlow 模型

了解如何使用 TensorFlow 和 Azure 机器学习 Visual Studio Code 扩展训练图像分类模型来识别手写数字。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员…...

Vue 创建自定义 ref 函数

Vue 创建自定义 ref 函数 customRef customRef 用于&#xff1a;创建一个自定义的 ref 函数&#xff0c;并对其依赖项跟踪和更新触发进行显式控制。 使用 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文件系统下文件被误删除的如何恢复数据?

服务器故障&#xff1a; 一台zfs文件系统服务器&#xff0c;管理员误操作删除服务器上的数据。 服务器数据恢复过程&#xff1a; 1、将故障服务器所有磁盘编号后取出&#xff0c;硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做扇区级别的镜像备…...

关于嵌入式rtthread系统与单片机芯片

简介 我估计已经有很久没更新了&#xff0c;近一年都在某个国企里工作&#xff0c;我做的就是嵌入式工程师的岗位&#xff0c;最近才刚刚退出来&#xff0c;想来说说自己的工作使用的软件和系统。 本身进公司的时候&#xff0c;其实做的就是写单片机的板子的程序的工作&#x…...

在Ubuntu上安装Redis并学习使用get、set和keys命令

目录 安装Redis切换到root用户搜索redis相关软件包安装redis修改配置文件重启服务器使用redis客户端连接服务器 get与set命令keys 安装Redis 我们在Ubuntu20.04上进行Redis的安装 切换到root用户 使用su命令&#xff1a; 在终端中&#xff0c;输入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是一种用于生物学和生物医学研究中的荧光染料&#xff0c;它在生物应用方面具有许多重要用途&#xff0c;包括但不限于以下几个方面&#xff1a; **生物标记&#xff1a;**Sulfo-CY5 NHS ester可以与生物分子&#xff08;如抗体、蛋白质、核酸等&#xff09…...

Python Django 之模板继承详解(extends)

文章目录 1 概述1.1 目的1.2 标签&#xff1a;block、extends1.3 目录结构 2 templates 目录2.1 base.html&#xff1a;父页面2.2 login.html&#xff1a;子页面 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. 查看磁盘空间信息&#xff1a;lsblk 2. 查看内存信息&#xff1a;awk $3"kB"{$2$2/1024^2;$3"GB";} 1 /proc/meminfo | column -t 3. 查看cup相关信息&#xff1a;lscup...

C语言 强制类型转换的各种代码示例

在C语言中&#xff0c;强制类型转换可以通过使用类型转换运算符来完成。以下是一些关于C语言强制类型转换的代码示例&#xff1a; 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启动界面配置&#xff0c;可以看到有Android和iOS的启动页面的配置 &#xff0c;选择自定义启动图即可配置 广告开屏 在pages中新建一个广告开屏文件并在pases.json的最顶部配置这个页…...

基于人工势场法的航线规划

GitHub - zzuwz/Artificial-Potential-Field: 2D平面下的人工势场法 GitHub - mellody11/Artificial-Potential-Field: 机器人导航--人工势场法及其改进 matlab2020a可以运行...

在紫光同创盘古50K开发板上进行DDR读写测试

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 适用于板卡型号&#xff1a; 紫光同创PGL50H开发平台&#xff08;盘古50K开发板&#xff09; 一&#xff1a;软硬件平台 软件平台&#xff1a;PDS_…...

MySQL BinLog实战应用之二

一、前言 上篇 MySQL Binlog实战应用之一 主要讲了BinLog的开启以及用MySQLBinLog读取BigLog二进制文件&#xff0c;但MySQLBinLog很难直接对接Java&#xff0c;所以有了Canal这个Alibaba开发的用于MySQL增量日志解析&#xff0c;提供增量数据的订阅和消费组件。 二、Canal原…...

Visual Studio Code 快 捷 键

个人总结 Visual Studio Code 快 捷 键&#xff01;满足日常使用&#xff0c;提高工作效率&#xff01;&#xff01; 1、搜索文件&#xff1a; Ctrl p 2、移到某一行&#xff1a; Ctrl g 一、切 换 行 注 释、切 换 块 注 释 1、行注释"//"快捷键&#xf…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; 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 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; 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‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...