配合《嵌入式Linux应用开发完全手册V5.1_IMX6ULL_Pro开发板》
访问根/
目录下,Filesystem Root
目录中的文件的时候, 其实是在访问/dev/sda1
,即磁盘的第一个分区,因为这个分区挂载在那个目录下面,当给这个目录挂载新的磁盘分区的时候,这个目录下的old文件不可见,因为old文件存放在之前那个分区sda1中。
其实和windows的添加环境变量类似,当用户在桌面添加一个hello.c的文件的时候,直接在终端执行,shell是找不到的,shell只会去设置好的路径中寻找有没有这个可执行文件,因此home/book/Desktop这个路径并不会被搜索到,因此需要添加这个book路径
cd /home/book
第一个/代表根目录,如果要在当前目录下查找,不要加第一个/
(上图中,普通用户无法修改hello文件的用户和所属的用户组)
注:root身份是拥有至高无上的权利的,不管有没有设置权限,root身份的用户都可以进行各种操作。所以如果不需要使用root至高无上的权利时,最好不要以root的身份去进行操作,万一输错代码把系统文件删了你就凉凉了。(不过你可以设置一个快照来恢复原来的系统)
NAT网卡
(Network Address Translation)
Ubuntu访问外网的时候,通过NAT网卡把请求发给windows虚拟网卡(可以在windows网络连接中查看是否有这个虚拟网卡),windows的虚拟网卡去访问外网,外网先发给windows,再由windows转发给ubuntu。(windows和ubuntu可以互ping)
git clone下载时候一直refused,连接这个ip端口一直失败,在关闭代理后重启ubuntu后可以正常clone下载。
ubuntu中解决Failed to connect to 127.0.0.1 port xxxxx: Connection refused_为什么乌班图进http://127.0.0.1进不去_Deep In 的博客-CSDN博客
那么为什么取消代理就可以下载了呢?
什么是 http 代理,为什么需要 http 代理 - 知乎 (zhihu.com)
USB桥接网卡
既给windows使用,也给ubuntu使用,使用桥接网卡时,Ubuntu就是使用一个真实的网卡:开发板的网线也连接 到这个真实的网卡上,这样Ubuntu、开发板就可以用过这个网卡互 .
windows和Ubuntu都可以ping这个真实的网卡
repo脚本工具
Repo是谷歌用Python脚本写的调用git的一个脚本,可以实现管理多个git库。repo呢,其实说来,就是很多个git clone 的集成,如果有一个工程,有一百个git,你下载下来,按逻辑是敲一百次git clone xxxx,下载下来。但是使用repo呢,只需要敲一次,喝喝茶,等待下载完成就可以了。
sdk文件下载下来后复制到windows中,用sourceinsight阅读,sourceinsight要add all,添加所有的文件,包含top level的文件和所有的sub子文件;最后同步所有的文件,所谓同步文件,就是解析源码,生成函数生成变量的数据库,以后就可以点击某个函数快速跳转到定义的地方。
使用这个协议(Net FileSystem),通过网络去访问别的电脑,比如ubuntu系统的某个目录。
/etc/exports
, 其中指定了有哪些目录的开放权限可供访问的在串口开发板上执行下面命令
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
注释:mount命令,-t(type), -o(option) ,挂载ubuntu的主机的/home/book/nfs_rootfs目录,挂载到开发板的mnt目录。此后ubuntu主机的的这个目录中删改文件,可以在Linux开发板的 /mnt目录中同步删改, 反之亦然,非常方便。
当然也可以用Filezilla软件来传输文件,但是使用NFS依旧是主流的方式
arm工具链安装在ubuntu里面,不同的开发板需要不同的工具链来生成执行文件,在ubuntu里面先用arm工具链生成执行文件,再通过nfs协议同步挂载到 Linux开发板的 nfs目录里执行
/*****************************Ubuntu***********************************/
book@100ask:~/nfs_rootfs$ arm-buildroot-linux-gnueabihf-gcc -o hello hello.c
book@100ask:~/nfs_rootfs$ ls
1.txt 2.txt hello hello.c
/****************************Linux开发板*******************************/
[root@100ask:/mnt]# ./hello
Hello, world!
驱动程序中的文件来自于内核,依赖于内核,必须有内核的源码且内核必须配置编译完成。
比如驱动程序中这样包含头文件:#include
,其中的 asm 是
一个链接文件,指向 asm-arm 或 asm-mips,这需要先配置、编译内核才会生成
asm 这个链接文件,
为何要编译查看完全手册的,第三篇,5.1
步骤
KERN_DIR = /home/book/100ask_roc-rk3399-pc/linux-4.4
insmod hello_drv.ko
安装相应的驱动模块
GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。Gcc不仅功能强大,而且可以编译如C、C++、Object C、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
不错的GCC入门网站GCC编译器30分钟入门教程 (biancheng.net)
完整GCC_v7.5.0 在线文档 gcc.pdf (gnu.org)
gcc -o test main.c sub.c
可以一起编译并且链接为一个test应用程序,但是缺点就是改动一个.c文件就需要全部重新编译,浪费时间,所以文件数量很多的时候可以分开编译,最后统一链接参考文档:
- 百度搜"anu make 于凤昌"
- 官方文档: http://www.gnu.org/software/make/manual/
- 如果想深入, 可以学习韦东山的第3期视频项目1,第1课第4节 数码相框_编写通用的Makefile_P
003 Makefile实例改进: 支持头文件依赖a;添加CFLAGS;编写裸板Makefile
4.自动生成头文件.h
依赖,可以参考这篇文章 Linux Makefile 生成 *.d 依赖文件以及 gcc -M -MF -MP 等相关选项说明_
核心规则
Makefile经常用到的指令
功能 | 指令 | 扩展 |
---|---|---|
表示所有依赖文件 | $^ | |
表示第1个依赖文件 | $< | |
表示一个规则中的目标 | $@ | |
变量通配符 | % | |
假象文件,不会额外判断是否存在某文件 | .PHONY: | |
在make执行时打印出自己预设的内容 | (@)echo | echo的使用 |
注释命令 | # | |
延时变量1 | immediate = deferred | |
延时变量2,且必须是第一次被定义 | immediate ?= deferred | |
即时变量, | immediate := immediate | |
附加,即时or延时取决于前面的定义 | immediate += immediate | |
显示makefile文件执行的进程 | echo | |
for each var in list, change it to text | $(foreach var,list,text) | foreach使用 |
在text中取出符合patten格式的值 | $(filter pattern…,text) | |
在text中取出不符合patten格式的值 | $(filter-out pattern…,text) | |
以 pattern 这个格式,去寻找存在的文件,返回存在文件的名字。 | $(wildcard pattern) | |
patsubst 函数是从text里面取出每一个值,如果这个符合 pattern 格式,把它替换成 replacement 格式 | $(patsubst pattern,replacement,text) | |
在LINUX系统中,一切都是文件
特殊文件
/dev/xxx
这些文件称为设备节点,我们open, read, write这些节点的时候操作的是硬件,通过驱动程序去访问到硬件ls /dev/ -l
,查看dev下的所有文件编码格式 | 内存 | 细分具体编码 | 存在的问题 |
---|---|---|---|
ASCII | 1字节,实际只有7位 | 能表达的内容太少 | |
ANSI | 对于 ASCII 字符仍使用一个字节来表示(BIT7 是 0),对于非ASCII 字符一般使用 2 个字节来表示,非 ASCII 字符的数值 BIT7 都是 1 | GB2312,BIG5 | 会出现同一个数值对应不同字符 |
UNICODE | 2~3字节 | UTF-16 LE/BE,UTF8 | |
UTF-16 LE/BE | 小字节序和大字节序都是2字节 | 表示的字符数量有限、对于 ASCII 字符有空间浪费、如果文件中有某个字节丢失,这会使得后面所有字符都因为错位而无法显示 | |
UTF-8 | 非 ASCII 字符,每一个字节的高位都自带长度信息 | 完美 | |
交叉编译详解_ Crifan Li
注:需上科学
第一步
echo 'main(){}'| arm-buildroot-linux-gnueabihf-gcc -E -v -
, 所以最好去找一个包含
的目录libc.so
的第二步
./configure--host=arm-buildroot-linux-gnueabihf--prefix=$PWD/tmp
^e473ff
第三步
cp -rf */......
cp -drf */......
全部拷贝,包括也会拷贝文件的链接形式,从而避免可能造成的内存浪费单个字体
对于ANSI-GB2312编码的c文件,编译时不指定 -finput-charset,就会使用默认的UNICODE-utf-8来解析c文件,并试图转换为wchar_t
因此,在源代码中以GB2312还是UTF8来表示都没有关系,当生成可执行程序时,在wchar_t类型的字符串里面保存的一定是UNICODE的值
功能:帮助数据传输不稳定的触摸屏过滤掉跳动的输出
交叉编译tslib【基于IMX6ULL开发板】
./configure --host=arm-linux-gnueabihf --prefix=/
单板上编译测试tslib中碰到的问题
cp ./ts /lib -rf
,把ts复制到/lib目录下