Linux设备驱动开发基础之互斥与同步基础
Linux设备驱动开发基础之互斥与同步基础
一些概念
- 竟态:多个执行路径对同一资源进行操作时可能引发的资源混乱行为(①)。执行路径为并发源。
- 临界区:对共享资源的访问代码片段。临界区只能是在一个进程内部而无法跨进程,因为其不是一个对象,我们无法定义一个临界区对象来告知其他进程,而像Mutex和SpinLock都可以。参考这篇文章。
- 中断和抢占:一般都是在中断需要返回前会调用重新调度函数,如果没有禁止抢占,那么就会被高优先级的进程抢占。有的地方可以被中断但是进程必须不被抢占,那么只需要禁止抢占就行了。例如spin_lock是可以被中断的,但是不能被抢占,因为被其他进程抢占后会造成死锁。当然因为中断中也可能要去获得这个锁而造成死锁,这个就是spin_lock_irq的来由。
原子操作与原子变量
- 原子操作:每一步都是不可分割的。
- 原子变量:对此变量的操作(增加或者减小)是原子操作。
单核处理器+抢占
与 多核处理器
在许多发面有类似的特性。
并发的来源
- 中断
- 调度器的可抢占性
- 多核、多处理器的并发执行
中断
一般对于本地CPU(就是此刻运行这个代码的CPU或者CPU核),控制其中断使用的函数是:
- local_irq_enable
- local_irq_disable
调度器的可抢占性
调度器的控制函数 ...
more ...Linux驱动开发之内存管理基础
内存管理主要分为:
- 物理内存管理
- 虚拟内存管理
物理内存管理
页
物理内存以页(page frame
)为单位,一般为4K,如果是4G的内存那么,将会有一个大小为4G/4K=1M
的数组mem_map
,每一项保存着每一页的地址。
Zone
Zone是一些连续物理页的合集,参看下面的图3-2。将物理页分成了3个Zone区:
- ZONE_HIGHMEM:物理内存高于896M的区域
- ZONE_NORMAL:常规内存区域,如果DMA可以在此区域做内存访问,也可以使用这块区域
- ZONE_DMA:0~nM,不同的架构和不同的芯片都可能不一样
因为数组mem_map与物理页对应,因此mem_map也被默认分为了上面三个区域。
内存节点
分为两种:
- UMA:只有一个内存节点,CPU访问内存的内存的任何地址的速度是一样的。
- NUMA:多
个
处理器,每个处理器都有自己的本地内存,通过总线通讯。访问本地内存比访问其他节点的内存快。
物理页面分配器:伙伴系统
伙伴系统的特征与作用:
- 使用物理页为单位 ...
用gitlabCI快速搭建一个GitServer与CI
一般的公司一般都有一个或者多个中央Git Server,托管着所有项目代码;同时当一个项目很大,由许多个工程组成,例如Tizen和Android,那么一般还有Continuous Integration(CI)在有人push代码到工程时编译整个项目,编译出错一般CI会发邮件给提交者和管理者,从而可以及时修正错误。
Git Server安装与使用
Git server很多,列举一部分:
Windows
- GitStack:免费版只能有两个账号
- SCM Manager
Linux
- GitLab
- Git-Deamon
- Git使用-bare生成
获取与安装
这里使用gitlab,到这里下载bitnami gitlab一键安装包。安装非常简单,只需要添加可执行权限然后用sudo ./XXX.run 执行即出现图形化的安装向导。在安装过程中需要设置用户名和密码用于后面配置使用。
gitlab的使用
直接用IP地址或者网址登陆即可。例如:http://192.168.1.120
,要求用户名和密码时使用安装时输入的用户名和密码。
检查状态:
$ sudo /home/git ...
SPI Nor Flash
SPI协议
Slave与Master
一般而言,提供clock的一方称为master。如下图(7-1)中的SCLK方向可知:Processor为master,而Peripheral为slave。
SPI设备接口
SPI uses four main signals:
- Master Out Slave In (MOSI)
- Master In Slave Out (MISO)
- Serial CLocK (SCLK or SCK) and Chip Select (CS) for the peripheral.
- Some processors have a dedicated chip select for SPI interfacing called Slave Select ...
Speed up Booting Embedded System
嵌入式产品的启动时间一般是一个指标,像大部分Android手机几乎没有为启动加速做过优化,可以改进的地方非常多。当然因为Android用得最多的地方是手机,难得冷启动一次。
用户从按下电源键开始,看到boot logo
/boot splash
到出现可操作的Home/App画面,需要的时间越少,自然越好,产品的竞争力也越强。
一般没有系统的嵌入式设备启动都是上电即进入正常工作流程,这里只说linux/Android及类似的系统;下面将会简单的说明和列举从启动流程到各个启动过程都可以使用的方法,以及快速启动。
☞启动流程
要做启动时间优化,需要对启动过程非常熟悉。下面从启动流程说起。
不同的嵌入式设备启动流程很可能不一样,但是绝大部分的linux/Android设备都是一样或者类似的。
❤图片来源于:http://processors.wiki.ti.com/index.php/Optimize_Linux_Boot_Time
☞工具准备:
串口行间数据计时工具Grabserial
的安装与使用
因为依赖python的serial模块,先安装它,在Ubuntu中安装python-serial:
sudo apt-get install python-serial ...
ARM Linux BenchMark
1.背景说明
许多公司有很多不同的ARM SoC的研发产品,ARM核心可能有Cortex-A8/A9/A15,核心数可能有单核双核和四核.现在,几乎每出一款手机,网络上马上就有人对其评测.对比和评测不同ARM SoC 芯片以及嵌入式系统是非常有必要的;通过不同的SoC和其运行的OS对比,可以帮助我们了解我们产品的性能,并根据测试得知系统的瓶颈、找出需要改善的方面。
嵌入式产品的硬件一般都是由处理器、主存、存储器、显示设备、以及其他外设组成。嵌入式产品的软件方面,一般都选用嵌入式系统,如小的RTOS,如VxWorks、μC/OS-III、RTT、DJYOS、FreeRTOSLinux,或者是更复杂的Linux、Android、WinCE。评测和对比的内容一般也主要由软件和硬件这两个方面组成。
2.预备基础知识
如果只是对Andorid系统或者是WinCE相关系统评测,那么我们完全可以下载一些应用(安装)运行即可评测。而如果要评测的嵌入式系统是基于Linux自己定制的甚至没有GUI的,则很可能需要我们下载源代码编译。因此对基础的编译知识的了解必不可少①。编译配置又与ARM SoC构架相关,所以需要了解一下与ARM构架以及有关的交叉编译的选项,比较ARM SoC种类较少 ...
more ...