我们本节来看看程序的结构体系。我们在平时所编写的程序中,其实它的结构是非常值得研究的,这样有助于我们编写出效率更高的代码,并且也有助于我们理解整个可执行文件的架构。好了,废话不多说。那么我们的程序究竟是由什么构成的呢?它是由不同的段所构成的,包括代码段、数据段等。 &n
在上节博客中,我们学习了链接器的知识。那么本节课我们继续学习嵌入式开发中的一些常用的操作,今天我们学习的是在GNU开发中,必不可少的调试利器GDB。可能搞底层的同志或多或少的听过GDB,但是觉得它总是那么的神秘,很模糊。那么我们今天就来看看GDB。先从它的概念开始介绍,什么是GDB呢?它是GNU项目中的调试器(gnudebuger),它的作用是能追踪程序的执行,也能恢复程序崩溃前的状态。那么我们为
在上节博客中,我们介绍了链接器的相关概念。那么在本节,我们就继续来看看链接器,看看它在工程实践中的应用。我们在本节中做一个实验,来模拟在嵌入式中的开发。实验的目标:1、编写一个“体积受限”的可执行程序;2、通过makefile完成代码编译;3、运行后在屏幕上打印“D.T.Software”那么这个目标看似很简单,我们在初学编程时就直接打印经典的helloworld。其效果类似,经典的代码是#inc
在之前我们学习了嵌入式开发中的相关知识点,今天我们来看看链接器。我们在平时的开发中,源文件被编译后生成目标文件(.o文件)时,这些目标文件时如何存在于最终的可执行程序呢?那么此时就需要链接器来出场了。我们首先来看看链接器的意义:它的主要作用是把各个模块之间相互引用的部分进行一个处理,使每个模块之间能够进行正确的衔接,进而使得最终的可执行文件能够正常运行。示例图如下其实我们在平时生成的目标文件中,具
我们在嵌入式的开发中,会遇到各种工具。那么在此篇博客中我们将介绍在嵌入式软件开发中的各种工具以及硬件处理器相关的知识,以助于我们在以后的嵌入式开发中更方便的进行开发。 本系列博客内容是根据狄泰软件学
今天我们来看一看开发中的辅助工具,那么什么是开发环境呢?在我们的印象中,开发环境就指的是编写代码的环境。其实不然,开发环境包括三大部分:构建环境、调试环境以及测试环境。构建环境便指得是代码编写、程序编译以及版本控制等;调试环境则指的是用于定位问题的辅助工具集;测试环境指的是用于验证目标程序是否满足用户的显性需求和隐形需求。显性需求指的是客户的要求,而隐形需求则指的是一些用户没有要求到的但是必须具备的要求。比如一个应用程序在 win7 系统上可以运行起来,在 win10 系统上也要能运行起来。在嵌入式的开发中,我们在整个项目中的代码编写及目标构建上一般只花费 20% 的时间,剩下的 80% 的时间适用于测试、调试以及 bug 修复的。那么我们该如何提高开发效率呢?工欲善其事必先利其器,我们可以借助于一些工具,从而提高开发的效率。GNU 为 GCC 编译器提供了配套的辅助工具集(Binutils),网址是 http://www.gnu.org/software/binutils/ ;
我们在嵌入式的开发中经常会见到 GCC 和 gcc,那么它们两有何不同呢?GCC(GNU Compile Collection) 是指 GNU 编译器集合,包含众多语言的编译器,如 C、C++、Java、D、Objective-C 等;而 gcc 则是特指 GCC 中的 C 语言编译器。那么 GCC 与嵌入式的关系是怎样的呢?多数嵌入式操作系统都是基于 GCC 进行源码编译,如 Linux、VxWorks 以及 Android 等。在实际的开发中,内核相关的开发用的是 gcc,而应用开发用的是 gcc/g++/gdc 等。下来我们来看看一个嵌入式开发中的高端大气上档次的词语:交叉编译。那么为什么会有交叉编译呢?在以往的嵌入式设备往往都是资源受限的,不可能直接在嵌入式上直接对处理器进行编程。那么此时的解决方案便是在开发主机(PC)上对源码进行编译,最终生成目标主机(嵌入式设备)的可执行程序。gcc 是如何进行交叉编译的呢?1、配置目标主机的编译工具链(如arm-linux);2、配置工具链的具体版本:根据具体的目标代码选择相应的工具链版本,正确使用关于硬件体系的特殊编译选项。
今天我们来看看缓存。在我们平时的生活中,知道处理器和内存是不同的。它们所使用的半导体器件工艺不同,工艺的差异导致了处理器与内存的速度差异。处理器的器件比内存是要好很多的,因此它的容量就势必很小;而内存虽然速度慢,但是它很便宜,因此容量一般较大。在进行数据的处理时,处理器总是需要等待内存,处理器的速度是远远大于内存的。在一般程序访问的时候,它会出现局部性的概念。也就是说,在短时间内,处理器访问的存储空间是一个很小的范围。局部性分为两种:时间局部性和空间局部性。局部时间性是指某个存储单元在短时间内很可能被再次访问,而空间局部性是指某个存储单元的邻近单元在短时间内也被访问。我们在处理器与内存之间就引进了一个中间介质,它叫高速缓冲存储器,俗称 cache。下来介绍下它的特性:1、cache 是一种小容量的高速存储器;2、cache 的存取速度与处理器的运算速度几乎同量级;3、cache 在现代计算机系统中内置于处理器芯片中。在处理器与内存之间设置 cache 能大大地提高效率,将内存中被频繁访问的指令和数据复制到 cache 中。
今天我们来看看嵌入式中的内存管理单元(MMU),它是现代处理器对内存进行高效管理的功能单元,操作系统利用内存管理单元能够实现虚拟内存和内存保护。我们先来看个有意思的问题,下面的程序运行两次后的输出是否完全相同?为什么呢?我们先来分析下。理论上,不同进程在内存中的不同位置执行;因此,全局变量的地址是不同的。关系如下我们来看看结果我们看到两次运行的结果的地址是相同的,也就是说我们之前的分析是错误的。我
我们今天来看看中断,什么是中断呢?中断是一种处理器与外设进行通信的机制,它用于“通知”处理器外部有“重要事件”发生。在一般情况下,中断需要被处理器响应。下来我们来看看中断服务程序(ISR):1、从外设中读取中断状态寄存器的值,以便了解中断类型;2、根据中断类型具体设计处理逻辑;3、清除外设状态寄存器中的中断标识位;4、清除处理器中的中断标识位。
在嵌入式开发中,处理器有两种:微控制器和微处理器。那么这两种处理器有何区别呢?微控制器 = CPU + 片内内存 + 片内外设;微处理器 = CPU。在以前嵌入式硬件资源很少时,它们的区别对于硬件工程师来说还是很大的。但是在现代的嵌入式中,它们的概念都差不多了。相对来说,微控制器具有成本低,功耗低等优点,常用于嵌入式系统设计;对于软件工程师而言,微控制器和微处理器没有任何区别。下来我们来看看寄存器的分类:CPU 寄存器和外设寄存器。CPU 寄存器是指专用指令执行、数据运算、变量处理以及参数传递;外设寄存器是指用于控制外设的行为和工作方式,寄存器值得配置需要根据芯片手册完成。在处理器中关键寄存器:PC - 重新计数器(指令指针 IP)和 SP - 栈指针(Stack Pointer)。PC 程序计数器的特性,每执行一条指令,PC 中的值就会发生变化,PC 时钟保存下一条 CPU 要执行的指令地址。SP栈指针的特性,始终指向栈空间的顶端,实现 LIFO 特性,保存中断断点、函数调用返回点以及 CPU 现场数据等。
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号