1.Linux中概念
BSP指的是板级支持包 ,是构建嵌入式操作系统所需的引导程序、内核、根文件系统、工具链。每一个嵌入式开发板所需要的BSP都可能是不同的,且一般BSP都较大。
FHS指的是文件层次标准 ,指定了Linux系统所必须的目录结构和文件存放位置。具体如下图:

shell命令中**-h参数** 是将文件的大小按K/M/G的可读形式进行输出显示 ,-R参数 是递归概念 也就是对目录中的所有内容 进行命令操作。cp -rfd 命令是用于复制目录下的所用内容包括多层次目录下的内容 ,r 递归概念指全部 、f强制的概念 、d 表示复制时若遇到链接文件则是同样将链接进行复制而不是将链接指向的整个文件复制 过来。rm -rf强制删除文件和目录。
当使用ls -l显示出文件信息后,其中文件前的第一个10位的信息就是文件的属性 。其中第一个位是指的文件的类型 ,d表示是目录 ,-表示是文件 ,l表示是链接 ,b表示是设备文件里可供存储的接口设备 ,c表示设备文件里的串行设备 如鼠标、键盘等。chown 命令是更改文件的所有者 ,chgrp 命令是更改文件的所属用户组 ,常用于将文件复制到新的用户组或者新的用户时进行对文件所有者和文件所属用户组进行修改,chmod 命令是修改文件的权限 ,在chmod命令后可以使用数字 进行权限的修改也可以使用字符 的形式对文件权限进行修改,u指的是文件所有者 、g指的是文件所属用户组 、o指的是其他用户 、a可以表示所有用户 ,然后在字符后使用**+-** 来对权限进行增加和删除。
2.MobaXterm和Filezilla软件使用
在MobaXterm软件 中可以实现远程登录ubuntu进行使用,首先我们要在虚拟机中的ubuntu下打开终端输入ifconfig命令得到ubuntu的ip如下图所示:

在图中可以看到我们得到了两个ip其中第一个是NAT模式 下的ip,第二个是桥接模式 下的ip。NAT模式就是指虚拟机在依托于本机的ip下再自己新建一个属于自己的ip ,桥接模式就是虚拟机和本机获取到一个同网段下的ip ,当使用NAT模式进行上网时对外显示的ip是主机的ip ,使用桥接模式进行上网时对外显示的是虚拟机自己的ip 。当虚拟机有两个ip时就需要在本机window系统下通过ping命令来看能ping通哪个ip,使用能ping通的ip来继续MobaXterm的远程登录Ubuntu。有了ip之后打开MobaXterm软件点击Session图标再点击弹窗中的SSH进入如下图所示界面:

将对应信息填写完毕后点击OK即可登录成功啦。然后是filezilla软件 ,该软件可以实现window和ubuntu系统中的文件互传,该软件使用简单运行软件后会出现如下界面:

按照要求填写相应信息后点击快速连接即可。
在Ubuntu系统中使用gcc进行文件编译 时,编译出的文件只能在pc机上运行 而不能在开发板上运行,要编译出能在开发板上运行 的程序则需要使用到交叉编译工具 ,使用交叉编译工具进行文件编译后使用file命令 来查看文件信息可见其支持ARM等系统也就可以在开发板上运行了,如下:
3.线程
线程是轻量级的进程 ,在Linux系统下线程的本质就是进程 。线程和进程的区别:一个进程占用一个地址空间多个线程共享一个地址空间、进程是资源分配的最小单位线程是操作系统调度执行的最小单位,线程的上下文切换比进程快很多。
pthread_create 函数作用是创建一个线程 ,第一个参数 是一个地址该函数会将创建好的线程号保存在该地址的空间中 ,第二个参数 是线程的属性 一般保持默认传入NULL ,第三个参数 是一个函数指针 表示线程创建后要执行的任务函数 ,第四个参数 是任务函数所需要传入的参数。
pthread_self 函数作用是返回该线程的id号 ,没有参数。
pthread_exit 函数作用退出线程 并与线程回收函数共同将线程返回值返回 ,在主线程中使用可以使主线程退出后不释放地址空间子线程可以继续运行直到结束 ,参数 是存储线程需要返回数据的空间地址 若不需要进行数据的返回则写入NULL即可。
pthread_join 函数的作用是主线程用来回收子线程的的资源 和与线程退出函数共同使用来进行子线程返回值的返回 ,join函数会使主线程阻塞式的等待 子线程的结束结束后对子线程资源回收,第一个参数 是需要回收子线程资源的线程号 ,一个回收函数只能回收一个子线程 资源要想回收多个子线程资源则需要循环 对回收函数进行调用,第二个参数 是二级指针 即一级指针的地址,传入一个一级指针的地址对一级指针进行初始化写入线程退出函数返回的需要返回值的空间地址 。一般可以先定义void*来进行地址的接收 ,但是接收后不能直接对void*类型的指针进行使用 需要将其强转为对应类型的指针才能使用。
pthread_detach 函数的作用是分离主线程和子线程 ,子线程分离后子线程资源不由主线程来进行回收而是由系统内核进行资源回收 解决了前面说到主线程使用线程回收函数来回收子线程会被阻塞的问题 ,参数 是需要分离的子线程线程号。
pthread_cancel 函数的作用是取消线程 ,但是注意使用该函数后线程并不会立马被杀死 而是要等到线程执行到系统调用函数时线程才会被杀死 。参数 时要取消线程的线程号。
pthread_equal 函数的作用是用来比较两个线程号是否相等 ,参数 是两个需要比较的线程号 即由pthread_t定义出的变量,两个线程号相等返回非0值不相等返回0值。
线程同步的概念 :线程同步并不是指线程要同时对共享资源进行访问 ,而是线程有顺序的对共享资源进行访问同时间中只允许一个线程对共享资源进行访问 。线程同步保证了对共享资源访问的正确性和共享资源的安全性。
4.互斥锁
互斥锁 是用于实现线程同步的基本工具 ,确保多个资源不会同时访问共享资源。互斥锁通过pthread_mutex_t来定义 ,其中pthread_mutex_t类型中就记录了互斥锁的状态 即开锁还是解锁及获互斥锁被哪个线程上锁。
pthread_mutex_init 函数的作用是初始化互斥锁 ,第一个参数 是互斥锁地址 ,第二个参数 是互斥锁的属性 一般使用默认属性传入NULL参数即可。
pthread_mutex_destroy 函数的作用是销毁互斥锁 ,参数 是需要销毁的互斥锁的地址。
pthread_mutex_lock 函数的作用是对互斥锁上锁(申请互斥锁) ,若该线程没有申请到互斥锁上锁的权限 即互斥锁被别的线程锁上了,该线程就会阻塞式的等待 直到另一个线程解锁了互斥锁,该线程才可能抢到互斥锁权限往下执行,参数 是互斥锁的地址。
pthread_mutex_trylock 函数的作用是尝试对互斥锁上锁 ,若该线程没有申请到互斥锁的上锁权限则该线程就会继续去执行别的程序 ,执行完后再来尝试对互斥锁进行上锁而不会阻塞式的等待 。参数 是互斥锁的地址。
pthread_mutex_unlock 函数的作用是解锁互斥锁 ,解锁互斥锁后其他线程就可以来抢占互斥锁的上锁权限了。参数 是互斥锁的地址。
死锁 的概念 :死锁是指当程序中有锁时,所有的线程都被阻塞到一把锁上导致程序不能往下执行 从而导致死锁。死锁问题的产生 :上锁后忘记解锁 、重复加锁 、当有多个共享资源需要加多把锁时随意加锁 。死锁的解决 :上锁后对共享资源访问完了之后一定要解锁或者使用trylock进行尝试上锁 、避免重复加锁 、对多个共享资源的访问线程间可以按照一定顺序来访问多个共享资源 或者在对其他锁进行上锁前要先将该线程的其他锁解锁 、在项目中使用能检测死锁的模块如第三方库。
5.读写锁
读写锁 是一种特殊的同步机制 ,允许多线程同时读共享数据,而多线程写共享数据则是独占的 。读写锁是一把锁,只是可以分为上写锁,上读锁。通过pthread_rwlock_t来定义 出读写锁,其中pthread_rwlock_t类型中记录了该读写锁上的是读锁还是写锁,以及锁的状态是上锁还是解锁,以及哪个线程对该锁进行了上锁。
pthread_rwlock_init 函数的作用是初始化读写锁 ,第一个参数 是读写锁的地址 ,第二个参数 是读写锁的属性 一般使用默认属性传入NULL。
pthread_rwlock_destroy 函数的作用是销毁读写锁 ,参数 是需要销毁的读写锁地址。
pthread_rwlock_rdlock 函数的作用是上读锁 ,上了读锁后若其他线程对共享资源进行读访问则不会被阻塞且可以访问共享资源,若是写访问则会被阻塞 ,参数 是读写锁的地址。
pthread_rwlock_wrlock 函数的作用是上写锁 ,上了写锁后不管其他线程对共享资源是进行读访问还是写访问都会被阻塞 ,参数 是读写锁的地址。
pthread_rwlock_tryrdlock和pthread_rwlock_trywrlock 函数的作用是尝试上读锁或上写锁 ,与前面函数的不同就是该线程不会被阻塞。
pthread_rwlock_unlock 函数的作用是解锁读写锁 ,解锁了读写锁后其他线程就可以来抢占读写锁的上锁权限,参数 是读写锁的地址。