android月考

第九章心得:

HAL ( Hardware Abstraction Layer,硬件抽象腔,〉是建立在Linux驱动之上的一套翻字库。这套程序 j率并不属于 Linux 内核, 而是属于 Linux 内核层之上的应用层。

加入hal的目的:

(1)统一硬件的调用接口。由于HAL有标准的调用接卧,所以可以利用 HAL屏蔽Linux 驱动复杂,不统一的借口

(2)解决了GPl版权问题。由于 Linux 内核基于GPL协议,而Android基于Apache Licence 2 .0 ,协议.因此Google玩了个“穿越飞将原本位于 Linux驱动中的敏感代码向上移了一个层次二 这样 这些敏感代码就摆脱了 GPL协议的束缚。那些不想开源的 Linux驱动作者也就没必要开源了。

(3)针对一些特殊的要求。 对于有些硬件,可能需要访问→些用户空间的资源,或在内核空间 不方便完成的工作以及特殊需求。在这种情况下,可以利用位于用户空间的HAL代码来辅助Linux 驱动完成一些工作。

为led驱动添加HAL步骤:

第 1 步,编写 Linux 驱动

“编写 Linux 驱动”,从表明上看是废话,但如果要为 Linux 驱动添加 HAL,而且想尽量保护敏 感数据。 Linux 驱动的代码就要尽量简洁,尽可能将业务逻辑放到 HALLibrary 中。

第 2 步:编写 HAL Library HAL Library

HAL Library HAL Library 就是普通的 Linux Library *.so )文件。但这类库文件有一个接口。通过 HAL _MODULE_INFO _ SYM 变量实现。 Service Library 就是通过在这个接口中定义的 ID 定位 HAL Library 的。

第 3 步:编写 Service Library

尽管这步并不是必需的,但新的 HAL 架构要求我们这样做。 Service Library 也是 Linux Library。 这一步比较灵活。 Service Library 可以是一般的 Linux Library,也可以识别Library。在本章的 LED 驱动例子中将 Service Libraty和 Library 合到了一起。也就是说, Service Library就是JNI Library. 实际上这一步除了用 CIC件实现的*.so 库文件外,还应该包含一个用 Java 编写的服务管理类 ( ServiceManager)。 ServiceManager会调用 Service Library。而 APK 程序会调用 ServiceManager类米 访问 Service Library。

第十章心得

打印调试信息printk。printk 函数在前面的章节己多数使用过。该函数的用法与printf 函数类似,具不过printk 函数 运行在内核空间。

printk是在内核中运行的向控制台输出显示的函数 ,linux内核首先在内核空间分配一个静态缓存区,作为显示用的空间,然后调用sprintf,格式化显示字符串,最后调用tty_write向终端进行信息的显示。

printk与printf的差异,是什么导致一个运行在内核态而另一个运行用户态?其实这两个函数的几乎是相同的,出现这种差异是因为tty_write函数需要使用fs指向的被显示的字符串,而fs是专门用于存放用户态段选择符的,因此,在内核态时,为了配合tty_write函数,printk会把fs修改为内核态数据段选择符ds中的值,这样才能正确指向内核的数据缓冲区,当然这个操作会先对fs进行压栈保存,调用tty_write完毕后再出栈恢复。总结说来,printk与printf的差异是由fs造成的,所以差异也是围绕对fs的处理。

proc_mkdir

name: 虚拟目录名称。

parent: 虚拟目录父目录的 proc_dir_entry结构体指针。如果直接在/proc 目录下建立虚拟目录,该参数的值为 NULL。

create_proc_entry

name: 虚拟文件名称。 mode: 虚拟文件的访问权限, 等同于 Linux 文件的访问权限。 parent: 虚拟文件父目录的 proc_ dir _ entry 结构体指针。如果直接在/proc 剖录下建立虚拟 文件,该参数的值为 NULL。

create_proc_read_entry

name: 虚拟文件名称。mode:虚拟文件的访问权限,等同于 Linux 文件的访问权限。Base:虚拟文件父目录的 proc_ dir _ entry 结构体指针。如果直接在/proc 下建立虚拟文件, 该参数的值为 NULL。

read_proc:处理读动作的函数指针。 data: 用于虚拟文件系统的数据(任意类型的指针〉。该值就是 proc_ dir_entry.read _proc 函数 的最后一个参数值。相当于与某个虚拟文件永久绑定的数据。如果不市要设置该数据,可以为 NULL. remove _proc _ entry 。name: 要删除的虚拟文件的名称。 parent: 虚拟文件父目录的 proc_ dir _ entry结构体指钊。如果直接在/proc 目录下建立虚拟 文件, 该参数的值为 NULL.

第十一章心得:

中断屏蔽、原子操作、自旋锁、 信号量、 互斥体都 是解决并发问题的机制。中断屏蔽很少单独使用,原子操作只能对整数和位进行操作,而自旋锁、 信号量、 互斥体的应有比较广泛。当然,如果强调代码片段的执行顺序, 可以使用完成量。 自旋锁会由于不断自旋而导致死循环(也就是死锁〉,而且锁定状态会造成 臼U 闲置,因此用 自旋锁保护的临界区的代码不能执行时间过长,当然,更不允许临界区出现阻塞情况。信号量允许 临界区阻惑,因此适用于大临界区的情况. 读写↓自旋锁和读写信号量分别是放宽了条件的自旋锁和信号量,它们允许多个执行单元同时对 .共享资源执行读操作。

Linux中与完成量相关的操作:

(1)定义完成量struct completion my_completion;

(2)初始完成量init_completion(&my_completion);

(3)等待完成量wait_for_completion;

(4)唤醒完成量complete();

Linux 系统中与互斥体相关的操作主要有如下 4 种。

  1. 定义互斥体

定义互斥体需要使用 mutex 结构体,代码如下: struc.t mutex my_mutex;

2. 初始化直斥体 如果定义了 mutex 纯构体变量F耳以使隔nutex_init函数初始化该变量,

3. 获取互斥体

4. 释放放互斥休

信号量的分类
在学习信号量之前,我们必须先知道——Linux提供两种信号量:
(1) 内核信号量,由内核控制路径使用
(2) 用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEMV信号量。
POSIX信号量又分为有名信号量和无名信号量。
有名信号量,其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。无名信号量,其值保存在内存中。倘若对信号量没有以上的全面认识的话,你就会很快发现自己在信号量的森林里迷失了方向。

第十二章心得

阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。

因为阻塞的进程会进入休眠状态,因此,必须确保有一个地方能够唤醒休眠的进程。唤醒进程的地方最大可能发生在中断里面,因为硬件资源获得的同时往往伴随着一个中断。

注意:驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知)访问设备。

休眠(被阻塞)的进程处于一个特殊的不可执行状态。这点非常重要,否则,没有这种特殊状态的话,调度程序就可能选出一个本不愿意被执行的进程,更糟糕的是,休眠就必须以轮询的方式实现了。进程休眠有各种原因,但肯定都是为了等待一些事件。事件可能是一段时间、从文件I/O读更多数据,或者是某个硬件事件。一个进程还有可能在尝试获得一个已经占用的内核信号量时被迫进入休眠。休眠的一个常见原因就是文件I/O -- 如进程对一个文件执行了read()操作,而这需要从磁盘里读取。还有,进程在获取键盘输入的时候也需要等待。无论哪种情况,内核的操作都相同:进程把它自己标记成休眠状态,把自己从可执行队列移出,放入等待队列,然后调用schedule()选择和执行一个其他进程。唤醒的进程刚好相反:进程被设置为可执行状态,然后再从等待队列中移到可执行队列。

休眠有两种相关的进程状态:TASK_INTERRUPTIBLE and TASK_UNINTERRUPTIBLE。它们的惟一区别是处于TASK_UNINTERRUPTIBLE状态的进程会忽略信号,而处于TASK_INTERRUPTIBLE状态的进程如果收到信号会被唤醒并处理信号(然后再次进入等待睡眠状态)。两种状态的进程位于同一个等待队列上,等待某些事件,不能够运行。休眠通过等待队列进行处理。等待队列是由等待某些事件发生的进程组成的简单链表。内核用wake_queue_head_t来代表等待队列。

等待队列可以通过DECLARE_WAITQUEUE()静态创建。

也可用init_waitqueue_head()动态创建。进程把自己放入等待队列中并设置成不可执行状态。等与等待队列相关的事件发生的时候,队列上的进程会被唤醒。为了避免产生竞争条件,休眠和唤醒的实现不能有纰漏。

等待队列

在Linux驱动程序中,可以使用等待队列来实现阻塞进程的唤醒。

进程通过执行下面几步将自己加入到一个等待队列中:

当然,首先是定义等待队列头,并初始化:

(1)wait_queue_head_t wait;

(2)init_waitqueue_head(&wait);

时间: 2024-10-12 23:50:00

android月考的相关文章

第十二天-月考

今天讲解月考试卷,虽然我因为学校自身有课没有参考,但是这老师讲解的过程中,我意识到一个问题,来到达内,这里不再是一个班级的比赛,而是全国性的比赛,全国有那么多全日制参考的学生,向他们看齐,有本事进前一百就很不错了.这里的学习氛围真的很好,周六,全班都在不停的敲代码敲代码,而且通过试卷我已经把之前学过的基础知识完全消化了,学习不在于多,而在于精,今天算是领悟到这个道理了.接下来,就是自己该静下心来好好总结了.我相信三个月后,我会自信满满的.晚上犒劳自己,今天辛苦了,老九门,终于看到最新一集了.哈哈

Android 月活跃人数超过10亿用户了,我却审美疲劳了

一早上起来就看到谷歌召开了2014 I/O大会,铺天盖地的信息有点把我砸晕了.恍惚之间,我看到"Android 月活跃人数已超过10亿"."Android应用每年安装量增加236%"."Android占平板电脑出货量的62%"这些庞大的数据-- Android果然是发展迅猛,就跟撒欢的野狗一样,可怜的WP只能够远远的看着Android身后的尘土.Android越来越惊艳,越来越成熟,用户的体验也是越来越好,但是我却是一点兴趣都提不起不来.谷歌在出

在双语的第二次月考

考试对于我来说,其实并算不得了什么了,但如今转身做为一名教师,尤其是当一名班主任,对于成绩更是委看中,但我知道成绩好与不好,对于目前的我来说,并不会有什么好处,只不过名誉好与不好之听罢了.但对于自己带一个班,就显得那么重要了.他(她)追求的不只是钱,其实最主要的还是什么晋级的事.记得每次考试过后,他(她)都争得的不可开叫,而我只是作为一名旁观者,静静的听着,看着.有时在想为什么人人都为了那点小利益,而让大家都过的不开心.如今的教学事业已不是当年我所上学的那样了.太多太多的不近情意,这个社会真的在

我看西电通院月考——学生应该做点什么?

如果你没有耐心看完整篇文章,你可以直接跳到最后一点,看看对于类似通院月考这样让你很郁闷的抓学风政策,我所认为的学生应该怎么做,也是我主要想传达的想法. 1.大学月考政策介绍 前段时间听说西电通院一些年级开始实行月考制度,每门课都要月考:一次考试低于50就算挂科:月考均分低于60也算挂科:月考时间不固定,随机进行通知.也听说指纹签到机的使用,还有不遵守校规,直接宿舍断电断水的事,具体没有去做考证.我不知道这个月考制度后来具体是怎么实施的,实施是否严格,又是否有效. 对于这项政策,有人举双手表示赞同

藁城一中2010-2011学年第一学期第二次月考

一.选择题(每小题只有一个答案最符合题意,将正确答案选出来,将其字母涂在答题卡上,每小题1分,共70分) 1.列地质作用中,属于内力作用的是 A.剥蚀作用       B.沉积作用       C.风化作用         D.变质作用 致学教育课外辅导,提分快效果好! 2."背斜成山,向斜成谷"的主要地质作用是 A.内力作用                        B.搬运作用                     C.侵蚀作用        D.沉积作用 3.内力作用的能量

因第三次月考而引起的

这么久没有考试了,一连翘掉了期末.入学.第一次月考.期中考试.本来这一次的第三次月考是要求全组参加的,但是,俗话说:“计划赶不上变化”.确实如此,在明天就要第三次月考的晚自习前,我们还在搞大扫除,忽然,远远望见教练的身影,他过来说:“联赛400分以上的不要参加月考,从明天开始准备冬令营.”我们这些人(4个)真是一脸茫然的样子.马上又去找了教练,他说年级组要求我们参加月考因我们不能参加冬令营.不过教练还是说会去和年级组谈一谈. 不知怎么办的我们遭遇了这当头的一棒,马上,准备去找年级组长,我们的理由

洛谷 P4256 公主の#19准备月考

题目背景 公主在玩完游戏后,也要月考了.(就算是公主也要月考啊QWQ) 题目描述 公主的文综太差了,全校排名1100+(全校就1100多人),她分析了好久,发现她如果把所有时间放在选择题上,得分会比较好一点. 文综题目共有n个,编号从1到n 公主给每个题目算出来了一个预估值Ai,她认为,一段连续题目的答案会在它们的预估值的gcd和lcm之间:有时候她的想法不同了,一些题目的预估值会改变:有时候,会出现多选题,多选题的答案数量就是一段连续题目答案的预估值的公约数的个数. 具体来说,对于一个数列,有

关于我的月考

它死了,我AFO了. 这次我扣分在50分以内我就倒立洗头. 凉了 凉了 凉了 如果我死了就可以上香了. 我肯定死了 这一次我如果比myt高我就不是人. 我话就放在这里. 反正我死这是板上钉钉的事,不需要争辩.总之就是如此. 如果还有机会我会更新的QAQ —————————————————————— Update  3.23 分数终于出来了……前十保住了……QWQ 毛队还是又稳又强,这次又是月考年级第一QWQ (PS:毛队说过,我比她低的话,她请我一杯奶茶,还要再博客里发表感言QWQ,到时候欢迎大

第三次月考

第八章 让开发板发出声音:蜂鸣器驱动 代码重用分为静态和动态.静态重用是使用某些功能时,include相应的头文件即可.动态重用就是一个Linux驱动可以使用另外一个Linux驱动中的资源.C或C++语言中编译多个源代码文件时,如果a.c使用了b.c文件中的函数,需要在a.c文件中使用extern预先定义b.c中德函数,extern的作用就是告诉编译器该函数的函数名.参数个数.参数类型和返回值类型.Extern只在编译阶段起作用. 当linux驱动异常无法正常卸载时,即无法使用rmmod命令卸载