本人普通本科学生,浑浑噩噩度过大学三年时间。直到临近离校实习,才发现自己学到的知识微不足道。既不满足于现状,又不愿意花费高昂学费进培训机构,只好在秋招前的这段时间补补书籍,看看网课,为改变自己的命运再努力一把。在接下来的时间里,我会把自己的学习笔记进行整理上传,加深对技术的理解,避免遗忘。
为什么要学习linux操作系统?
事实上,ARM通常都是用来做比较复杂的系统的,而且一般都是多任务系统的,当任务比较多,程序比较大的时候,只用汇编和C恐怕难以胜任,所以我们应该给ARM配一个操作系统,用来管理这些任务,那么对于ARM,我们可以作使用哪些操作系统呢?嵌入式操作系统通常有VxWorks,WinCE,uC\FreeRTOS,Linux/ucLinux等。而uC\FreeRTOS、Linux因为其免费,而且开源,深受学习者和小公司的欢迎。
uCOS操作系统内核很小,特别适合初学,而且它是占先式内核,是一个实时的操作系统,特别适合实时性要求较高的场合,其内核很小当然其功能当然也就没有linux强大,而且uCOS的图形用户界面(GUI)还是刚有雏形,没有linux的GUI好,而它的GUI是收费的。这样的话只是linux是最好了,但是linux本身不是实时的操作系统,不适合实时性高的场合,于是ucLinux产生了,ucLinux是一个实时操作系统(RTOS),因此学习ARM+ucLinux的人较多。
所以,如果只搞uCOS+ARM,那就可以不学linux了,如果想学习ARM+ucLinux,要在ARM上移植linux,那么移植后,这个装有linux的ARM处理器,当然只能运行linux环境下编译出来的应用程序(这里还有一个交叉编译的概念需要正确理解),所以理所当然要学linux。我在学时,曾对开发板跑RTOS产生兴趣,还专门询问过不少老师和学长,他们大致认为,uCOS虽然更易于学习,但最终工作开发的方向也会转向Linux开发,所以还是先学好Linux操作系统再回来看RTOS吧。通常小红帽Linux、ubuntu Linux 使用比较广泛,那么不能在Windows下开发ARM+ucLinux吗?其实倒是可以在Windows使用虚拟机软件VMware装一个linux。
嵌入式 Linux 最主要的工作是让目标板能启动 Linux 系统,启动 Linux 系统的核心工作就是启动 Linux 内核,启动 Linux 内核的核心工作就是让这个 Linux 内核能支持你这个设备,Linux 内核能支持你这个设备的前提就是 Linux 内核经过你的改进后确实能启动,你改进内核的前提就是你会 Linux 内核。
Linux文件系统是一个树形的分层组织结构。
文件系统层次结构标准FHS(Filesystem Hierarchy Standard)
FHS定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。
其主要目录包括:
/bin:二进制(binary)目录下存放二进制文件。
目录名称 | 存放文件类型 |
---|---|
/boot: | 存放系统启动时要用到的程序。 |
/dev: | 包含了所有Linux系统中使用的外部设备。 |
/etc: | 存放系统管理时要用到的各种配置文件和子目录。 |
/lib: | 存放系统动态连接共享库。 |
/home: | 普通用户的主目录。 |
/root: | 根用户的主目录。 |
Linux的命令(也包括文件名等等)对大小写是敏感的,也就是说,如果你输入的命令大小写不对的话,系统是不会做出你期望的响应的。
如果你的英文足够好,那完全可以不靠任何人就精通linux,只要你会用man。Man实际上就是察看指令用法的help,学习任何一种UNIX类的操作系统最重要的就是学会使用man这个辅助命令。man是manual(手册)的缩写字,它的说明非常的详细,但是因为它都是英文,看起来非常的头痛。建议大家需要的时候再去看man,平常吗,记得一些基本用法就可以了。
浏览目录命令:
当打开命令终端窗口,用户处于自己用户主目录的位置。
ls——显示目录下的内容
ls这个命令就相当于dos下的dir命令,这也是Linux控制台命令中最为重要几个命令之一。ls最常用的参数有三个: -a ,-l, -F。
ls -a
Linux上的文件以“.”开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示 一般文件名外,连隐藏文件也会显示出来。
ls -l
这个命令可以使用长格式显示文件内容,如果需要察看更详细的文件资料,就要用到ls -l这个指令。
ls –F(注意,是大写的F)
使用这个参数表示在文件的后面多添加表示文件类型的符号,例如*表示可执行,/表示目录,@表示连结文件,这都是因为使用了-F这个参数。但是现在基本上所有的Linux发行版本的ls都已经内建了-F参数,也就是说,不用输入这个参数,我们也能看到各种分辨符号。
pwd——显示当先位置
执行pwd指令可立刻得知您目前所在的工作目录的绝对路径名称。
cd——切换目录
这个命令是用来进出目录的,有两点我补充一下。首先,和dos不同的是Linux的目录对大小写是敏感的,如果大小写没拼对,你的cd操作是成功不了的。其次,cd如果直接输入,cd后面不加任何东西,会回到使用者自己的Home Directory。假设如果是root,那就是回到/root.这个功能同cd ~是一样的。
mkdir、rmdir——创建、删除目录
mkdir命令用来建立新的目录,rmdir用来删除已建立的目录。
cp——文件复制
具体用法是:cp –r 源文件(source) 目的文件(target)
参数r是指连同源文件中的子目录一同拷贝。熟悉dos的读者用起这个命令来会觉得更方便,毕竟比在dos下面要少敲两下键盘。
rm——文件删除
这个命令是用来删除文件的,和dos下面的rm(删除一个空目录)是有区别的,大家千万要注意。rm命令常用的参数有三个: -i,-r,-f。
比如我现在要删除一个名字为test的一个文件:rm –i test
系统会询问我们:“rm:remove ‘test’?y”,敲了回车以后,这个文件才会真的被删除。之所以要这样做,是因为linux不象dos那样有undelete的命令,或者是可以用pctool等工具将删除过的文件救回来,linux中删除过的文件是救不回来的,所以使用这个参数在删除前让你再确定一遍,是很有必要的。
rm –r 目录名:这个操作可以连同这个目录下面的子目录都删除,功能上和rmdir相似。
rm –f 文件名(目录名):这个操作可以进行强制删除。
mv——移动
这个命令的功能是移动目录或文件,引申的功能是给目录或文件重命名。它的用法同dos下面的move基本相同,这里不再多讲。当使用该命令来移动目录时,他会连同该目录下面的子目录也一同移走。如果你想给一个文件或目录重命名时可以用以下方法:mv 原文件(目录)名 新的文件(目录)名。
cat——文本输出命令
这个命令是linux中非常重要的一个命令,它的功能是显示或连结一般的ascii文本文件。cat是concatenate的简写,类似于dos下面的type命令。它的用法如下:
cat text 显示text这个文件;
cat file1 file2 依顺序显示file1,file2的内容;
cat file1 file2>file3 把file1,file2的内容结合起来,再“重定向(>)”到file3文件中。
clear——清屏
这个命令是用来清除屏幕的,它不需要任何参数,如果你觉得屏幕太紊乱,就可以使用它清除屏幕上的信息。另外一个快捷方式是ctrl+l
文件权限
文件的权限类型:读(r),写(w),执行(x),无权限(-)。
权限:创建者,同组用户,其他用户。
例如:rwxr-----:创建者拥有所有权限,同组用户可读不可写、执行,其他用户无任何权限。
VIM编辑器的使用
Vi/vim是linux系统的基础的文本编辑器
-1. 三种模式以及模式的切换命令
命令行模式:用户在编辑文件时,最初进入的该文件的编辑页面。可以移动光标查看文件,进行复制,剪切,粘贴等操作。
插入模式:进入文件编辑,按ESC可以回到命令行模式
a | 从当前光标之后的位置开始插入 |
---|---|
i | 从当前光标之前的位置开始插入 |
o | 在光标下一行插入空行 |
A | 从当前行尾开始插入 |
I | 从当前行首开始插入 |
O | 在光标上一行加入空行 |
ESC | 退出到命令行模式 |
底行模式:光标位于屏幕的底行。可以进行文件的保存,查找,替换,列出行列号等操作。
:!command | 不退出编译器,执行linux指令 |
---|
- 2.熟悉拷贝和粘贴命令
yy | 复制 |
y0 | 复制本行光标至行首的所有字符 |
y$ | 复制本行光标至行尾的所有字符 |
range y(1,10y) | 块复制(1到10行复制) |
dd | 剪切/删除 |
d0 | 剪切复制本行光标至行首的所有字符 |
d$ | 剪切复制本行光标至行尾的所有字符 |
range d(1,10y) | 块剪切(1到10行复制) |
p | 粘贴 |
u | 取消上一次操作 |
N x | 剪切光标后的N个字符 |
-3. 熟悉保存和退出命令
:q | 退出没有修改的文件 |
:q! | 强制退出,不保存 |
:w | 保存文件 |
:x == :wq | 保存文件并退出 |
:w file | 另存为file名称 |
:r file | 读入file指定的文件内容插入文本 |
- 4.光标命令
:1G | 回到第一行 |
:G | 回到最后一行 |
:数字N | 插入到第N行 |
:set nu/nonu | 打开、关闭行号 |
- 5.查找命令
/string 查找文本中相应的字符串
/string | 查找文本中相应的字符串 |
---|
- 6.替换命令
:s /oldestr /newstr | 替换对应的第一个字符串 |
:s /oldestr /newstr/g | 替换当前行所有对应字符串 |
:.,$ s /oldestr /newstr/g | 替换当前行到最后行对应字符串 |
:1,$ s /oldestr /newstr/g | 替换全文对应字符串 |
:% s /oldestr /newstr/g | 替换全文对应字符串 |
程序的编译和调试
-
GCC编译器的使用
可以支持包括(.c:c语言源代码 .h:头文件 .i:预处理过的源代码 .s:汇编语言源代码文件 .o:编译后的目标文件)以上后缀文件
编译指令:gcc 源文件名 -o 执行文件名
./执行文件名 查看输出结果
-o 输出可执行文件
-c 只输出目标代码,不输出可执行文件
-g 用于调试 -
程序调试
利用_ FILE _
_ LINE
_ FUNCTION 来进行简单的调试
比如在main函数内加入printf(”%s,%s,%d\n”, _ FILE _ ,_ FUNCTION __ ,__ LINE __);