C
文章平均质量分 80
L.G.F
这个作者很懒,什么都没留下…
展开
-
使用GDB中的watch来调试指来指去的指针
引言C代码中经常会有大量的指针在很多不同函数中传来传去,甚至还有强制类型转换,让阅读代码和调试BUG的人苦不堪言。更有甚者将全局变量指针赋值给局部变量,然后再作为参数传出并修改。 这是官网的说明:http://sourceware.org/gdb/current/onlinedocs/gdb/Set-Watchpoints.html#Set-Watchpoints说明watch是gdb众多命令中的一个,用来检测变量,当被监测的变量被修改时,...原创 2021-08-15 22:59:39 · 2300 阅读 · 0 评论 -
关于gdb的使用心得
GDB作为一个很强的调试工具,我以为已经是人尽皆知了,至少在嵌入式中是这样,但是在平时工作中发现并非如此,很多人依然在使用加log的方式来定位诸如段错误之类的问题,不是说加log不好,只是有时候GDB效率更高。关于用法网上的资料已经很丰富了,这里只是做个简单的总结,以及我经常用到调试方法,我把它分成三部分:常用命令 难以复现的问题 没有加-g的文件调试。常用命令1.setargs:设置入参,有的程序需要传参#include <stdio.h>int main(in...原创 2021-01-09 21:28:49 · 720 阅读 · 0 评论 -
编译过程
gcc对C语言的编译分为四个步骤:预处理预处理阶段会针对#开头的语句做处理,头文件和宏定义会展开直接插入到代码中,但是比如#if这样的判断会根据条件是否满足做展开处理。#include <stdio.h> //预处理阶段此处会展开#include "io.h" //预处理阶段会在此处展开typedef struct{ int a; char b; short c;}ST_HELLO;#define WHILE(value) while((原创 2020-10-04 12:55:37 · 181 阅读 · 0 评论 -
Imx6 网络烧录uboot和linux kernel
正常烧录uboot和kernel需要使用MfgTool2工具、串口线和boot下载模式;但是因为项目需要,机器无法连接串口线,且机器数量多,一个一个拆解升级太麻烦,所以寻找linux下网络更新方法。工具:putty或者xhell、烧录工具Profiles\Linux\OS Firmware\firmware-3035\initramfs.cpio.gz\initramfs.cpio\usr\b...原创 2019-10-24 11:15:52 · 362 阅读 · 0 评论 -
linux watchdog应用
最近机器运行一段时间后会出现卡顿,然后就是无法远程连接(ssh/telnet)均不可,接着就会出现无法ping通的问题;经过一番调查发现驱动程序里有一个线程死循环了,虽然使用了udelay()函数做延迟,但是我们知道这个函数不会让出CPU,而是让CPU计时,跟程序死循环的效果的是一样的,导致CPU占用率达到100%,这个时候一旦有另外一个内核进程不小心被用户手动开启,比如执行dmesg -n 8(...原创 2019-09-29 17:48:42 · 879 阅读 · 0 评论 -
im6x板Linux应用层I2C通信
驱动给应用层提供了open、read、write、ioctl等函数来实现对底层硬件的控制,前三个参数相比其他设备比如uart、spi等使用方法都一样,主要的不同在ioctl里。/* i2c_dev.h *//* ioctl函数参数 */#define I2C_SLAVE 0x0703 /* Use this slave address */#define I2C_SLAVE_FOR...原创 2019-08-01 18:38:59 · 553 阅读 · 0 评论 -
GDB调试之watch变量跟踪
开发中经常遇到某个变量明明已经赋值了,但是最后得到的结果却并非赋予的值。解决这样问题让人很头疼,原因我们可能都知道,可能是内存越界导致这部分值被覆盖掉了,但是什么时候被覆盖掉的呢?总不能在每个怀疑的地方打印这个值吧?这样效率很低,而且定位不一定准确。这个时候使用gdb调试中的watch就可以轻松搞定。顾名思义跟linux中的watch命令类似:实时的监视你需要查看的内容。比如下面程序:#...原创 2019-04-29 16:39:56 · 14388 阅读 · 0 评论 -
Linux 下 NTP 时间同步
问题项目中有arm开发板NTP时间同步失败,首先想到在windows下测试NTP服务器:w32tm /stripchart /computer:<ntp ip/url>C:\Users\bm>w32tm /stripchart /computer:192.168.2.140正在跟踪 192.168.2.140 [192.168.2.140:123]。当前时间是 20...原创 2019-04-16 16:23:31 · 371 阅读 · 0 评论 -
模块通讯之回调函数
如果模块A有数据要给模块B,很明显模块B提供API给模块A,A只需要调用API传输数据就可以轻松传输数据了。但是如果 B无法提供API给A呢?比如A用c语言开发,B用Java开发;又或者模块A是底层厂商的产品,提供给客户,那么上面的方法就行不通了,这个时候就要用到回调函数了。回调函数其实就是函数指针,即指向函数的指针变量。/**********模块A*************///回调...原创 2019-04-11 16:14:58 · 412 阅读 · 0 评论 -
c线程通讯—数据缓冲
两个线程之间需要数据共享,由于两个线程处理速度不一,为了防止数据丢失设置一个缓冲buffer:#define MAX_LINE 1024 //数据buffer最大长度#define COUNT_MAX 128 //最大数据buffer数typedef struct{ unsigned int buffersize; //buffer长度 char buf[M...原创 2019-03-26 16:22:38 · 295 阅读 · 0 评论 -
libuv之管道
由于libuv的异步特性,相比一般轮询具有实时性高速度快的优点,这里介绍使用libuv实现进程间通讯,采用有名管道的通讯方式。当然还有其他IO方式,如下图。loop libuv的使用离不开loop循环,可以把它理解成一个队列,你可以向这个队列里添加自己要做的事情,libuv会根据你的设定执行队列里的任务。uv_loop_t * loop = uv_loop_ne...原创 2019-03-20 14:54:22 · 1107 阅读 · 5 评论