《嵌入式Linux C语言应用程序设计》读书笔记
2019-07-12 23:13发布
生成海报
Author :Jeffrey
My Email:zhuch@mails.guet.edu.cn QQ:64801518
My Blog:http://blog.csdn.net/gueter/
《嵌入式Linux C语言应用程序设计》 人民邮电出版社 华清远见编
主要内容:本书共13章,第1章讲解了嵌入式系统的基本概念;第2&3章讲解如何构建嵌入式linux的开发环境以及常用开发工具的使用方法;第4到第8章讲解嵌入式linux C语言的语法及常用数据结构(常用数据结构未看);第9到第12章讲解了linux中的文件I/O开发、进程线程开发、网络开发(该章已看,其它未看)和驱动开发等(这几章可以分别查看相关领域书籍继续深入);第13章讲解视频监控系统的一个综合实例(未看)。
总体评价:本书适合入门,印刷错误较多。
第二章:嵌入式LinuxC语言开发工具
1.预处理举例:hello.h文件的预处理,一般可以这样做(注意前两句):
#ifndef _HELLO_H_
#define _HELLO_H_
……
#endif
GCC的选项“-E”可以使编译器在预处理结束时就停止编译
2.GCC使用库函数
2.1共享库&动态库的后缀名由.so&版本号组成,如数学共享库:libm.so.5,标识字符:m,版本号:5
静态库的后缀名为.a,如静态数学库:libm.a
2.2 GCC中使用-I dir 选项可以指定头文件的位置(dir)
GCC中使用-L dir 选项可以指定库文件的位置(dir)
说明:源程序#include <> 为标准路径(linux默认为/usr/include)下搜索改成””后可省略-I选项
GCC中要想使用库文件,只需加-l(小写L)+lib后面的字母,如使用libm.so只需-lm,如使用libm.a也只需-l+lib后面的m,即-lm,当动态库文件&静态库文件同名,则默认使用动态库,如要使用静态库,可以-l+静态库全名,如-llibm.a。
GCC中代码优化选项:-On,其中n取值:0~2or3(不同GCC版本不同),-O主要优化:线程跳转(Thread Jump)&延迟退栈(Deferred Stack Pops)。
3.GDB使用
进入GDB只需输入: gdb 要调试的可执行文件
GDB中输入:l(list):查看所载入的文件。
GDB中输入:b n 在第n行设置一个断点。输入:info b可以查看断点情况。
GDB中输入: r 即可运行程序
GDB中输入:p 变量名 即可查看变量值
注意:GDB在显示变量值时会在对应值前面加上“$N”标记,即引用标记,所有若再次引用该变量,可以直接写作“$N”。
GDB中输入:watch 变量名 可以用来观察变量的变化情况。
GDB中输入:n 即单步执行
GDB中输入:c 即继续执行(碰到断点后)
GDB中输入:q 即退出GDB
GDB中输入:call 函数名 即可在当前位置执行函数
GDB常见断点设置与删除指令,GDB数据相关指令可参考相关文档。
4.make工程管理器
格式: target: dependency_files
command
eg:main.o :main.c defs.h
gcc –c main.c –o main.o
注意:MakeFile中的每一个command前必须由Tab符,否则会出错。
MakeFile中的命令就是shell脚步语言,下面介绍一下常见的预定义变量
命令格式 含义
AR 库文件维护程序的名称,默认值为ar
AS 汇编程序的名称,默认值为as
CC C编译器的名称,默认值为cc
CPP C预编译器的名称,默认值为$(CC) –E
CXX C++编译器的名称,默认值为g++
FC FORTRAN编译器的名称,默认值为f77
RM 文件删除程序的名称,默认值为rm –f
ARFLAGS 库文件维护程序的选项,无默认值
ASFLAGS 汇编程序的选项,无默认值
CFLAGS C编译器的选项,无默认值
CPPFLAGS C预编译器的选项,无默认值
CXXFLAGS C++编译器的选项,无默认值
FFLAGS FORTRAN编译器的选项,无默认值
下面是常见的自动变量:
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,空格分开,可重复,先后为序
$< 第一个依赖文件的名称
$? 所有时间必目标文件晚的依赖文件,以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$% 如果目标是归档成员,则表示目标的归档成员名单
举例:
OBJS = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
CC = gcc
CFLAGS = -Wall –O –g #-Wall 即打开所有类型语法警告,建议养成使用该选型的习惯
edit : $(objects) #变量定义格式:VAR=var;VAR: =var(扩展方式)使用格式为: $(VAR)
$(CC) $^ -o $@
main.o : main.c defs.h
$(CC) $(CFLAGS) –c $< -o $@
……# 变量定义为OBJS,使用时为什么是$(objects),而非$(OBJS)????
MakeFile规则:
make 的隐式规则(模式规则参考相关文献)指出:所有.o文件都可自动由.c文件使用命令”$(CC) $(CPPFLAGS) $(CFLAGS) –c file.c –o file.o”生成。因此上例可以改写为:
OBJS = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
CC = gcc
CFLAGS = -Wall –O –g
edit : $(objects)
$(CC) $^ -o $@
main.o : main.c defs.h
……
注意:在隐式规则中只能查找到相同文件名的不同后缀名文件,如“kang.o”文件必须由kang.c生成
MakeFile中常见的隐式规则目录可以参考相关文献,可使用下面的命令行选项。P59
make的命令行选项
命令格式 含义
-C dir 读入指定目录(dir)下的MakeFile
-f file 读入当前目录file文件作为MakeFile
-i 忽略所有的命令执行错误
-I dir 指定被包含MakeFile所在目录
-n 打印要执行的命令
-p 显示make变量数据库&隐含规则
-s 在执行命令时不显示命令
-w 执行过程中改变目录,则打印当前目录
第三章 构建嵌入式Linux 系统
1.环境变量
环境变量可以在以下3处之一进行添加
/etc/profile:是系统启动过程中执行的一个脚本,对所有用户都有效
~/.bash_profile:是用户的脚本,用户登陆时生效
~/.bashrc:也是用户的脚本,在前一脚本中(.bash_profile)调用生效
2.BootLoader
主要任务是将内核映像从硬盘上读到RAM中,类似于BIOS,主要功能有:
初始化RAM(必需)
初始化串口(可选,推举)
启动内核镜像(必需):FLASH启动以及 RAM启动
启动流程:
stage1(汇编编写):
完成基本硬件初始化
为加载stage2到RAM准备空间
拷贝stage2到RAM中
设置堆栈指针sp
stage2(C编写):
用汇编语言跳转到main入口函数
初始化串口、计时器等硬件设备
检测系统的内存映射,即指出4GB地址哪些是被分配用来寻址系统的RAM单元
加载内核映像&根文件映像
设置内核启动参数
注意:U-BOOT的分析参考相关文档
3.编译嵌入式内核(内核映像制作)
三个步骤:
内核配置 :修改Makefile中的ARCH为:ARCH := arm
再make menuconfig (字符终端)or make xconfig(Xwindow下推荐)
2.4内核的COM1对应ttyS0,2.6内核的COM1对应ttySAC0
建立依存关系:make dep
建立内核 :make z Image(压缩的,位于arch/$(ARCH)/boot目录中)
or make bzImage(未压缩的,位于源码树的根目录)
4.文件系统映像制作
嵌入式常用文件系统:cramfs、romfs、jffs、yaffs等
cramfs文件系统是一种经压缩的、极为简单的只读文件系统,制作该文件系统的工具为:mkcramfs,若已经有文件系统(在目录/root/workplace/fs/guo里),则制作文件系统映像的命令为:mkcramfs dir name,例如:./mkcramfs guo FS2410XP_camare_demo4.cramfs
可以在pc机上使用mount命令验证,操作如下:
mount –o loop FS2410XP_camare_demo4.cramfs /mnt
第四章 嵌入式Linux C语言基础
1.基本数据类型
若想查看适合当前机器的各数据类型的取值范围,可查看文件limits.h(位于编译器相关目录下)
字符常量是用单括号括起来的单个字符,如’a’、’+’…
typedef可以为一种
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮