目录

嵌入式Linux应用开发

嵌入式Linux应用开发

嵌入式Linux应用开发

ubuntu的目录

https://i-blog.csdnimg.cn/blog_migrate/9bc6256c6ce713a1b909763c5a8f382e.png

怎么设置PATH?

https://i-blog.csdnimg.cn/blog_migrate/332fa922a533fbe5a334f751fc46ff50.png

Linux的命令提示符

https://i-blog.csdnimg.cn/blog_migrate/59702269ef678f857a378589f03d7dc0.png

cd ~ 表示用户 家目录

https://i-blog.csdnimg.cn/blog_migrate/e15e800c09a7feb62ce4ffe6d54e6a33.png

Linux的相对路径

https://i-blog.csdnimg.cn/blog_migrate/51d15c9b07886b6dd6a9148ee337fd0b.png

Linux的man命令

https://i-blog.csdnimg.cn/blog_migrate/45b87edf821c4ef9ce38c1864372f692.png

Linux的vi编辑器的使用

https://i-blog.csdnimg.cn/blog_migrate/da25467205c24e92ad2a70eb8d849070.png

https://i-blog.csdnimg.cn/blog_migrate/17c016880664703c03dbd66e401bb018.png

https://i-blog.csdnimg.cn/blog_migrate/c745f92373a6ce6c2119c67fe8a42382.png

Linux的which和whereis命令

https://i-blog.csdnimg.cn/blog_migrate/0a5fb515117ec1eb9b2ea9736436c9c7.png

Linux的压缩命令

https://i-blog.csdnimg.cn/blog_migrate/7eb0000c9499677d85b64ec77ba04aaa.png

https://i-blog.csdnimg.cn/blog_migrate/320cb652c91379819fede00fdc9ff33b.png

https://i-blog.csdnimg.cn/blog_migrate/2b0feb92c7a40ebe9bc99a330dd399d4.png

https://i-blog.csdnimg.cn/blog_migrate/22c8545fca417320557d57dd79b0926d.png

https://i-blog.csdnimg.cn/blog_migrate/741ddade34a7274a9720001b9a930d07.png

https://i-blog.csdnimg.cn/blog_migrate/f2c7643e8fc1dfb62ed437cbd078862b.png

Makefile

Makefile的核心——规则:

目标 : 依赖1 依赖2 …

[TAB] 命令

当“目标文件”不存在

某个依赖文件比目标文件“新”,

则:执行“命令”

语法:

a. 通配符:%.o

$@ 表示目标

$< 表示第1个依赖文件

$^ 表示所有依赖文件

b. 假想目标: .PHONY

//makefile例子
test:a.o b.o c.o
	gcc -o test $^

%.o:%.c
	gcc -c -o $@ $<

clean:
	rm *.o test

.PHONY:clean

c. 即时变量、延时变量,export

简单变量(即时变量):

A := xxx   #A的值即刻确定,在定义时即确定
B = xxx    #B的值使用到时才确定

:=         #即时变量
=          #延时变量
?=         #延时变量,如果是第一次定义才起效,如果在前面该变量已定义则忽略这句
+=         #附加,它是即时变量还是延时变量取决于前面的定义

//makefile例子
A := $(C)
B = $(C)
C = abc

all:
	@echo A = $(A)
	@echo B = $(B)

C += 123

Makefile函数

$(foreach var,list,text)       遍历
$(filter pattern...,text)      在text中取出符合pattern格式的值
$(filter-out pattern...,text)  在text中取出不符合pattern格式的值
$(wildcard pattern)            pattern定义了文件名的格式,wildcard取出其中存在的文件
$(patsubst pattern,replacement,$(var))    从列表中取出每一个值,如果符合pattern,则替换成replacement

改进:支持头文件依赖

gcc -M c.c  //打印出依赖
gcc -M -MF c.d c.c   //把依赖写入文件c.d
gcc -c -o c.o c.c -MD -MF c.d   //编译c.o,把依赖写进文件c.d

https://i-blog.csdnimg.cn/blog_migrate/e3a15a5b49edaa65058e99e5740fb64d.png

添加CFLAGS

https://i-blog.csdnimg.cn/blog_migrate/037198749e8c439db03871a9f659c99e.png

// Makefile说明
本程序的Makefile分为3类
1.顶层目录的Makefile
2.顶层目录的Makefile.build
3.各级子目录的Makefile
各级子目录的Makefile
它最简单形式如下
EXTRA CFLAGS :=
CFLAGS_file.o :=

obj-y += file.o
obj-y += subdir/

obj-y+=file.o     表示把当前目录下的file.c编进程序里
"obj-y+= subdir/”   表示要进入subdir这个子目录下去子找文件来编进程序里,是哪些文件由subdir目录下的Makefile决定。
"EXTRA_CFLAGS",     它给当前目录下的所有文件(不含其下的子目录)设置额外的编译选项,可以不设置
"CFLAGS_xxx.o",     它给当前目录下的xxx.c设置它自己的编译选项,可以不设置

注意:
1."subdir/"中的斜杠"/"不可省略*
2.顶层Makefile中的cFLAGs在编译任意一个.c文件时都会使用
3.CFLAGS EXTRA_CFLAGS CFLAGS_xxx.o三者组成xxx.c的编译选项

二、顶层目录的Makefile:
	它除了定义obj-y来指定根目录下要编进程序去的文件、子目录外,
	主要是定义工具链前缀CROSS_COMPILE,
	定义编译参数CFLAGS,
	定义链接参数LDFLAGS,
	这些参数就是文件中用export导出的各变量。
	
三、顶层目录的Makefile.build:
	这是最复杂的部分,它的功能就是把某个目录及它的所有子目录中、需要编进程序去的文件都编译出来,打包为built-in.o
	详细的讲解请看视频。
	
四、怎么使用这套Makefile:
1.把顶层Makefile,Makefile.build放入程序的顶层目录
	在各自子目录创建一个空白的Makefile
	
2.确定编译哪些源文件
	修改顶层目录和各自子目录Makefile的obj-y:
	obj-y += xxx.o
	obj-y += yyy/
	这表示要编译当前目录下的xxx.c,要编译当前目录下的yyy子目录
	
3.确定编译选项、链接选项
	修改顶层目录Makefile的CFLAGS,这是编译所有.c文件时都要用的编译选项;
	修改顶层目录Makefile的LDFLAGS,这是链接最后的应用程序时的链接选项;
修改各自字目录下的Makefile:
"EXTRA_CFLAGS",   它给当前目录下的所有文件(不含其下的子目录)设置额外的编译选项,可以不设置
"CFLAGS_xxx.o",   它给当前目录下的xxx.c设置它自己的编译选项,可以不设置

4.使用哪个编译器?
	修改顶层目录Makefile的CROSS_COMPILE,用来指定工具链的前缀(比如arm-linux-)
	
5.确定应用程序的名字:
	修改顶层目录Makefile的TARGET,这是用来指定编译出来的程序的名字
	
6.执行"make"来编译,执行"make clean"来清除,执行"make distclean"来彻底清除

文件I/O 读写文件

文件从哪里来?

  1. 磁盘、flash、SD卡、U盘

    对于硬件上真实的文件需要挂载才能访问到,要先mount

  2. Linux提供的虚拟文件系统,也要先mount

  3. 特殊文件 /dev/xxx 设备节点

Framebuffer应用编程

https://i-blog.csdnimg.cn/blog_migrate/1b3bde9db73d09b246bdda0614b566c8.png

bpp:bits per pixel 每个像素用多少位来表示它的颜色

https://i-blog.csdnimg.cn/blog_migrate/040ce8748c6f9cf5a140a1956e0c3c64.png

首地址+offset,就可以确定这个地址在Framebuffer的哪里

https://i-blog.csdnimg.cn/blog_migrate/c386b3feabb87ebb6c984564ca55b027.png

ASCII字符点阵显示

https://i-blog.csdnimg.cn/blog_migrate/cf93b3d7bdae566fd0e98c7a492e129a.png

https://i-blog.csdnimg.cn/blog_migrate/4d780245d30c1458b19e8606191905a6.png

汉字区位码

HZK16里每个汉字使用32字节来描述,如下图所示:

https://i-blog.csdnimg.cn/blog_migrate/29b901480c6864e972f2fba0842a0218.png

跟ASCII字库一样,每个字节中每一位用来表示一个像素,位值等于1时表示对应像素被点亮,位值等于0时表示示对应像素被熄灭。

HZK16中是以GB2312编码值来查找点阵的,以“中”字为例,它的编码值是“0xd6-0xd0”,其中的0xd6表示“区码”,表示在哪一个区:第“0xd6–0xa1”区;其中的0xd0表示“位码”,表示它是这个区里的哪一个字符:第“0xd0-0xa1”个。每一个区有94汉字。区位码从0xa1而不是从0开始,是为了兼容ASCII码。

所以,我们要显示的“中”字,它的GB2312编码是d6d0,它是HZK16里第(0xd6-0xal)*94+(0xd0-0xa1)个字符。

https://i-blog.csdnimg.cn/blog_migrate/a6b0987dd99c053c917ca57da2570b4b.png

程序运行的一些基础知识

  1. 编译程序时去哪找头文件?

    系统目录:就是交叉编译工具链里的某个include目录;

    也可以自己指定:编译时用“-I dir”选项指定。

  2. 链接时去哪找库文件?

    系统目录:就是交叉编译工具链里的某个lib目录;

    也可以自己指定:链接时用“-L dir”选项指定。

  3. 运行时去哪找库文件?

    系统目录:就是板子上的/lib、/usr/lib目录;

    也可以自己指定:运行程序用环境变量LD_LIBRARY_PATH指定。

  4. 运行时不需要头文件,所以头文件不用放到板子上

常见错误的解决方法

1.头文件问题

编译时找不到头文件。在程序中这样包含头文件:#include-<xxx.h>对于尖括号里的头文件,去哪里找它?

系统目录:就是交叉编译工具链里的某个include目录;

也可以自己指定:编译时用“.-I dir”选项指定。

怎么确定“系统目录”?

执行下面命令确定目录:

echo ‘main() {}’ | arm-linux-gcc -E -v -

它会列出头文件目录、库目录(LIBRARY_PATH)。

你需要在头文件目录中确定有没有这个文件,或是自己指定头文件目录。

2.库文件问题

链接程序时如果有这样的提示:undefined-refference-to “xxx”,它表示xxx函数未定义。

那么解决方法有2:

① 去写出这个函数

② 或是使用库函数,那需要在链接时指定库

怎么指定库?想链接libabc.so,那链接时加上:-l abc。

库在哪里?

① 系统目录:就是交叉编译工具链里的某个lib目录

② 也可以自己指定:链接时用 “ -L dir ” 选项指定

怎么确定 “系统目录” ?执行下面命令确定目录:

echo ‘main() {}’ | arm-linux-gcc -E -v -

它会列出头文件目录、库目录(LIBRARY_PATH),你编译出库文件时,可以把它放入系统库目录。

  1. 运行问题

运行程序时找不到库:

error while loading shared libraries: libxxx.so:
cannot open shared object file: No such file or directorye

找不到库,库在哪?

① 系统目录:就是板子上的/lib、/usr/lib目录

② 也可以自己指定:

运行程序用环境变量LD_LIBRARY_PATH指定,执行以下的命令:

export LD_LIBRARY_PATH=/xxx_dir ;  ./test
或
LD_LIBRARY_PATH=/xxx_dir ./test

https://i-blog.csdnimg.cn/blog_migrate/724310bafa8b58b8cf1e0992ca0cc9bc.png

输入系统框架

https://i-blog.csdnimg.cn/blog_migrate/d876920f079d82f03bd1fc70d7ab1811.png