自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 资源 (8)
  • 收藏
  • 关注

原创 内核的likely和unlikely

1. 概念指令周期是指执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到指令执行完所需的全部。预取指令具体方法就是在不命中时,当数据从主存储器中取出送往CPU的同时,把主存储器相邻几个单元中的数据(称为一个数据块)都取出来送入Cache中。预取指令可以更好的利用 cpu资源。简单说就是从内存取指令很慢, cpu要等待这个过程。如果能提前预测可能执行的指令,就提前从内...

2018-09-30 23:45:39 1394

原创 从零开始之驱动发开、linux驱动(二十一、内核定时器的使用)

在异步通知章节中,使用驱动程序主动通用应用层调用绑定的信号函数。有一个缺陷,那就是对按键程序来说,会出现抖动,会多次进入中断函数,这会影响应用层对按键事件的处理产生麻烦。正常情况下都是按下和松开成对出现的,但上图因为有了抖动,则出现了问题。 一般我们消抖都是采用延时的方式处理的。在操作系统中一般延时有两种选择1.通过sleep、udelay等函数延时2.通过定时延时...

2018-09-27 21:25:27 811

原创 从零开始之驱动发开、linux驱动(二十、linux设备驱动中的并发控制)

本文参考自宋宝华老师的《linux驱动开发详解》 并发(Concurrency) 指的是多个执行单元同时、 并行被执行, 而并发的执行单元对共享资源(硬件资源和软件上的全局变量、 静态变量等) 的访问则很容易导致竞态(Race Conditions) 只要并发的多个执行单元存在对共享资源的访问, 竞态就可能发生。 1.对称多处理器(SMP) 的多个CPUSMP是一种紧耦...

2018-09-23 18:18:57 1276

原创 从零开始之驱动发开、linux驱动(十九、阻塞和非阻塞IO)

阻塞和非阻塞I/O是设备访问的两种不同模式, 驱动程序可以灵活地支持这两种用户空间对设备的访问方式。 阻塞操作是指在执行设备操作时, 若不能获得资源, 则挂起进程直到满足可操作的条件后再进行操作。 被挂起的进程进入睡眠状态, 被从调度器的运行队列移走, 直到等待的条件被满足。 而非阻塞操作的进程在不能进行设备操作时, 并不挂起, 它要么放弃, 要么不停地查询, 直至可以进行操作为止。 ...

2018-09-21 22:50:40 1579

原创 从零开始之驱动发开、linux驱动(十八、异步通知机制)

异步通知的意思是: 一旦设备就绪, 则驱动主动通知应用程序, 这样应用程序根本就不需要查询设备状态, 这一点非常类似于硬件上“中断”的概念, 比较准确的称谓是“信号驱动的异步I/O”。 信号是在软件层次上对中断机制的一种模拟, 在原理上, 一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。 信号是异步的, 一个进程不必通过任何操作来等待信号的到达, 事实上, 进程也不知道信号到底什么时候...

2018-09-21 00:11:41 868

原创 从零开始之驱动发开、linux驱动(十七、select机制)

 上一节分析了poll的原理和实现,这节分析它的孪生兄弟select。先看一下select的函数原型。man 2 selectint select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); #undef __FD_SETSIZE#d...

2018-09-19 23:09:58 1498

原创 从零开始之驱动发开、linux驱动(十六、poll机制)

上一节分析了系统调用函数的封装,这一节我们学习一下poll系统调用函数。就从最开始的sys_poll开始。在开始之前我们先了解一下poll函数的作用。 使用下面命令查看poll的使用方法和作用可知man 2 poll官方的解释是:poll函数是用来,等待一组文件描述符中的一个准备好执行 I / Oint poll(struct pollfd *fds, nfds_t ...

2018-09-16 14:35:08 1557 1

原创 从零开始之驱动发开、linux驱动(十五、对系统调用函数的封装)

在分析系统调用函数之前,先分析几个重要的宏。在2.6后期的内核中增加的,用宏来封装了一些通用性的东西,使正的系统调用实现函数看起来简洁了很多,这里我们进行简单的展开分析。#define __stringify_1(x...) #x#define __stringify(x...) __stringify_1(x)#define __MAP0(m,...)#define __MAP...

2018-09-15 23:49:29 1208

原创 从零开始之驱动发开、linux驱动(十四、字符驱动之按键中断方式实现和等待队列分析)

 第8节的轮询方式查询按键,非常的浪费CPU资源,这一节主要就是来解决这个问题的。第12节的中断程序框架也给了出来,这一节我们来完成中断方式的代码实现和分析。 这节是通过使用等待队列的方式来解决CPU资源来等待信号浪费问题。其主要原理是应用层读按键值,在驱动这边先先检查有没有按键事件发生,如果有则直接返回键值给应用程序。如果没有,则把该内核进程加入到一个等待队列中(队列是一...

2018-09-15 01:03:44 1453

原创 从零开始之驱动发开、linux驱动(十三、共享中断原理分析和新的共享中断实现方式)

这里我们先要说明一下,那些情况下是可以使用共享中断的,那些情况是不能使用共享中断的。先说一下那些情况可以用共享中断。必要条件:1.硬件支持可选条件1.参数支持这里先说硬件支持。比如假设我们想用我们的外部中断9做共享中断,可以看到它只针对一个GPIO管脚,GPH1_1。如果使用EINT9,做共享中断,假设被注册来三个中断函数。当某一...

2018-09-14 01:31:31 2188 1

原创 从零开始之驱动发开、linux驱动(十二、字符驱动之按键中断驱动)

前面几节我简要分析了linux中的异常的初始化以及调用流程。详细分析了中断向量表的搬移,中断的初始化流程,中断注册,以及中断发生后的调用流程。本节就使用一下中断。下面先看一下源码。#include <linux/fs.h> /* 包含file_operation结构体 */#include <linux/init.h> /* 包...

2018-09-13 01:31:26 1427

原创 从零开始之驱动发开、linux驱动(十一、linux的中断框架和详细调用流程)

上一节我们学习了在linux中,中断的初始化流程以及调用流程。本节我们对中断的框架进行说明。 开始之前我们先把前面说过的一个数据结构拿出来分析一下。 1.中断描述符/** * struct irq_desc - interrupt descriptor * @irq_data: per irq and chip data passed down to chip f...

2018-09-11 02:01:23 2969

原创 从零开始之驱动发开、linux驱动(十、linux的中断初始化流程和基本调用流程分析)

上一节我们已经对linux中ram的异常处理有了一个大概流程有了一个了解。本节我们主要来分析中断的处理流程。正常情况下会有两种情况进入irq模式,一种是从usr模式,另一种是svc模式。我们这里就以usr模式来分析。__irq_usr: usr_entry /* 保存中断上下文 */ kuser_cmpxchg_check ...

2018-09-09 19:41:20 2369

原创 从零开始之驱动发开、linux驱动(九、linux的异常处理流程)

在学习裸机的时候我们知道,异常的触发分为下面几个过程:1.设置好异常向量表(把异常向量表放在异常向量的位置)2.写异常处理函数3.执行异常处理 下面列出简单的代码实现.text.global _start.global __reset_exception.global __undefined_instruction.global __software_inter...

2018-09-08 17:46:15 2153 3

原创 从零开始之驱动发开、linux驱动(八、字符驱动之查询式按键处理)

 这一小节很简单,在读函数中返回两个gpio的状态就可以 #include <linux/fs.h> /* 包含file_operation结构体 */#include <linux/init.h> /* 包含module_init module_exit */#include <linux/module.h> /* 包...

2018-09-07 01:20:37 1374

原创 从零开始之驱动发开、linux驱动(七、字符驱动之led最终版)

我们上一接用的gpiolib非常杂乱,使用了两种1.各硬件厂商实现的,如s3c_gpio_cfgpin(S5PV210_GPJ0(5), S3C_GPIO_SFN(1))2.系统公共的,如gpio_set_value(S5PV210_GPJ0(4),val)其实公共的也是对各硬件厂商的封装,用那个都可以,个人建议用系统公共的,应为这样换芯片厂商,不影响任何使用。 2.错误处理基...

2018-09-06 22:04:33 2124

原创 从零开始之驱动发开、linux驱动(六、字符驱动之多个led驱动和gpiolib库详解)

上一节我们写出了简单的可以操控硬件的单个led驱动。本节我们主要给出利用多个次设备号,来实现多个led驱动的注册。同时来使用下gpiolib库,来使用一些专用于gpio的操作。 下面是主要代码片段。其作用是自从分配主设备号,并使用其次设备号0来同时控制三盏led,次设备号1,2,3来分别控制每一栈#include <linux/fs.h> /* 包...

2018-09-06 02:35:16 3655

原创 从零开始之驱动发开、linux驱动(五、字符驱动之led驱动改进)

上一节的代码有两个使用不是很方便问题:1.写驱动时,每个次设备号都要自己指定。(这样就不能作为移植性强的软件了)2.引用层使用时不但要手动创建设备节点,还要知道其设备信息和设备号。 我们先来解决第一个问题:其实很简单,主设备号为0,则系统就会为我们自动分配未使用的主设备号。static unsigned int major;static int __init firs...

2018-09-03 23:54:36 2258

原创 ioremap函数分析

 开始之前,先说一下ioremap的作用,ioremap主要是把寄存器做映射。为什么要映射?内核空间只能访问虚拟地址的3~4G的地址空间,通常3~4G的空间一部分是映射物理内存,通常默认不会映射寄存器,如果想要访问某个寄存器,则需要把这个寄存的虚拟地址映射到高端内存上。这样内核空间才能直接访问。 下面这篇文章,对3~4G的内核空间和io映射分析的比较好,值得好好看一下。ht...

2018-09-03 21:30:03 8032

USB_HID的两篇官方文档

Device Class Definition for Human interface Devices和 HID Usage Tables两篇官方文章,保存起来,已被更换电脑后用

2019-01-10

read-copy-update

linux锁机制的经典文档,read - copy - update。来自linux社区。

2018-09-25

输入子系统编程模板

尴尬,我自己的某个博客要用。这个东西我不想设置分数的,结果不能为0分。

2018-07-29

51单片机移植的ucosii嵌入式操作系统

对ucosii中不必要的内容进行了裁剪。因为51单片机的idata很小,这份代码用了51单片内部的idata作为当前运行任务的任务栈,其它没被运行的任务的栈则被放置在内存较大的xdata区。但因为51单片机的汇编语句少,简单,可以作为其他处理器移植ucosii的模版和参考,同时也是学习51单片机递增以及高级应用的实例。

2018-07-22

基于51单片机移植的ucosii的代码

对ucosii中不必要的内容进行了裁剪。这份代码用了51单片内部的idata作为任务栈,因为51单片机的idata很小,所以这份代码可以运行的任务数量比较少。但因为51单片机的汇编语句少,简单,可以作为其他处理器移植ucosii的模版和参考。

2018-07-22

基于51单片机写的一个多任务切换的简易OS

里面代码是本人亲自手写的一个基于51单片机的多任务切换代码,核心代码只有不到200行,可以从代码层面方便单片机开发者了解任务切换的原理和使用,里面没有使用任何复杂的算法。

2018-07-22

linux0.11源代码

里面包含有linux0.11版本的原版代码和 赵炯博士对里面所有代码的注释。

2018-07-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除