0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

倩倩 来源:乐创iot 2020-04-21 11:31 次阅读

我主要是做工业自动化方面和物联网方面的。了解熟悉工业自动化领域的,也开发过物联网相关的产品。我的初衷是做工业物联网的,但这个系统太过于庞大。所以就先做小的系统,例如构建一整套智能家居系统,从硬件到软件全系列。下面就开始这套智能家居系统是如何在物联网基础上构建。在这里你可以0开始,然后到1质变,仅仅需要一起跟我学物联网系列的开发笔记的文章。

第一节物联网开发笔记——嵌入式开发Linux系统环境搭建搭建主要讲解了在Windows系统下,用虚拟机的方法搭建环境。第二节物联网开发笔记——嵌入式开发之Linux系统中文件和目录相关命令主要讲解Linux系统如何创建文件删除修改等相关命令。第三节物联网开发笔记——嵌入式开发之Linux系统Vi编辑器的使用主要讲解Vi编辑器的使用。嵌入式开发学习C语言打下基础。本节介绍《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程序的设计步骤如下:

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信息。

man 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 查看输出结果

案例:编译上一节《《嵌入式开发之Linux系统中Vi编辑器的使用》》中test.c

结果

Ctrl +l 清屏

换种方式

换种方式结果

2)程序调试

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

修改test.c代码

修改test.c代码

继续修改test.c代码

继续修改test.c代码

继续修改test.c代码

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

3)C语言基础

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

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

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2903

    文章

    44256

    浏览量

    371113
  • 嵌入式开发
    +关注

    关注

    18

    文章

    1022

    浏览量

    47507
  • 冯·诺依曼结构

    关注

    1

    文章

    7

    浏览量

    3624
收藏 人收藏

    评论

    相关推荐

    零基础嵌入式开发学习路线

    Linux基本操作 什么是Linux?为什么要学LinuxLinux是一个操作系统,类似于平常使用的Windows
    发表于 10-25 15:55

    嵌入式开发常用软件有哪些?

    用于编写、编译调试嵌入式系统软件。它提供了一个集成的开发环境(IDE),包括代码编辑器、编译
    发表于 09-09 15:22

    嵌入式linux开发的基本步骤有哪些?

    嵌入式Linux开发是一个复杂的过程,涉及到硬件选择、操作系统移植、驱动开发、应用程序
    的头像 发表于 09-02 09:11 390次阅读

    嵌入式linux开发板芯片的工作原理

    嵌入式Linux开发板是一种基于Linux操作系统嵌入式
    的头像 发表于 09-02 09:07 322次阅读

    嵌入式开发前景怎么样?

    嵌入式开发前景非常广阔,这主要得益于物联网、人工智能、大数据等技术的快速发展,以及嵌入式系统在各个领域的广泛应用。以下是对嵌入式开发前景的详细分析
    的头像 发表于 07-10 09:00 2489次阅读
    <b class='flag-5'>嵌入式开发</b>前景怎么样?

    ARM Cortex-A53嵌入式开发平台FETT507-C OKT507-C用户编译手册

    电子发烧友网站提供《ARM Cortex-A53嵌入式开发平台FETT507-C OKT507-C用户编译手册.pdf》资料免费下载
    发表于 04-28 15:20 0次下载

    C语言:嵌入式开发的关键编译器角色

    嵌入式程序开发跟硬件密切相关,需要使用C语言来读写底层寄存器、存取数据、控制硬件等,C语言和硬件之间由
    发表于 04-26 14:53 546次阅读
    <b class='flag-5'>C</b>语言:<b class='flag-5'>嵌入式开发</b><b class='flag-5'>中</b>的关键<b class='flag-5'>编译</b>器角色

    嵌入式软件开发应该掌握哪些知识?

    知识点学习 熟悉 Linux 的基本使用对于嵌入式软件开发至关重要。包括文件系统的管理、用户权限的控制、软件包管理等。嵌入式开发人员需要能够
    发表于 02-19 11:23

    嵌入式自学好书推荐

    令、编辑器VI、编译器GCC、调试器GDB以及Make项目管理工具、Shell和Makefile脚本编写等知识,并搭建嵌入式开发环境。推荐书籍:《Linux从入门到精通》。 无论从就
    发表于 01-11 15:13

    嵌入式开发学习的十三法则分享

    嵌入式开发学习是一个不断积累和总结的过程,来自一个嵌入式开发高级工程师为我们总结的关于嵌入式开发学习的十三法则,大家不妨参考一下: 一、冗余度法则 在嵌入式
    发表于 12-21 06:32

    【从0开始创建AWTK应用程序编译应用到嵌入式Linux平台运行

    。搭建Linux平台交叉编译环境在上一篇文章我们介绍了使用AWTK开发简单的应用并在PC上模拟运行,本篇文章就来介绍一下怎么让应用程序运行在嵌入式
    的头像 发表于 12-07 12:08 669次阅读
    【从0开始创建AWTK应用<b class='flag-5'>程序</b>】<b class='flag-5'>编译</b>应用到<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>平台运行

    嵌入式开发的交叉编译详解

    嵌入式开发,经常会遇到目标平台资源贫乏,无法运行需要的编译器。亦或是目标平台上不允许或不能够安装需要的编译器。这时候就需要使用交叉编译
    的头像 发表于 12-01 13:24 1148次阅读
    <b class='flag-5'>嵌入式开发</b><b class='flag-5'>中</b>的交叉<b class='flag-5'>编译</b>详解

    嵌入式开发为什么需要输出调试信息?

    嵌入式开发为什么需要输出调试信息? 因为输出调试信息是嵌入式开发中一项非常重要的实践,它有助于保证软件的可靠性、稳定性和性能,也是故障排查的关键工具之一。
    发表于 11-28 16:46

    嵌入式开发测试秘诀

    。 多年前,一位工程师为了对嵌入式拥有更深层次理解的追求,曾发出这样的疑问:“我怎么才能知道并懂得我的系统到底在干些什么呢?”。同时代的嵌入式开发人员问得最多的问题大都围绕“我怎么才能使程序
    的头像 发表于 11-24 16:18 507次阅读

    嵌入式C语言的结构特点

    嵌入式开发既有底层硬件的开发又涉及上层应用的开发,即涉及系统的硬件和软件,C语言既具有汇编语言
    的头像 发表于 11-24 16:16 640次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>语言的结构特点