2014025692 《嵌入式系统程序设计》第三、四周学习总结

2014025692 《嵌入式系统程序设计》第三、四周学习总结

第三周和第四周我们主要学习了Linux交叉开发环境的搭建与bootloader的配置、移植和编译相关的知识,以及一些相关的技巧,另外还简单复习了C语言操作文件的函数。

一、Linux交叉开发环境的搭建

交叉开发:在主机环境下开发,在目标板上运行的开发模式叫作交叉开发。
交叉编译:在主机环境下生成目标板上的可执行代码的编译方式为交叉编译。
进行交叉开发前,需要对交叉开发环境进行一定的配置,包括交叉开发工具的安装、测试以及环境变量的配置。
搭建交叉开发环境需要有交叉开发工具arm-linux-gcc-3.4.6-glibc-2.3.6,以下便是交叉开发工具的安装、测试与配置的步骤:

1、交叉开发工具的安装

arm-linux-gcc-3.4.6-glibc-2.3.6的下载地址为:http://labfile.oss.aliyuncs.com/courses/811/gcc-3.4.6-glibc-2.3.6.tar.bz2
有两种方法可以将该工具装入Linux中:
(1)可以将其下载入windows系统中,通过虚拟机软件将其传入Linux虚拟系统中。
(2)也可以在Linux系统中直接通过以上的网址将开发工具下载到Linux系统中,命令为:

# wget http://labfile.oss.aliyuncs.com/courses/811/gcc-3.4.6-glibc-2.3.6.tar.bz2

总之,软件压缩包,把传入或下载的压缩包解压即可成功安装(类似Windows中的绿色软件,解压即可,不需要手动安装)。命令如下:

# tar jxvf gcc-3.4.6-glibc-2.3.6.tar.bz2

技巧&心得:
  (1)wget+网址的命令格式十分实用,在联网的情况下,可以直接把软件下载到Linux中,省去了Windows与Linux共享的麻烦。
  (2)个人认为VMware的共享功能相较于VirtualBox更加强大,不仅设置共享文件夹方便的多,而且可以直接脱宅共享。(也许我对VirtualBox了解不够深~~~)

2、交叉开发工具的运行测试

交叉开发工具运行需要一定的条件支持,需要尝试运行该工具,测试当前的环境是否符合要求。
进入gcc-3.4.6-glibc-2.3.6安装目录的bin目录下,输入以下代码进行测试:

# ./arm-linux-gcc -v          // 查看 arm-linux-gcc 的版本

若Linux系统为64位,则会出现以下错误提示:

这是因为安装的gcc-3.4.6-glibc-2.3.6是32位软件,与64位的Linux系统不兼容导致的。在联网的情况下,可以通过输入以下命令解决:

# sudo apt-get update                  // 同步最新的apt-get列表
# sudo apt-get install lsb-core        // 安装LSB标准,提高软件兼容性

安装LSB标准后,再次输入 ./arm-linux-gcc 会发现没有上面的提示了。

3、配置环境变量

arm-linux-gcc是一个文件,只能进入gcc-3.4.6-glibc-2.3.6下的bin目录运行。而这条语句的功能是编译,需要在其他目录像shell语句一样去执行,这样的话,必须将它所在的目录添加到环境变量PATH中,否则执行时会出现以下错误:

添加环境变量有临时添加和永久添加两种方式:
(一)临时添加
输入以下命令:

export PATH=$PATH:/home/shiyanlou/gcc-3.4.6-glibc-2.3.6/bin

这样,就将该目录临时加入了PATH中,但如果关闭了终端,该目录会从PATH中丢失,下次启动终端,必须用上面的命令重新添加。

(二)永久添加
可以通过修改 /etc/profile 文件来实现:

# sudo vim /etc/profile          // 打开 profile 文件

// 在文件末尾加入下面代码,保存并退出
export PATH="$PATH:/home/shiyanlou/gcc-3.4.6-glibc-2.3.6/bin"

# source /etc/profile          // 在当前bash环境下读取并执行 profile 中的命令

这样配置的PATH是永久性的,不会随着系统的关闭而丢失。

通过以上两种方式添加环境变量后,可以用 $PATH 查看配置结果:

这样 arm-linux-gcc 便可作为shell命令使用了。交叉开发环境也就搭建成功了。

二、bootloader的配置、移植和编译

在为新的开发板开发程序时,需要配置新开发板的配置文件,为了方便,可以采用“复制->粘贴->修改”的方式。

1、获得u-boot源码

u-boot源码的下载地址为:
http://labfile.oss.aliyuncs.com/courses/811/u-boot-1.3.2.tar.bz2
这个压缩包可以用上面所说的两种方式导入Linux系统中,并用 tar 命令将之解压出来。

2、建立板级支持包

开发板的型号不同,其配置文件也不一样,在board目录下,每一块开发板都有一个对应的目录:

添加新的开发板,就需要为之建立与它名字一致的新目录,并存入它的配置文件。可以从相似的原有开发板目录复制并修改而来,以新开发板 eduk2410 和原有开发板 smdk2410 为例:

(1)创建新的目录

# mkdir eduk2410                    // 建立 eduk2410 对应的目录
# cp smdk2410/* eduk2410            // 将与 eduk2410 相似的 smkd2410 的配置文件复制入 eduk2410 的目录中

(2)修改 .c 源文件

首先,需要把 .c 源文件的名字改为新开发板的名字,命令如下:

# cd eduk2410                       // 进入 eduk2410 对应的目录
# mv smdk2410.c eduk2410.c          // 将源文件的名字修改为 eduk2410.c

接着,需要修改源文件中 eduk2410 的端口号,将gpio->GPBCON = 0x00044555改为gpio->GPBCON = 0x0004455A

(3)修改当前目录的 Makefile 文件

在编译时,要编译这个源文件,就需要将当前目录下的 Makefile 文件中的 COBJS 变量原来的值改为新的值: eduk2410.o:

(4)添加配置文件

每个开发板都有一个自己的配置文件,所以必须为新的开发板建立自己的配置文件。
首先,可以直接从原有的开发板的配置文件中修改而来,命令如下:

# cd ../../                                                     // 返回 u-boot 的顶级目录,利于下一条命令的实现
# cp include/configs/smdk2410.h include/configs/eduk2410.h   // 复制 smdk2410 的配置文件并改名为 eduk2410

然后,需要将新开发板的配置文件信息加入到 u-boot 的顶级目录的 Makefile 文件中:(可以复制其上两行或下两行的文字,粘贴后修改)

技巧&心得
  (1)用 vim 修改文件时,可以在普通命令模式下用 /+关键字 的方式定位要修改的某一行。

3、配置和编译 U-Boot

在新开发板配置文件建立完成以后,就可以进行期待已久的正式配置和编译工作了。
首先,输入以下命令进行 U-boot 的配置:

# make eduk2410_config          // 配置 eduk2410 开发板

出现下面的提示,就说明配置完成,已经成功了一半:

接下来是最后一步,编译:

# make          // 执行 U-boot 顶级目录下的 Makefile 文件

编译成功后,就会在当前目录下生成一个 U-boot.bin 文件,这就是最终的二进制可执行文件,可以植入开发板运行。

三、C语言文件的操作

Linux下C语言十分灵活,对文件的管理与操作也十分方便,只需要简单的一些函数便可做到。

1、常用的文件操作函数

fopen()                  // 打开一个文件
fclose()                 // 关闭一个文件
fgetc()                  // 从文件中读取一个字符
fputc()                  // 向文件中写入一个字符
fgets()                  // 从文件中读取一个字符串
fputs()                  // 向文件中写入一个字符串
fprintf()                // 向文件中写入格式化数据
fscanf()                 // 从文件中读取格式化数据

2、open 和 fopen

Linux系统中,文件操作函数有两中,以 open 和 fopen 为例。
open() 的格式为:int open(const char *path, int access,int mode),它的参数如下

path 要打开的文件路径和名称

access 访问模式,可选取值如下:                        
    O_RDONLY             只读打开                         
    O_WRONLY             只写打开                         
    O_RDWR               读写打开
    O_CREAT              创建一个文件并打开
    O_APPEND             追加打开文件

mode 设置权限,该参数仅在access=O_CREAT方式下使用,可选取值如下:
	S_IRUSR              本用户可读
	S_IWUSR              本用户可写
	S_IRGRP              用户组可读
	S_IROTH              其他用户可读

fopen() 的格式为:FILE *fopen(char *filename, char *mode),它的参数如下:

mode 打开模式:                                            
    r                    只读方式打开一个文本文件
    w                    只写方式打开一个文本文件
    a                    追加方式打开一个文本文件
    r+                   可读可写方式打开一个文本文件
    w+                   可读可写方式创建一个文本文件
    a+                   可读可写追加方式打开一个文本文件

open() 与 fopen() 的区别:

open fopen
低级IO 高级IO
返回一个文件描述符 返回一个文件指针
无缓冲 有缓冲
与 read, write 等配合使用 与 fread, fwrite等配合使用
fopen() 是在 open() 的基础上扩充而来的,在大多数情况下,用fopen()。

四、收获与感悟

  (1)学会了交叉开发环境的搭建,知道了用LSB标准来解决软件的兼容问题。
  (2)学会了两种添加PATH的方法,使某个文件可以像shell命令一样在任意一个目录下执行。
  (3)掌握了 U-boot 的配置和编译过程,学会建立并配置新开发板,在这过程中深刻体会了vim命令的便捷性。
  (4)通过上课和查询资料,对原来C语言比较薄弱的部分——文件操作有了较深的理解,可看懂相关的代码,并编写简单的文件操作程序。

五、学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90

六、参考资料

  • 《嵌入式应用程序设计》学习指导
posted @ 2017-05-13 18:54  舲舟聆雨  阅读(165)  评论(0编辑  收藏  举报