自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

食梦者

一个底层程序员往上走的路程

  • 博客(130)
  • 收藏
  • 关注

原创 LWIP协议栈学习(一):ARP协议

ARP协议简介ARP所实现的功能就是通过IP地址获取到MAC地址,并且将IP和MAC映射到一起,保存到ARP表中.电脑1->电脑2:ARP RequestNote right of 电脑1:Who is 10.8.0.45? Tell 10.10.0.13电脑2->电脑2:验证数据包+查找或更新ARP表电脑2-->电脑1:ARP ReplyNote left of 电...

2019-10-26 07:19:31 278

原创 UBOOT学习(其四):uboot第二阶段分析

从uboot第一阶段我们可以知道,最后执行的函数是armboot_start.下图所示是uboot执行的过程.void start_armboot (void){ init_fnc_t **init_fnc_ptr; char *s;#ifndef CFG_NO_FLASH ulong size;#endif#if defined(CONFIG_VFD) || defined(...

2019-08-10 14:56:49 175

原创 UBOOT学习(其三):uboot第一阶段代码分析

uboot第一阶段代码uboot的作用主要就是加载内核,但加载内核就设计了flash,sdram等外设,而uboot的第一阶段代码就是初始化各个硬件的外设.如何查看代码?首先我们要知道CPU的架构,在cpu/目录下打开相应cpu的文件夹,(我这里用的是arm920t),打开后就有start.S文件,这个文件就是uboot的起始.为什么?因为在上电时,栈还没被设置,只能使用汇编语言..glo...

2019-08-07 17:00:10 239

原创 makefile学习(十一):make的路径搜索

前言工程项目中不可能吧全部源文件放到同一个文件夹里为了项目管理,会根据功能或者代码架构,吧源文件放到不同的目录下.项目中的makefile必须能够正确定位源文件和依赖文件,最终编译产生可执行程序.特殊的与定义变量VPATHVPATH变量的值用于指示make如何查找文件不同文件夹可作为VPATH的值同时出现文件夹的名字之间需要使用分隔符进行区分例如:VPATH := inc src...

2019-08-06 17:31:18 1125

原创 makefile学习(十):在makefile里面如何嵌入shell?

有些处理使用shell语言处理比较方便?那么makefile中可以嵌入shell语言吗?例如我们需要循环读取文件夹里面的文件名在shell中MODULES = "common modules main"for dir in $MODULES;do echo $dirdone在make中就难以实现了,那么我们可以在makefile中调用shell吗?如何调用?MODULES :...

2019-08-06 17:06:35 967

原创 makefile学习(九):makefile的隐式规则

makefile出现同名目标时当多处出现同一目标命令时,make发出警告, 所有之前定义的命令被最后定义的命令取代all : @echo "target all 1" all : @echo "target all 2"什么是隐式规则make提供了一些常用的,例行的规则实现当相应目标的规则未提供时,make尝试使用隐式规则,如果make找不到相应的隐式规则,才会...

2019-08-03 17:24:46 679

原创 makefile实战(一):函数和变量的综合应用

目前有简单的func.c和main.c两个源文件,需要编译成hello_makefile可执行程序1.自动生成target文件夹存放可执行文集那2.自动生产objs文件夹存放编译生成的目标文件3.考虑代码的扩展性单步实现原理首先我们要知道文件的编译过程.用命令行如何实现这个过程?mkdir objs targetgcc -o objs/main.o -c main.cgcc -o...

2019-07-29 15:44:34 193

原创 makefile学习(八):makefile中函数的概念

makefile中函数的概念自定义函数函数是一个编程语言的必备功能.那么在makefile中,我们如何自定义函数呢?在makefile中,通过define关键字进行自定义函数. 如下:define func1 @echo "func1"endef问题1:如何调用函数?define func1 @echo "func1"endefall: $(call func1...

2019-07-26 15:47:51 196

原创 UBOOT学习(其二):如何分析uboot?

如何分析uboot既然我们知道uboot的作用,我们就可以开始分析一下uboot具体是怎么实现的了.我们可以从uboot官网上下载各个版本的uboot,为了学习方便,我下载的是1.1.6版本的.因为资料多,方便解决问题.uboot FTP下载地址然后一看uboot包含的文件,懵逼了!这么多?不是说好的,只是先flash读取,sdram初始化并吧内核拷贝到sdram,加载内核吗?按理来说...

2019-07-26 15:05:45 336

原创 UBOOT学习(其一):uboot的作用是什么?

Uboot的作用问题:在嵌入式linux中,uboot是很重要的一个部分.那么他具体的作用是什么呢?我们先来看看嵌入式linux的启动过程Created with Raphaël 2.2.0嵌入式系统bootloader加载linux内核挂载根文件系统运行应用程序我们看到,bootloader的作用就是加载linux内核.类似的我们看看我们常用pc机的启动过程Created with ...

2019-07-26 15:03:26 866

原创 makefile学习(七):全局变量和局部变量

7.makefile中的全局变量和局部变量问题:makefile变量与C/C++等高级语言的变量有什么区别?我们首先回忆一下C语言关于变量的特点吧:变量分为全局变量和局部变量:区别在于作用域不同,存储区域不同变量需要声明类型才能使用:如int、char、float等变量初始化:全局变量初始化默认为0,局部变量初始化为不确定值通过extern关键字可以在多个源文件共同使用同一个变量...

2019-07-25 11:13:14 4559

原创 makefile学习(六):变量的高级主题

6.变量的高级主题变量的替换变量值的替换使用指定字符(串)替换变量值中的后缀字符(串)语法格式:$(var:a=b) 或 ${var:a=b}替换表达式中不能有任何的空格make中支持使用 ${} 对变量进行取值变量的模式替换使用%保留变量值中的指定支付,替换其他字符语法格式:$(var:a%b=x%y) 或 ${ var:a%b=x%y }替换表达式中不能有任何空格...

2019-07-25 11:11:38 79

原创 makefile学习(五):预定义变量的使用

5.预定义变量的使用学自<狄泰软件学院>在makefile中存在一些预定义的变量自动变量$@, $^, $<特殊变量(MAKE) , (MAKECMDFOALS) , (MAKEFILE_LIST)(MAKE_VERSION), (CURDIR) , (.VARIABLES)….自动变量$@: 当前规则中触发命令被执行的目标...

2019-07-25 11:10:08 343

原创 makefile学习(四):makefile的变量

4.makefile的变量学自<狄泰软件学院>makefile变量的概念makefile中支持程序设计语言中的变量的概念makefile中的变量只代表文本数据(字符串)makefile中的变量名规则变量名可以包含字符,数字,下划线不能包含 ”:”,”#”,”=” 或 “ ”变量名大小写敏感变量的定义和使用makefile中变量的赋值方式简单赋值 ( :...

2019-07-25 11:08:51 109

原创 makefile学习(三):伪目标的引入

3.makefile伪目标的引入问题:makefile中的目标究竟是什么?makefile的目标make认为目标对应着一个文件make比较目标文件和依赖文件的新旧关系,决定是否执行命令make以文件处理作为第一优先级当我们不需要目标是一个文件时,只是需要指向相应的命令就可以了。但是如果存在一个与这个目标同名的文件时,make就会先去判断这个文件是否最新,在判断是否执行该目标的命令。...

2019-07-25 11:00:03 119

原创 makefile学习(二):makefile的结构

2.makefile的结构makefile的意义makefile用于定义源文件间的依赖关系makefile说明如何编译各个源文件并生成可执行文件makefile的基本结构targets (目标)通常是需要生成的目标文件名make所需执行的命令名称targets可以包含多个目标,使用空格对多个目标进行分隔。不带参数时,make将以文件中定义的第一个目标作为这次运行的目标。p...

2019-07-25 10:58:38 228

原创 makefile学习(一):make和makefile

1.make和makefile什么是make?为什么需要make?什么是make?make是一个特殊功能的应用程序解析源程序之间的依赖关系根据依赖关系自动维护编译工作执行宿主操作系统中的各种命令什么是makefile?Makefile是一个描述文件定义一系列的规则来指定源文件编译的先后顺序拥有特定的语法规则,支持函数定义和函数调用能够直接集成操作系统中的各种命令ma...

2019-07-25 10:57:06 151

原创 Qt原理分析(七):Qt中的事件过滤器

Qt中的事件过滤器问题:有时候我们在自定义事件时,并不是需要所有的事件类型都可以触发的,例如在数字键盘中,我们就不希望按下字母可以触发事件并输入到编辑框中。那么Qt有什么机制可以过滤掉一部分事件呢?Qt中的事件过滤器事件过滤器可以对其他组件接收到的事件进行监控任意的QObject对象都可以作为事件过滤器使用事件过滤器对象需要重启eventFilter() 函数组件通过installE...

2019-07-16 10:16:17 4434

原创 Qt原理分析(六):Qt中的事件处理

Qt中的事件处理图形界面应用程序的消息处理模型问题:操作系统发送的消息如何转变为Qt信号的?Qt事件Qt平台将系统产生的消息转换为Qt事件Qt事件是一个QEvent的对象Qt事件用于描述程序内部或外部发生的动作任意的QObject对象都具备事件处理的能力GUI应用程序的事件处理方式Qt事件产生后立即被分发到QWidget对象QWidget中的event(Q...

2019-07-16 10:14:13 214

原创 Qt原理分析(五):Qt中信号与槽的对应关系

Qt中信号与槽的对应关系到目前为止,我们已经可以吧信号与槽连接在一起了。但我们还需要考虑一些其他的可能性。例如下图所示:一个信号连接多个槽(一对多)如signal5连接了slot2和slot3。void one_to_multi(){ qDebug() << "one_to_multi()" << endl; TestSignal t; ...

2019-07-16 10:11:11 778

原创 Qt原理分析(四):信号与槽的连接方式

信号与槽的连接方式我们查看文档时,发现connect函数还有第五个参数。那么这个参数的作用是什么呢?我们之前使用的是默认值,具体的功能是什么呢?知识回顾每一个线程都有自己的事件队列线程通过事件队列接收信号信号在事件循环中被处理示例代码:信号与槽的连接方式//MyObject.hclass MyObject : public QObject{ Q_OBJE...

2019-07-16 10:09:30 689

原创 Qt原理分析(三):Qt中自定义信号

QT中自定义信号在实际的项目开发中,大多数时候是直接将组建中预定义的信号连接到槽函数;信号发射时槽函数被调用。问题:信号是怎么来的?又是如何发射的?Qt中信号(SIGNAL)的本质信号指示一个特殊的成员函数声明函数的返回值是void类型函数只能声明不能定义信号必须使用signals关键字进行声明函数的访问属性自动被设置为protected只能通过emit关键字调用函数(发射信号...

2019-07-16 10:05:00 9175 3

原创 Qt原理分析(二):Qt中自定义槽函数

Qt中自定义槽函数一般在工程项目开发中,我们都需要自定义槽函数实现具体功能。那么系统槽函数和自定义槽函数在定义上有什么区别呢?自定义槽函数的规则只有QObject的子类才能自定义槽定义槽的类必须在声明的最开始处使用Q_OBJECT类中声明槽时需要使用slots关键字槽与所处理的信号在函数签名上必须一致SIGNAL和SLOT所指定的名称中可以包含参数类型不能包含具体的参数名示...

2019-07-16 10:03:58 13736

原创 Qt原理分析(一):Qt中的消息处理

1.Qt中的消息处理Qt的消息模型Qt封装了具体操作系统的消息机制Qt遵循经典的GUI消息驱动事件模型问题:1.Qt中如何表示用于消息2.Qt中如何映射用户消息到消息处理函数3.Qt中消息映射需要遵循什么规则?信号与槽Qt中定义了与系统消息相关的概念信号(Signal)由操作系统产生的消息槽(Slot)程序中的消息处理函数连接(connect)...

2019-07-16 09:57:59 407

原创 Cortex-M3开发经验(三):在HardFault中打印栈信息

Cortex-M3开发经验(三):在HardFault中打印栈信息在《Cortex-M3开发经验(二):确认发生HardFault的地方》中,我们提到如何查找出错地方。但是这有一个问题,就是必须链接调试器。那么在某些情况下,我们无法连接调试器,那么就无法读取到栈信息了吗?我们可以在进入HardFault时,获取栈指针,然后通过串口的方式打印出来吗?说干就干,有好的想法,也必须有实际的行动验证自...

2019-06-17 21:38:34 1414 1

原创 Cortex-M3开发经验(二):确定发生HardFault的地方

Cortex-M3开发经验(二):确定发生HardFault的地方我们在调试时,最害怕就是出现HardFault错误了。因为我们不知道是从哪个地方跳到这里的?单步调试起来太过于麻烦,特别在代码量大的时候,更是费时间。那么有没有一种方法,可以快速定位到发生HardFault错误的代码位置(函数)呢?Cortex-M3中断/异常的响应过程我们知道,HardFault实质上是一个中断,中断的过程...

2019-06-17 21:37:17 447

原创 Cortex-M3开发经验(一):函数指针的应用

Cortex-M3开发经验(一):函数指针的应用在学习C语言语法时,学到一个函数指针。就是用指针指向一个函数(实质函数就是一个地址)。然后通过指针来调用该函数。当时学完之后一脸懵逼,不是不明白原理,而是不知道有什么用?直接调用不就可以了吗?何必多费功夫去搞这些花里胡哨的东西。后面发现,这个函数指针也是有应用的场景的!模拟IIC与硬件IIC的调用在我开发时,遇到这样一个问题。IIC协议...

2019-06-17 21:35:29 373

原创 GDB——GDB中一些调试中的小技巧

除了之前介绍的一些常用用法,GDB还有许多其他的功能,也是方便我们使用的。技巧示例:断点处自动打印(gdb) startTemporary breakpoint 1 at 0x804846f: file tricks.c, line 33.Starting program: /home/delphi/workspace/main.out Temporary breakpoint...

2018-06-13 17:03:32 466

原创 GDB——使用GDB查看栈帧信息

当我们阅读代码和查找BUG时,往往有一个烦恼。就是我们不知道函数的调用顺序。而这些函数调用顺序对应我们理解程序结构,程序运行过程是很有帮助的。 那么问题是:程序的调用过程往往是很复杂的,而且可能是多层嵌套,跨文件调用的。这时候如果靠人工去查找,这将是一件非常大工作量的事情。GDB中有办法帮助我们做到查看函数调用的过程吗?首先我们需要知道,函数调用信息存放在哪?只有知道函数调用信息,我...

2018-06-13 17:02:01 31113

原创 GDB——使用GDB查看内存

我们可以使用GDB来进行对指定内存地址进行查看。命令语法: x /Nuf experssion - N – 需要打印的单元数 - u – 每个单元的大小 u对应的意义:f – 数据打印的格式 f对应的意义:查看指定内存的作用这样查看指定内存数据有什么作用呢?为什么不直接用变量名呢? 实际上,直接使用变量名打印出的值,默认打印为变量类型的数值。不能自由选择打印的...

2018-06-13 17:00:07 7569

原创 GDB——使用GDB实时监控变量

示例代码:#include &lt;stdio.h&gt;#include &lt;pthread.h&gt;#include &lt;unistd.h&gt;int g_var = 0;void* thread_func(void* args){ sleep(5); g_var = 1;}int main(){ int i = 0; p...

2018-06-13 16:58:20 14268

原创 GDB——使用GDB验证代码的正确性

在软件开发中,不可避免的会产生BUG。这样我们就需要频繁的查找问题,修改代码,验证代码正确性。这样就需要我们不断的修改代码,编译代码。这样的话就白白浪费了需要时间。GDB为我们提供了解决方案,我们可以实时修改有问题的代码,验证一下代码是否正确,再修改源代码。示例过程:(gdb) startTemporary breakpoint 5 at 0x8048498: file test.c...

2018-06-13 16:57:32 167

原创 GDB——使用GDB动态链接到进程

GDB支持链接到一个正在运行的进程。一遍检测它的运行状态。示例过程:Bakuman@Shaw-vm:~$ su密码: root@Shaw-vm:/home/delphi# cd workspace/root@Shaw-vm:/home/delphi/workspace# lsClearRTOS embedded func.c test.c test.outroot@S...

2018-06-13 16:56:06 859

原创 GDB——GDB的断点调试

那么我们应该如何使用GDB呢?GDB为我们提供了什么样的功能呢?我们可以参照图形界面调试器的基本功能,使用GDB来实现。例如: 问题:我们如何使用GDB设置断点,删除断点的操作? - 通过函数名设置断点 1. break func_name [ if var = value ] 2. tbreak func_name [ if var = value ] - 通过文...

2018-06-13 16:54:52 8697

原创 GDB——GDB调试工具简介

什么是GDB?GDB的常规应用GDB的启动方式什么是GDB?GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。 问题:既然windows下有对用户友好的图形界面的调试工具了。那么为什么我们还需要回到命令行的模式呢? 如果我们是在UNIX平台下做软件,我们会发现基本...

2018-06-12 19:58:05 4147

原创 binutils——如何找到内存中的内存错误

addr2lineAddr2line示例:定位0地址访问1.开启core dump选项2.运行程序,并生成崩溃的core文件3.读取core文件,获取IP寄存器的值4.使用addr2line定位代码行strip 问题:我工程项目中,经常会出现内存操作错误这样的BUG。而这种BUG往往是很难发现的,因为编译器发现不了这样的错误,并且发生错误的地方和导致错...

2018-06-12 19:56:28 438

原创 binutils——如何将程序打包为库文件

静态库文件动态库文件静态库与动态库的区别在我们开发项目过程中。经常会遇到使用第三方程序的情况。而这个时候我们只需要调用第三方提供的库文件和接口文档就可以了,我们并看不到源代码。而这个库文件又是许多源文件编译得来的。 问题:我们如何将多个源文件打包成一个库文件呢?静态库文件由链接器在链接时将库的内容直接加入到可执行程序中。Linux下静态库的创建和...

2018-06-12 19:55:13 1020

原创 binutils——查看可执行文件中包含的信息

nm段标识符说明:sizestringsobjdumpobjdump–h 的输出说明有时候我们知道我们编译出来的可执行文件中包含了什么。方便我们查找问题。但是可执行文件又不可以直接打开。 那么我们可以使用什么工具来查看可执行文件包含的信息呢?nm列出目标文件中的标识符(变量名,函数名)输出结果由三部分组成:{ 地址, 段, 标识符...

2018-06-12 19:53:31 1226

原创 binutils——GCC的辅助工具集

什么是开发环境?构建环境调试环境测试环境Binutils工具集工具名 功能简介什么是开发环境?构建环境编写代码,程序编译,版本控制(可选)版本控制多数在公司中使用,个人开发我们常常使用备份的方式来保存之前的版本。常用版本控制有:SVN、Git等。调试环境用于定位问题的辅助工具集当我们编写完程序后,经常会出现各种各样...

2018-06-12 19:50:03 1083

原创 通过机制解决问题的设计原则

核心:考虑当前设计是否存在“漏洞”意图:杜绝类似问题的再次发生案例:消息传递 例如有A设备和B设备。两个设备需要进行通信。 问题:当A设备无法收到B设备的RSP消息时,会发生什么?当A设备无法收到RSP消息时,就无法发送ACK消息给设备B,然后两个设备的就进入了相互等待的状态。 问题:如何解决这个问题呢?我们可以让设备B定时重发RSP消息,这...

2018-06-10 23:44:17 415

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除