0

    嵌入式开发之Linux系统中C程序的编译与调试

    2023.06.04 | admin | 127次围观

    请大家关注点赞,已经完成物联网相关开发,会从硬件层,硬件中间层,传输层,软件中间件(物联网云平台),APP开发相关博文。首先从嵌入式开发博文开始!上一节关于。本节关于Linux系统中C程序的编译与调试介绍。

    1、首先了解一下什么是程序设计?

    1)计算机基本结构

    冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。

    计算机由以下图中5个部分组成;存储程序的思想是:系统的运行过程就是按照一定的顺序不断执行存储器中程序指令的过程。

    冯·诺依曼结构

    演示过程

    注:MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。

    2)什么是程序

    广义上讲,为了实现某个特定的目标,而预先设计的一组可操作的工作步骤,称之为程序。程序就是系统可以识别得一组有序的指令。存储在磁盘上,被加载到内存中执行。

    3)程序设计语言的发展

    A机器语言

    机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据。机器码有时也被称为原生码(Native Code),这个名词比较强调某种编程语言或库,它与运行平台相关的部份。

    虽然大多数的语言可以既可被编译(Compiled)又可被解译(interpreted),但大多数只在一种情况下能够良好运行。在一些编程系统中,程序要经过几个阶段的编译,一般而言,后阶段的编译往往更接近机器语言。这种常用的使用技巧最早在1960年代末用于BCPL,编译程序先编译一个叫做“0代码”的转换程序(representation),然后再使用虚拟器转换到可以运行于机器上的真实代码。这种成功的技巧之后又用于Pascal和P-code,以及Smalltalk和二进制码,虽然在很多时候,中间过渡的代码往往是解译,而不是编译的。

    B汇编语言

    汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集易语言网截调发送源码,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的不同平台之间不可直接移植。

    许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。

    汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。

    C高级语言

    高级语言并不是特指的某一种具体的语言,而是包括很多编程语言易语言网截调发送源码,如流行的java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易语言,中文版的C语言习语言等等,这些语言的语法、命令格式都不相同。

    低级语言分机器语言(二进制语言)和汇编语言(符号语言),这两种语言都是面向机器的语言,和具体机器的指令系统密切相关。机器语言用指令代码编写程序,而符号语言用指令助记符来编写程序。

    高级语言与计算机的硬件结构及指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好的描述各种算法,而且容易学习掌握。但高级语言编译生成的程序代码一般比用汇编程序语言设计的程序代码要长,执行的速度也慢。所以汇编语言适合编写一些对速度和代码长度要求高的程序和直接控制硬件的程序。高级语言、汇编语言和机器语言都是用于编写计算机程序的语言。

    高级语言程序“看不见”机器的硬件结构,不能用于编写直接访问机器硬件资源的系统软件或设备控制软件。为此,一些高级语言提供了与汇编语言之间的调用接口。用汇编语言编写的程序,可作为高级语言的一个外部过程或函数,利用堆栈来传递参数或参数的地址。

    4)程序设计步骤

    在Linux系统C程序的设计步骤如下:

    设计步骤

    2、计算机数据表示

    学习编程,从数据表示开始。表示,存储等。

    送入计算机的数值、字母、符号等信息必须转换成0,1组合的数据形式才能被计算机识别。能够进行算术运算得到明确数值概念的信息成为计算机数值数据,其余的信息成为非数值数据。

    1)数值数据的表示

    包括十进制、二进制、十六进制和八进制。

    进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。 基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。 位权是指,进位制中每一固定位置对应的单位值。

    在进行进制转换时有一基本原则:转换后表达的“量”的多少不能发生改变。二进制中的111个苹果和十进制中的7个苹果是一样多的。

    十进制中的数位排列是这样的…… 万 千 百 十 个 十分 百分 千分……

    R进制中的数位排列是这样的……R^4 R^3R^2 R^1 R^0 R^-1 R^-2 R^-3……

    十进制--->二进制

    对于整数部分,用被除数反复除以2,除第一次外,每次除以2均取前一次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位。

    对于小数部分,采用连续乘以基数2,并依次取出的整数部分,直至结果的小数部分为0为止。故该法称“乘基取整法”

    附:原码 反码 补码

    符号位正数为0,负数为1。

    正数:5 原码:00000101 反码:00000101 补码:00000101

    负数:-5 原码:10000101 反码:11111010 (原码除符号为取反) 补码:11111011 (反码加1)

    2)非数值数据的表示

    非数值数据包括文字、符号、图像、语言和逻辑信息等,也都是以0,1形式存在的。字符数据在机器内也变变换成二进制编码形式。普遍采用ASCII码。

    可以用命令:man ASCII 查看ASCII信息。

    ASCII码

    3、程序编译与调试

    1)gcc编译器

    gcc(GNU Compiler)是GNU推出的多平台编译器。可将C/C++源程序编译连接成可执行文件,支持一下后缀:

    .c c语言源代码

    .h h程序所包含的头文件

    .i i已经预处理过的C源代码文件

    .s s汇编语言源代码

    .o o编译后的目标文件

    操作命令:

    gcc -o hello hello.c

    -o 输出可执行文件

    -c 只要编译器输出目标代码(.o文件),而不必输出可执行文件

    -g 用于调试

    ./hello 查看输出结果

    案例:编译上一节中test.c

    gcc 编译test.c

    Ctrl +l 清屏

    换种方式

    gcc 编译test.c

    2)程序调试

    利用__FILE__,__LINE__,__FUNCTION__实现代码跟踪调试。

    修改test.c代码

    修改test.c代码

    gcc 编译出错

    继续修改test.c代码

    修改test.c代码

    gcc 编译

    一步一步修改,调试到不报错为止。

    3)C语言基础

    一个程序应该包含两个部分内容:

    对数据的描述:在程序中要指定数据的类型和数据的组织形式,即数据结构。

    对操作的描述:即操作步骤,也就是算法。

    在PC上编写的C程序,如何在AMR上运行?

    gcc运行版本不一样,编译C结果一样。选择合适gcc编译器版本即可。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论