《嵌入式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章讲解了嵌入式系统的基本概念;第23章讲解如何构建嵌入式linux的开发环境以及常用开发工具的使用方法;第4到第8章讲解嵌入式linux C语言的语法及常用数据结构(常用数据结构未看);第9到第12章讲解了linux中的文件I/O开发、进程线程开发、网络开发(该章已看,其它未看)和驱动开发等(这几章可以分别查看相关领域书籍继续深入);第13章讲解视频监控系统的一个综合实例(未看)。 总体评价:本书适合入门,印刷错误较多。     第二章:嵌入式LinuxC语言开发工具   1.预处理举例hello.h文件的预处理,一般可以这样做(注意前两句) #ifndef _HELLO_H_ #define _HELLO_H_ …… #endif GCC的选项“-E”可以使编译器在预处理结束时就停止编译   2GCC使用库函数 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也只需-llib后面的m,即-lm,当动态库文件&静态库文件同名,则默认使用动态库,如要使用静态库,可以-l+静态库全名,如-llibm.a        GCC中代码优化选项:-On,其中n取值:02or3(不同GCC版本不同),-O主要优化:线程跳转(Thread Jump)&延迟退栈(Deferred Stack Pops)   3.GDB使用 进入GDB只需输入: gdb 要调试的可执行文件 GDB中输入:llist):查看所载入的文件。 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数据相关指令可参考相关文档。   4make工程管理器 格式: target: dependency_files                 command egmain.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=varVAR: =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)调用生效   2BootLoader 主要任务是将内核映像从硬盘上读到RAM中,类似于BIOS,主要功能有: 初始化RAM(必需) 初始化串口(可选,推举) 启动内核镜像(必需):FLASH启动以及 RAM启动 启动流程: stage1(汇编编写): 完成基本硬件初始化 为加载stage2RAM准备空间 拷贝stage2RAM 设置堆栈指针sp stage2C编写): 用汇编语言跳转到main入口函数 初始化串口、计时器等硬件设备 检测系统的内存映射,即指出4GB地址哪些是被分配用来寻址系统的RAM单元 加载内核映像&根文件映像 设置内核启动参数 注意:U-BOOT的分析参考相关文档   3.编译嵌入式内核(内核映像制作) 三个步骤: 内核配置 :修改Makefile中的ARCH为:ARCH    :=    arm                      make menuconfig (字符终端)or make xconfigXwindow下推荐)                      2.4内核的COM1对应ttyS02.6内核的COM1对应ttySAC0 建立依存关系:make dep 建立内核       make z Image(压缩的,位于arch/$ARCH/boot目录中) or make bzImage(未压缩的,位于源码树的根目录)   4.文件系统映像制作 嵌入式常用文件系统:cramfsromfsjffsyaffs 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可以为一种