嵌入式开发常用的几招调试方法

news2024/11/15 11:48:47

嵌入式系统调试时相对比较麻烦一些,特别是在定位一些疑难问题时,调试手段就显得非常重要。废话不多说,直接上方法。

 方法一:利用特殊文件名字的文件存在与否来触发调试代码是否运行。比如有些特殊状况下,我们需要保存一帧数据图像,那保存数据图图像的代码不能时时刻刻都运行,那样不光flash受不了,系统怕也受不了,那就需要严格控制他的数量和频率。示例如下:

      需要执行调试代码的时候,在SD卡创建一个临时文件,系统access判定文件是否存在,存在了就进去执行,为了减少次数,在执行完调试动作后就直接删除了这个临时文件,防止重入,减少系统负担。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
————————————————
版权声明:本文为CSDN博主「coding码场」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/edsam49/article/details/64439643

     这个方法还是很好用的,在实际项目中可以灵活运用,达到调试的目的。

方法二:取系统时间,打印到毫秒级,在判断一些程序模块函数执行时间、效率上很有用。

int get_time_ms(char *buff, int len)
{
struct timeval tv;
struct tm* ptm;
char time_string[40];
long milliseconds;

if(buff == NULL)
{
printf("%s buff is NULL.\n", __func__);
return -1;
}

gettimeofday(&tv, NULL);

ptm = localtime (&(tv.tv_sec));

strftime (time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", ptm); //输出格式为: 2022-03-30 20:38:37
milliseconds = tv.tv_usec / 1000;
snprintf (buff, len, "%s.%03ld", time_string, milliseconds); //输出格式为: 2022-03-30 20:38:37.182
return 0;
}

这样就可以在需要的地方前后调用一下,再分析打印就可以比较准确的判断出执行的效率、耗时,统计出来还可以采用一些统计手段取一些平均值。

方法三:保存文件。比如需要把中间过程的某些重要数据保存下来,我们可以采用保存文件后,再分析文件。

static void save2file_render(void * buf, int len, char *fileName){
int fd = -1;
unsigned long bytes;

if (-1 == fd){
fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (fd < 0){
APP_PRT("unable to create debug file.");
fd = -2;
}
}

if (fd > 0){
bytes = write(fd, buf, len);
// APP_PRT(" file %s write bytes %ld image file closed .",fileName, bytes);
close(fd);
fd = -2;
}

}

 以上几个方法可以同时上,都是比较常用惯用的手段,调试手段越丰富,调试效率也就会越高。特别是遇到一些不容易出现的现象,又不能临时把自己调试想法运行出来,就可以采用前面说的办法,先把想法埋到流程中去,有需要的时候打开一下就行了,这样既能保障系统平时的执行效率不受影响,也能在关键时刻挺身而出,为你披荆斩刺!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (30)-- 算法导论5.2 2题

二、在 HIRE-ASSISTANT 中&#xff0c;假设应聘者以随机顺序出现&#xff0c;你正好雇用两次的概率是多少&#xff1f; 文心一言&#xff1a; 我们可以先计算出在HIRE-ASSISTANT中&#xff0c;雇佣一个应聘者的概率为3/4&#xff0c;然后计算出雇佣两次应聘者的概率为3/4 * 3…

教你用Appium搭建Android自动化测试框架(详细教程)

如题&#xff0c;本文附有仓库地址以及代码&#xff0c;目录如下&#xff1a; 1.下载安装appium 2.配置并使用appium 3.配置工程 一、下载安装appium 下载appium-desktop的mac版本&#xff0c;我选择用1.17.1版本&#xff0c;最新的版本1.22.0&#xff0c;拆分一个桌面应用…

k-means算法超级详解-转载

这是搬运的 一、 实验准备 1.1 实验概述 所谓聚类算法是指将一堆没有标签的数据自动划分成几类的方法&#xff0c;属于无监督学习方法&#xff0c;这个方法要保证同一类的数据有相似的特征。根据样本之间的距离或者说是相似性&#xff08;亲疏性&#xff09;&#xff0c;把越…

牛郎织女的幸福生活(活锁)

从前&#xff0c;有一对夫妻&#xff0c;男的叫牛郎&#xff0c;女的叫织女&#xff0c;他们很好地传承了中华民族的谦让美德&#xff0c;每次吃饭时都会优先考虑对方&#xff0c;如果对方饿的话&#xff0c;就让给对方吃&#xff0c;等对方吃饱了自己才吃&#xff0c;这种美德…

SpringBoot整合OSS文件上传

一、注册阿里云账号并开通OSS服务 1、登录阿里云账号 2、创建一个bucket 3、创建子用户 对自用户分配权限&#xff0c;打开操作OSS的全部权限&#xff08;也可根据业务需求进行更改&#xff09; 4、配置上传跨域规则 任何来源: *允许方法: POST任何请求头Headers: * 二、…

pytorch实现图像分类任务-手写数字识别(一)

Pytorch手写数字识别 Minst数据集介绍 Size: 2828 灰度手写数字图像 Num: 训练集 60000 和 测试集 10000&#xff0c;一共70000张图片 Classes: 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9 一…

pybullet学习(一)——安装与入门pybullet

PyBullet介绍 PyBullet 基于著名的开源物理引擎 bullet 开发&#xff0c;封装成了 Python 的一个模块&#xff0c;用于机器人仿真和学习。PyBullet 支持加载 URDF、SDF、MJCF 等多种机器人描述文件&#xff0c;并提供正/逆向运动学、正/逆向动力学、碰撞检测、射线相交查询等功…

FreeRTOS多任务系统

FreeRTOS 文章目录 FreeRTOS1 单任务和多任务系统1.1 单任务系统1.2 多任务系统 2 FreeRTOS 任务状态3 FreeRTOS 任务优先级4 Free RTOS 任务调度方式4.1 抢占式调度4.2 时间片调度 5 FreeRTOS 任务控制块6 FreeRTOS 任务栈 1 单任务和多任务系统 1.1 单任务系统 单任务系统的…

手把手教你搭建网站(零基础,不用写代码)

没有前言直接开始正文&#xff0c;搭建一个博客需要服务器&#xff0c;域名&#xff0c;博客程序。 博客程序常用的有wordpress&#xff0c;z-blog&#xff0c;typecho等等&#xff0c;其中wordpress和z-blog最为简单&#xff0c;typecho需要一定的技术含量&#xff0c;这里暂…

17.4:图的拓扑排序

拓扑序一定是有向无环图。 拓扑排序不唯一 拓扑排序方法一&#xff1a; 利用入度为零进行排序 思路&#xff1a;谁的入度为0&#xff0c;谁就是开始节点&#xff0c;将开始节点打印完之后&#xff0c;将开始节点的直接邻居的入度减1&#xff0c;然后重复。 package algorith…

【软件测试】稳定性和可靠性测试在软件开发中的重要性

软件测试的某些方面经常会在那些刚接触流程的人中造成混淆——例如在稳定性和可靠性测试之间划清界限。 两者通常可以互换使用&#xff0c;并且有一个共同的目标&#xff0c;即确保系统可以在选定的时间范围内稳定运行。 在这篇文章中&#xff0c;我们将仔细研究什么是稳定性测…

10年Java开发,准备去腾讯了~

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;又得准备面试了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&a…

chatgpt赋能python:Python分词,助力文本处理和搜索引擎优化

Python分词&#xff0c;助力文本处理和搜索引擎优化 作为一种广泛应用于文本处理的编程语言&#xff0c;Python在分词处理方面也有着得天独厚的优势。Python分词不仅可以帮助我们完成文本处理任务&#xff0c;还能够为搜索引擎优化提供便利。 什么是分词&#xff1f; 分词&a…

集线器与交换机的区别

1.集线器与交换机的区别 笔记来源&#xff1a; 湖科大教书匠&#xff1a;集线器与交换机的区别 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 集线器 早期总线型以太网的机械连接点不太可靠 使用双绞线和集线器相对可靠 集线器可以在物理层…

计算机网络和因特网概述

一.计算机网络和因特网 计算机网络是指多台计算机通过通信线路或其他连接方式相互连接起来&#xff0c;实现信息交换和共享的系统。而因特网是利用标准化协议互联起来的全球性计算机网络&#xff0c;是计算机网络的一种特殊形式。 1.1 什么是因特网 1.1.1 从具体构成描述 因…

day04——特征处理之特征降维

特征处理之特征降维 一、特征选择Filter(过滤式)1&#xff0c;低方差特征过滤2、相关系数 Embedded (嵌入式) 二、主成分分析&#xff08;PCA&#xff09; 特征降维&#xff1a;如果特征本身存在问题或者特征之间相关性较强&#xff0c;对于算法学习预测会影响较大。降维是指在…

设计模式-解释器模式

解释器模式 问题背景解释器模式基本介绍原理类图 使用解释器模式来解决问题UML类图代码示例运行结果 注意事项和细节 问题背景 通过解释器模式来实现一个表达式的加减运算 例如&#xff1a;在我们先输入一个表达式&#xff1a;abc-de&#xff0c;然后输入a&#xff0c;b&#…

layui框架实战案例(22):layui-tab-title的宽度自适应的解决方案

HTML源代码 <div class"layui-card"><div class"layui-card-header">卡片风格</div><div class"layui-card-body"><div class"layui-tab layui-tab-card"><ul class"layui-tab-title">…

酷游SVG-地址路径

说到SVG中最复杂的东西&#xff0c;路径(Path)绝对是一个大魔王&#xff0c;它有太多的commands可以用来定义路径。【娜娜提供酷游地kw9㍠neт地址】透过Path虽然可以绘制效果不错的SVG图形&#xff0c;但是要自己定义一个个坐标点&#xff0c;再去把它们完美的串连在一起&…

《银行从业法律法规》第二章——金融基础知识

第二章 金融基础知识 第二节 货币政策 【 知识点1】 货币政策目标 制定和实施货币政策&#xff0c; 首先必须明确货币政策最终要达到的目的&#xff0c; 即货币政策的最终目标。中央银行通过货币政策工具操作直接引起操作目标的变动&#xff0c;操作目标的变动又通过一定的途…