嵌入式系统开发与应用——Linux系统编程初步

一、 实验目的

1、掌握Linux中VI的使用方法;
2、通过实验学习 gcc 编译器编译 c 程序的方法,熟悉 gcc 编译程序的各个阶段;
3、掌握使用gdb跟踪、调试程序。
4、熟练掌握C语言中的位操作

二、 实验仪器设备

PC机、Windows环境。

三、 实验原理

利用Windows中的虚拟机软件安装Ubuntu Linux,并在其中进行训练。

四、 实验内容及注意事项

1、在Ubuntu Linux 中用vi编辑C语言程序;
2、用gcc对C程序进行编译链接生成可执行程序;
3、用gdb对可执行程序进行跟踪调试;
4、编写程序验证C语言中的位操作符;

五、 实验组织运行

根据本实验指导书,学生自主训练为主。

六、 实验步骤

(一)Linux 编辑器 vi 的使用
1、vi 的模式
vi 有 3 种模式,分别为命令行模式、插入模式及底行模式。各模式的功能,下面具体进行介绍。
(1) 命令行模式
用户在用 vi 编辑文件时,最初进入的为一般模式。在该模式中可以通过上下移动光标进行“删除字符” 或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。
(2) 插入模式
只有在该模式下,用户才能进行文字编辑输入,用户按[ESC]键回到命令行模式。
(3) 底行模式
在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。
2、vi 的基本流程
(1)进入 vi:即在命令行下键入 vi hello(文件名)。此时进入的是命令行模式,光标位于屏幕的上方,如下图所示。
在这里插入图片描述
(2)在命令行模式下键入 i 进入到插入模式,如图所示。可以看出,在屏幕底部显示有“插入” 表示插入模式,在该模式下可以输入文字信息。
在这里插入图片描述
(3)最后,在插入模式中,输入“Esc”,则当前模式转入命令行模式,并在底行中输入“:wq”(存盘退出)进入底行模式,如图所示。
在这里插入图片描述
3、vi 的各模式功能键
(1)命令行模式常见功能键如表 3.1 所示。
在这里插入图片描述
在这里插入图片描述
(2)插入模式的功能键只有一个,也就是 Esc 退出到命令行模式。
(3)底行模式常见功能键如表 3.2 所示。
在这里插入图片描述
这样,就完成了一个简单的 vi 操作流程:命令行模式→插入模式→底行模式。由于 vi 在不同的模式下有不同的操作功能,因此,读者一定要时刻注意屏幕最下方的提示,分清所在的模式。

4、用vi编辑hello,world程序。

(二)编译器gcc的使用
GNU CC(简称为 Gcc)是 GNU 项目中符合 ANSI C 标准的编译系统,能够编译用 C、C++和 Object C 等语言编写的程序。gcc 不仅功能强大,而且可以编译如 C、C++、Object C、Java、Fortran、Pascal、Modula-3 和 Ada 等多种语言,而且 gcc 又是一个交叉平台编译器,它能够在当前 CPU 平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
下表 3.3 是 gcc 支持编译源文件的后缀及其解释。
在这里插入图片描述
gcc 有超过 100 个的可用选项,主要包括总体选项、警告和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。
1、总体选项
gcc 的总结选项如表 3.4 所示,很多在前面的示例中已经有所涉及。
在这里插入图片描述
以下操作步骤对上面在vi中编写好的程序进行编译、生成可执行程序。

2、使用 gcc 编译程序

$ gcc helloworld.c –o hello

3、执行应用程序

$ ./hello

4、分步编译程序,生成预编译展开文件。

$ gcc -E helloworld.c -o hello.i

5、分步编译程序,生成汇编文件。

$ gcc -S helloworld.c -o hello.s

6、分步编译程序,生成目标代码。

$gcc -c helloworld.c -o hello.o

(三)Linux系统GDB调试工具使用
1、使用 vi 编辑器,将以下代码输入到名为 greet.c 的文件中。此代码的原意为倒序输出 main 函数中定义的字符串,但目前程序结果没有输出。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int display1(char *string);
int display2(char *string);

int main (int argc,char **argv)
{
	char string[] = "Embedded Linux";

	display1 (string);
	display2 (string);

	return 0;
}

int display1 (char *string)
{
	printf ("The original string is %s \n", string);
}

int display2 (char *string1)
{
	char *string2;
	int size,i;

	size = strlen (string1);
	string2 = (char *) malloc (size+1);
	for (i = 0; i < size; i++)
		string2[size - i] = string1[i];
	string2[size+1] = ' ';
	printf("The string afterward is %s\n",string2);
	free(string2);
}

2、使用 gcc 编译这段代码, gcc –g greet.c –o greet,注意要加上‘-g’选项以方便之后的调试。
3、运行生成的可执行文件./greet,观察运行结果。
4、使用 gdb 调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
5、纠正错误,更改源程序并得到正确的结果。
6、启动 gdb 调试: gdb greet
7、查看源代码,使用命令‘l’。
8、在 30 行(for 循环处)设置断点,使用命令‘b 30’
9、在 33 行(printf 函数处)设置断点,使用命令‘b 33’
10、查看断点设置情况,使用命令‘info b’
11、运行代码,使用命令‘r’
12、单步运行代码,使用命令‘n’
13、查看暂停点变量值,使用命令‘p string2[size - i]’
14、继续单步运行代码数次,并使用命令查看,发现 string2[size-1]的值正确。
15、继续程序的运行,使用命令‘c’
16、程序在 printf 前停止运行,此时依次查看 string2[0]、 string2[1]…,发现 string[0]没有被正确赋值,而后面的复制都是正确的,这时,定位程序第 31 行,发现程序运行结果错误的原因在于‘size-i’。由于 i只能增到‘size-i’,这样 string2[0]就永远不能被赋值而保持 NULL,故输不出任何结果。
17、退出 gdb,使用命令 q
18、修改 greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size-i-1] = string1[i];”即可。
19、使用 gcc 重新编译: gcc –g greet.c –o greet
20、查看运行结果: ./greet,得到结果正确

七、 实验报告

(一)vi、gcc使用
(1)请在vi中编辑C语言程序test1.c,程序功能实现输出123……*10的累积,将输入完成的程序界面抓图如下:
在这里插入图片描述
(2)复制程序的3-7行,并抓图如下:
在这里插入图片描述
(3)将上一复制完成后的程序另存为test2.c,请将保存命令屏幕抓图如下:
在这里插入图片描述
(4)取消行号显示,并抓图如下:
在这里插入图片描述
(5)使用 gcc 编译test1.c程序并抓图如下:$ gcc test1.c –o test1
在这里插入图片描述
(6)执行应用程序test1,抓图如下:
在这里插入图片描述
(二)GDB使用
(1)编辑上面操作步骤中“Linux系统GDB调试工具使用”中的greet.c文件,编译后执行程序,将程序结果抓图如下:
在这里插入图片描述
(2)启动 gdb 调试,并使用命令‘l’ 查看源代码,抓图如下:
在这里插入图片描述
(3)在30、33行设置断点,并查看断点设置情况,抓图如下:
在这里插入图片描述
(4)使用命令‘r’ 运行代码后单步运行代码,抓图如下:
在这里插入图片描述
(5)继续程序的运行,抓图指出程序中错误的位置:
在这里插入图片描述
(6)退出 gdb,重新编辑 greet.c,修改其中的错误后重新编译运行程序,将程序正确的运行结果抓图如下:
在这里插入图片描述
在这里插入图片描述
(三)位操作编程
(1)编辑wei1.c文件,内容如下:

#include <stdio.h>
     int main ()
   {
          int a=-1;
          printf("\t\t%d\n",sizeof(a));
          printf("\t\t%x\n",a);
   }

(2)编译后执行程序,并将执行结果抓图如下:
在这里插入图片描述
(3)请回答:实验平台所用的Linux系统,其int 型变量是多少字节的?
答案:4个字节
(4)修改上面的程序,实现将变量a中的值的低4位全部置为0;
请将修改后的代码窗口抓图如下:
在这里插入图片描述
请将程序的执行结果抓图如下:
在这里插入图片描述
(5)在上面程序的基础上,将变量a中的第28位、20位置为0,其余位保持不变,请修改程序实现。
请将修改后的代码窗口抓图如下:
在这里插入图片描述
请将程序的执行结果抓图如下:
在这里插入图片描述
(6)先将变量a的值置为0,再将其16~19位置为1,其余位保持不变。请修改程序实现。
请将修改后的代码窗口抓图如下:
在这里插入图片描述
请将程序的执行结果抓图如下:
在这里插入图片描述

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 嵌入式系统设计与应用是指在特定应用领域使用嵌入式处理器和相关硬件资源,结合嵌入式操作系统和软件开发工具,设计和开发满足特定需求的嵌入式系统。 ARM Cortex-A8是一款高性能的嵌入式处理器,广泛应用于手机、平板电脑、智能电视等嵌入式设备。它具有强大的计算能力和低功耗特性,能够提供快速、高效的数据处理和多任务处理能力。 Linux是一种开源的嵌入式操作系统,提供了丰富的软件资源和开发工具,可以满足各种嵌入式应用的需求。在使用ARM Cortex-A8和Linux进行嵌入式系统设计和应用时,可以借助Linux的强大功能和丰富的软件生态系统,快速开发出满足特定需求的嵌入式应用。 设计和开发嵌入式系统时,首先需要选择合适的硬件平台和操作系统。选择ARM Cortex-A8作为处理器可以得到高性能和低功耗的优势,而选择Linux作为操作系统可以借助其丰富的软件资源和开发工具。 然后,根据具体的嵌入式应用需求,对系统进行架构设计和软件模块划分。在嵌入式系统设计,需要考虑系统的实时性、功耗控制、硬件接口与外设的驱动、应用程序的开发等方面。 在应用开发阶段,可以使用C/C++等编程语言,结合相应的开发工具,编写应用程序和驱动程序。同时,可以借助Linux的丰富资源,如网络协议栈、文件系统、数据库等,快速实现系统的功能。 最后,在系统调试和测试阶段,可以使用调试工具和仿真平台进行系统性能测试和调试,以确保系统的稳定性和可靠性。 综上所述,嵌入式系统设计与应用基于ARM Cortex-A8和Linux可以提供高性能、低功耗和丰富软件资源的优势,能够快速开发出满足特定需求的嵌入式应用。 ### 回答2: 嵌入式系统设计与应用是指将计算机系统嵌入到特定的电子设备,以完成特定的功能。基于ARM Cortex-A8和Linux嵌入式系统设计与应用是指利用ARM Cortex-A8处理器和Linux操作系统来设计和开发嵌入式系统。 ARM Cortex-A8是一种高性能、低功耗的32位RISC处理器。它采用精简指令集架构,具有较高的运算能力和较低的能耗。Cortex-A8处理器广泛应用于嵌入式领域,可用于智能手机、平板电脑、汽车导航系统等各种嵌入式设备。 Linux是一种开源的操作系统内核,具有广泛的硬件支持和强大的软件生态系统。在嵌入式系统设计Linux提供了丰富的功能和驱动支持,能够提供稳定可靠的操作环境。同时,Linux还可以方便地进行定制和扩展,以满足各种应用需求。 在基于ARM Cortex-A8和Linux嵌入式系统设计,我们可以利用Linux提供的运行时库、工具链以及开发环境来进行系统开发。可以利用C/C++编程语言来进行应用程序的开发使用Linux提供的设备驱动程序来进行硬件的控制和交互。同时,我们还可以利用Linux的网络支持和文件系统功能来实现网络连接和数据存储。 综上所述,基于ARM Cortex-A8和Linux嵌入式系统设计与应用具有高性能、低功耗、可定制和可扩展等优势,可以适用于各种嵌入式设备的开发应用。它在智能手机、平板电脑、汽车导航系统等领域具有广泛的应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值