高通平台android 环境配置编译及开发经验总结 1、高通平台android开发总结1.1 搭建高通平台环境开发环境在高通开发板上烧录文件系统建立高通平台开发环境高通平台,android和 modem 编译流程分析高通平台 7620 启动流程分析qcril 流程分析,设置sim卡锁python scons 语法学习Python 语言之 scons 工具流程分析: 1.2 搭建高通平台环境开发
android MSM8974 上DeviceTree简介 简介主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述。整个系统的设备节点会形成一个树,设备节点里可以设置属性。官网在http://www.devicetree.org 。入门指南请参考http://www.devicetree.org/Device_Tree_Usage 。Linux上一些状况请参考"kernel/Document/devicetree/",其中"bindings
串口编程tcflush()函数 tcflush函数刷清(扔掉)输入缓存(终端驱动法度已接管到,但用户法度尚未读)或输出缓存(用户法度已经写,但尚未发送). int tcflush(int filedes,int quene) quene数该当是下列三个常数之一: *TCIFLUSH 刷清输入队列 *TCOFLUSH 刷清输出队列 *TCIOFLUSH 刷清输入、输出队列 例如:
Linux下的串口编程(二) Linxu下的串口编程(二)---------------------------------------------------------Author :tiger-johnWebSite :blog.csdn.net/tigerjbEmail :jibo.tiger@gmail.comUpd
上拉电阻下拉电阻的总结 上拉电阻:1、当TTL 电路驱动COMS 电路时,如果TTL 电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL 的输出端接上拉电阻,以提高输出高电平的值。2、OC 门电路必须加上拉电阻,才能使用。3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。4、在COMS 芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电
Android Low memory killer Android Low memory killer by 永远的伊苏Android中,进程的生命周期都是由系统控制的,即使用户关掉了程序,进程依然是存在于内存之中。这样设计的目的是为了下次能快速启动。当然,随着系统运行时间的增长,内存会越来越少。An
read_proc的用法实例 说明本测试程序主要参考了《linux设备驱动程序》第三版的第四章“调试技术”的‘/proc文件’一节。并对一些关键函数进行了实例化。以下是mod1.c#include#include#include#include /* read_proc需要的头文件。 */MODULE_LICENSE("GPL");/* 原型函数:int (*rea
写了一个内核模块 实现简单的类似ps命令 内核模块创建在proc文件系统上建立_ps文件.遍例进程内核链表task_struct.将遍例结果存入缓冲区.影射到/proc/_ps文件中.用户态的程序去读取 这个文件.打印显示 当前进程的的pid,ppid 和进程名.[CODE] #include #include #include #include #include MODULE_LICEN
open和fopen的区别 open和fopen的区别:1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则
使用call_usermodehelper在Linux内核中直接运行用户空间程序 系统初始化时kernel_init在内核态创建和运行应用程序以完成系统初始化. 内核刚刚启动时,只有内核态的代码,后来在init过程中,在内核态运行了一些初始化系统的程序,才产生了工作在用户空间的进程。/* This is a non __init function. Force it to be noinline otherwise gcc 736 * makes it
使用异步 I/O 大大提高应用程序的性能(AIO) 简介: Linux® 中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O 请求可能需要与其他进程产生交叠。可移植操作系统接口(POSIX)异步 I/O(AIO)应用程序接口(API)就提供了这种功能。在本文
select - I/O多路转接全面透析 select()系统调用提供一个机制来实现同步多元I/O:#includesys/time.h>#include sys/types.h>#include unistd.h>int select (int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct
select函数与I/O多路转接 select函数与I/O多路转接相作大家都写过读写IO操作的代码,例如从socket中读取数据可以使用如下的代码:while( (n = read(socketfd, buf, BUFSIZE) ) >0) if( write(STDOUT_FILENO, buf, n) = n) {printf(“write error”);exit(1); }
linux等待队列 第四篇 Linux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,下面简单总结了等待队列的四种用法,希望对读者有所帮助。1. 睡眠等待某个条件发生(条件为假时睡眠): 睡眠方式:wait_event, wait_event_interruptible 唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要
linux 等待队列 第三篇 1、为什么要使用等待队列?等待队列就是阻塞型字符设备驱动的必需品。阻塞型就是说某个设备可读或者可写,但是呢,某个时候这个设备没有东西给你读,但你的应用程序(进程)操作却要向设备去读取数据,那没办法,要么就出错,要么就阻塞着在那里等着要读取数据。一旦设备有东西可以给你读了,进程就可以继续进行读操作了。2、定义并初始化等待队列。 (1) 定义"等待队列头" wait_
linux 等待队列 第二篇 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为"连接件"。它通过一个双链表和把等待tast的头,和等待的进程列表链接起来。从上图可以清晰看到。所
linux等待队列 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(
poll_wait新的理解 应用程序使用 select() 或 poll() 调用设备驱动程序的 poll() 函数,该函数把输入输出复用处理的等待队列追加到由内核管理的进程的 poll_table()上。此时,poll() 函数上传递的参数包括含有设备文件信息的 struct file 结构体的指针参数 struct file *filp ,以及追加到设备驱动上的 poll_table结构体指针参数 poll_table
理解poll_wait poll_wait()是用在select系统调用中的. 一般你的代码会有一个struct file_operations结构, 其中fop->poll函数指针指向一个你自己的函数, 在这个函数里应该调用poll_wait() 当用户调用select系统调用时,select系统调用会 先调用 poll_initwait(&table); 然后调用你的 fop->pol
poll机制分析 poll机制分析所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数。比如系统调用open、read、write、poll,与之对应的内核函数为:sys_open、sys_read、sys_write、sys_poll。一、内核框架:对于系统调用poll或select,它们对应的内核函数都是sys_poll。分析sys_poll,即可理解poll机
linux中字符串转换函数 simple_strtoul Linux内核中提供的一些字符串转换函数:lib/vsprintf.c[html] view plaincopyprint?1. unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) 2. unsigned long simple_strt
远端仓库初始化成裸仓库 git init --bare 1 git init 和 git init –bare的区别 用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作。但别的用户在将更新push上来的时候容易出现冲突。比如有用户在该目录(就称为远端仓库)下执行git操作,且有两个分支(master和b1),当前在master分支下。另一个用户想把自己在本地仓库(就称为本地仓库)的master分支的更新提交到远端
Linux 内核的队列实现--kfifo 今天研读了2.6.26内核的kfifo代码,感觉实现得巧妙,队列的队头队尾下标不受队列长度的限制,就算队头下标大于队列长度,也一样可以使用,原理就在于,数据不是全部放在队头(fifo->out)和队尾(fifo->in)之间的内存空间,而是把超出队头队尾之间长度的数据放到整个队列buffer的开始处,如图:蓝色部分为真实数据所在内存段,白色部分其实为逻辑上假定的数据所在地,也就是说,为
内核数据结构之队列-kfifo 在操作系统内核中,一个常见的编程模式就是生产者和消费者。实现这种模式的最容易的方式就是队列。生产者将数据插入队列,消费者将数据移出队列。消费者以数据进队的顺序消费数据。内核中通用队列的实现称为kfifo,其实现文件位于kernel/kfifo.c中。本部分讨论的API接口是基于2.6.33的。Linux的kfifo工作方式与其他队列一样,提供两个主要的操作:enqueue()和dequeue(
linux编程下signal()函数 当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。根据信号的默认处理规则SIGPIPE信号的默认执行动作是 terminate(终止、退出), 所以client会退出。若不想客户端退出可以把 SIGPIPE设为SIG_IGN
hrtimer的简单使用 + 原理和实现 1.hrtimers - 为高分辨率kernel定时器,可作为超时或周期性定时器使用1). hrtimer_init初始化定时器工作模式。hrtimer_init(&vibe_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);vibe_timer.function = timer_func;/* 设置定时器的回调函数,定时器到时该函数将被调用 */
中断处理函数中不用disable_irq而用disable_irq_nosync原因 今天在写触摸屏驱动时在中断处理函数中使用disable_irq关中断发现在进入中断处理后内核就挂掉了,于是研究了一下才发现disable_irq关闭中断并等待中断处理完后返回, 而disable_irq_nosync立即返回. 在中断处理程序中应该使用disable_irq_nosync来关闭中断先看一下disable_irq_nosync,内核代码中是这样解释的:
Linux中的工作队列 工作队列一般用来做滞后的工作,比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到工作队列。说白了就是系统延时调度的一个自定义函数。工作队列是实现延迟的新机制,从 2.5 版本 Linux内核开始提供该功能。不同于微线程一步到位的延迟方法,工作队列采用通用的延迟机制,工作队列的处理程序函数能够休眠(这在微线程模式下无法实现)。工作队列可以有比微线程更高的时延,并为任务延迟提供
输入子系统--event层分析 #####################################################################################################早前曾研究了一下输入子系统的原理,给人的感觉是输入子系统很复杂.但其实内核开发者在这方面已经做得很完善了,输入子系统虽然错综复杂,但是只要我们领会了输入子系统的一些设计思想后,我们要使用它并
set_fs get_fs 其实内核里面也可以用系统调用的,直接用read/write是可以的。但要注意几个问题: 一个是要记得编译的时候加上-D__KERNEL_SYSCALLS__ 另外源文件里面要#include 如果报错,很可能是因为使用的缓冲区超过了用户空间的地址范围。一般系统调用会要求你使用的缓冲区不能在内核区。这个可以用set_fs()、get_fs()来解决。在读写文件前先得到当前fs:
LINUX内核中的xx_initcall初始化标号 LINUX内核中的xx_initcall初始化标号田海立@CSDN 2011-07-02 LINUX内核中有很多的初始化指示标志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 这些起什么作用呢?查阅源代码(android goldfish-2.6.29
Linux驱动中,probe函数何时被调用 最近看到linux的设备驱动模型,关于Kobject、Kset等还不是很清淅。看到了struct device_driver这个结构时,想到一个问题:它的初始化函数到底在哪里调用呢?以前搞PCI驱动时用pci驱动注册函数就可以调用它,搞s3c2410驱动时只要在mach-smdk2410.c中的struct platform_device *smdk2410_devices {}中加入设备也会调用
FT5406触摸屏驱动 1.首先,分析下FT5406的基本电路接口[html] view plaincopyExternal Interface I2C/SPI: an interface for data exchange with host INT: an interrupt signal to inform the host processor that touch
input 子系统架构总结 Linux输入子系统(Input Subsystem) Linux 的输入子系统不仅支持鼠标、键盘等常规输入设备,而且还支持蜂鸣器、触摸屏等设备。本章将对 Linux 输入子系统进行详细的分析。一 前言 输入子系统又叫 input 子系统。其构建非常灵活,只需要调用一些简单的函数,就可以将一个输入设备的功
十说电容经典 话说电容之一:电容的作用作为无源元件之一的电容,其作用不外乎以下几种:1、应用于电源电路,实现旁路、去藕、滤波和储能的作用。下面分类详述之:1)旁路旁路电容是为本地器件提供能量的储能器件,它能使稳压器的输出均匀化,降低负载需求。 就像小型可充电电池一样,旁路电容能够被充电,并向器件进行放电。 为尽量减少阻抗,旁路电容要尽量
每个程序员都应该了解的内存知识 1 概述早期,计算机曾经很简单。它的各种组件,比如CPU、内存、大容量存储和网络接口,都是一起开发的,所以性能差不多。举个例子来说,内存和网络接口提供数据的速度不会比CPU快多少。这种情况随着计算机构造的固化和各子系统的优化慢慢地发生了改变。其中一些组件的性能开始落后,成为系统的瓶颈。特别是大容量存储和内存子系统,由于代价的原因,它们的发展严重滞后了。大容量存储的性能问题往往靠软件来改
如何从零开始开发一款嵌入式产品(20年的嵌入式经验) 首先,如果你有幸看到这篇文章,千万不要试图在2个小时内阅读完,就算你2个小时阅读完,我相信你也不会理解里面讲解的精华之处,我相信,你应该将此文章,慢慢品尝,这绝对是一篇需要品尝2~3天,再结合自己过往的经验,加上自己的思考,我相信会对你不仅仅是技术能力,甚至包括整体的思维方式都会有一个非常大的提高。 我写这篇文章的目的,是用本人20年的嵌入式经验呈现给大家一副完整的产品,项目开发蓝图
Nand 的几个名词:oob,bbt,ecc 例如Samsung K9F1208U0B,数据存储容量为64MB,采用块页式存储管理。8个I/O 引脚充当数据、地址、命令的复用端口。 芯片内部存储布局及存储操作特点: 一片Nand flash为一个设备(device), 其数据存储分层为: 1 (Device) = 4096 (Blocks) 1 (Block) - = 32 (Pages/Rows)
nand 分析(转帖)详细 直接转的贴,未整理,不方便的话请看原帖NAND Flash的驱动程序设计http://www.usr.cc/html/99/n-599.html1. 硬件特性:【Flash的硬件实现机制】Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory
Linux内核中的内存屏障 前言 之前读了关于顺序一致性和缓存一致性讨论的文章,感觉豁然开朗。对linux内核中出现的种种同步和屏障,想做一点总结。 缓存一致性 之前一直认为linux中很多东西是用来保证缓存一致性的,其实不是。缓存一致性绝大部分是靠硬件机制实现的,只有在带lock前缀的指令执行时才与cache有一点关系。(这话说得绝对,但我目前看来就是这样)我们更多的时候是为了保证顺序一致性。
《LINUX3.0内核源代码分析》第三章:内核同步(1) 原文地址:《LINUX3.0内核源代码分析》第三章:内核同步(1) 作者:xiebaoyou摘要:本文主要讲述linux如何处理ARM cortex A9多核处理器的内核同步部分。主要包括其中的内存屏障、原子变量、每CPU变量。自旋锁、信号量、complete、读写自旋锁、读写信号量、顺序锁、RCU放在后文介绍。法律声明:《LINUX3.0内核源代码分析》系列文章由谢宝友(scxb
init.rc分析 init.rc分析1,init.rc是一个可配置的初始化文件,通常定制厂商可以配置额外的初始化配置,init.%PRODUCT%.rc2,init.rc是在$GINGERBREAD/system/core/init/init.c中读取的,它基于“行”,包含一些用空格隔开的关键字(它属于特殊字符)3,如果关键字中有空格,处理方法类似于C语言,使用/表示转义,使用“”防止关键字被断开,另外
LCD驱动调试中部分常见问题的分析及解决办法 LCD点不亮——无法正确完成初始化: LCD点不亮问题的原因有很多,但出现这个问题后,首先应该判断LCD是否正确完成初始化。最简单的判断方法就是测量LCM的FPC上的电容两端电压。(具体的值可以和模组供应商沟通) 如果经过上一步,检测出没有正确完成初始化,接下来首先和模组、IC一起确认初始化代码是否有问题。 确认好代码以后还是点不亮
Volatile深入理解 Volatile深入理解 就象大家更熟悉的const,auto,register等关键字一样,volatile是一个类型修饰符。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。Volatile 是易变的、不稳定的意思。用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系
ARM启动代码学习(一)RO和RW还有ZI代表什么?(转载) 一般而言,一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到
关于ARM的22个常用概念--的确经典 1.ARM中一些常见英文缩写解释MSB:最高有效位;LSB:最低有效位;AHB:先进的高性能总线;VPB:连接片内外设功能的VLSI外设总线;EMC:外部存储器控制器;MAM:存储器加速模块;VIC:向量中断控制器;SPI:全双工串行接口;CAN:控制器局域网,一种串行通讯协议;PWM:脉宽调制器;ETM:嵌入式跟踪宏;CPSR:当前程序状态寄存器;
在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务 我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务。那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?在这一篇文章中,我们将在Android系统的应用层增加一个内置的应用程序,这个内置的应用程序通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务。
在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务 在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件。因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的。硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序;而驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功
在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口。实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的Application Frameworks层提供硬件服务。我们知道,Android系统的应用程序是用Java语言编写的,而硬件驱动程序是用C语言来实现的,那么,Java接口如何去访问
在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序 在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法。简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中。接着,在Ubuntu上为Android系统编写Linux内核驱动程序一文中举例子说明了如何在Linux内核编写驱动程序。在这一篇文章中,我们将继续介绍Android系统硬件驱动程序的另一
在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序 在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序。在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello、proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/val。进一步,还通过cat命令来直接访问/proc/hello和/
Android硬件抽象层(HAL)概要介绍和学习计划 Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,
初做主管常见管理问题的解决之道 在职场打拼,谁不梦想有朝一日能够坐在宽敞的单独办公室里,每月拿厚厚的薪水袋,于是每个人都努力的工作。当有一天,已经记不清用了多少汗水,泪水甚至血 水将一切都实现了的时候,静静的坐在办公室,欣赏这来之不易的一切的时候应该高兴了吧?不!恰恰相反,一切才刚刚开始,新的考验开始了,而且比以前需要付 出的更多更多,下面是笔者多年从事企业管理实践和为企业提供管理咨询、培训服务的经验的累积,供所有的企业管理者思
关与上拉和下拉电阻 上拉电阻: 1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。2、OC门电路必须加上拉电阻,才能使用。 3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。 4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降
ARM920T的MMU与Cache Cache是高性能CPU解决总线访问速度瓶颈的方法,然而它的使用却是需要权衡的,因为缓存本身的动作,如块拷贝和替换等,也是很消耗CPU时间的。MMU的重要性勿庸置疑,ARM920T(和ARM720T)集成了MMU是其最大的卖点;有了MMU,高级的操作系统(虚拟地址空间,平面地址,进程保护等)才得以实现。二者都挺复杂,并且在920T中又高度耦合,相互配合操作,所以需要结合起来研究。同时,二者的操作对
如何将DSP和MCU两者完美结合 如何将DSP和MCU两者完美结合 按照传统方式,嵌入式应用中的数字信号处理器(DSP)相对于主微控制器(MCU)起从属作用。在这些应用中,MCU用作系统控制器,而大量的数据处理留给DSP。例如,在音频或视频处理应用中有可能需要人机界面管理,或者是整个系统的控制。 设计方案选择 为完成这些任务,有几种系统设计方案选择。 第一种方案将DSP和MC
C/C++结构体的一个高级特性――指定成员的位数 在大多数情况下,我们一般这样定义结构体:struct student{ unsigned int sex; unsigned int age;};对于一般的应用,这已经能很充分地实现数据了的“封装”。但是,在实际工程中,往往碰到这样的情况:那就是要用一个基本类型变量中的不同的位表示不同的含义。譬如一个cpu内部的标志寄存器,假设为16 bit
从两道经典试题谈C/C++中联合体(union)的使用 试题一:编写一段程序判断系统中的CPU是Little endian还是Big endian模式?分析:作为一个计算机相关专业的人,我们应该在计算机组成中都学习过什么叫Little endian和Big endian。Little endian和Big endian是CPU存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址到高地址
一道著名外企面试题的抽丝剥茧 问题:对于一个字节(8bit)的数据,求其中“1”的个数,要求算法的执行效率尽可能地高。分析:作为一道著名外企的面试题,看似简单,实则可以看出一个程序员的基本功底的扎实程度。你或许已经想到很多方法,譬如除、余操作,位操作等,但都不是最快的。本文一步步分析,直到最后给出一个最快的方法,相信你看到本文最后的那个最快的方法时会有惊诧的感觉。解答:首先,很自然的,你想到除法和求余运算,并给出了
少有人走的路 -- 自律(读后感) 第一章:自律作者首先提出:人生,是一个不断面对问题并解决问题的过程。在面对一个一个接踵而至的问题时,每个人的选择都是不一样的,大的来看,一是解决问题,二是规避问题。作者认为,解决问题,是痛苦的,但在痛苦中,伴随着能力的增长和心智的成熟,而规避问题,往往不会使痛苦消失,持续的逃避还会使心智退化。那么,如何才能做到积极、主动的解决问题呢?这就是自律。自律,包括四个方面:1.推迟满足感,即所
android启动--深入理解init进程 init是一个进程,它是linux系统中用户空间的第一个进程,其进程PID是1,父进程为linux系统内核的0号进程。所以其被赋予很多极其重要的职责,linux内核初始化完成后就开始执行它。代码路径:\system\core\init\init.c下面就分析一下先吧,只分析重点的函数功能:int main(int argc, char **argv){
Android 的 init.rc 文件简介 init.rc由许多的Action和Service组成。每一个语句占据一行,并且各个关键字被空格分开.由 # (前面允许有空格)开始的行都是注释行(comment)一个actions 或 services 的开始隐含声明了一个新的段,所有commands 或 options 属于最近的声明。在第一个段之前的 commands 或 options 都会被忽略每一个actions 和 se
Android 根文件系统启动过程(init进程 详细分析) 今天开始分析Android 根文件系统启动过程。在Android系统启动时,内核引导参数上一般都会设置“init=/init”,这样的话,如果内核成功挂载了这个文件系统之后,首先运行的就是这个根目录下的init程序。这个程序所了什么呢? 我们只有RFSC(Readthe Fucking Source code)!!init程序源码在Android官方源码的system/core/i
C/C++宏定义的可变参数 C/C++宏定义的可变参数编写代码的过程中,经常会输出一些调试信息到屏幕上,一般会调用printf这类的函数。但是当调试解决之后,我们需要手工将这些地方删除或者注释掉。最近在看《Linux C编程一站式学习》这本书,就想到一个方法:void myprintf(char* fmt, ...){}#ifdef DEBUG#define printf(fm
编写高效代码(7) 减少函数调用——不要老打断我 函数是结构化程序设计的产物,它使代码更加模块化,耦合性更低,重用性更高。不过,函数调用会带来额外的开销,除了引起跳转外,还会产生额外的指令。 人都有这样的经验,做一件事情时,如果被人打断,重新再回来做这件事情,就需要一段恢复时间,如果老是被打断,那事情就没法做了。函数调用也是这样,要进行参数压栈出栈、寄存器保存、指令跳转等。多个步骤如果程序的性能要求较高,就可以将一些小的函数直接
编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性 Cache正是利用了程序、数据访问时的时间局部性和空间局部性,为了使Cache的访问效率最高,程序和数据的组织,也应该要符合这两个特性。最典型的例子就是二维数组的访问,下面就是一个二维数组:二维数组 如果a[i][j]在Cache中,那么a[i][j+1]就很可能也在Cache中,但是a[i+1][j]则不一定。于是代码这样写就不太好: for(j=0; j
编写高效代码(13) 数据对齐访问 在32位处理器中,一个int型变量占4个byte,假设这个变量i在内存中占据2、3、4、5这4个byte的位置,如下图所示。 数据非对齐存储 内核在访问这个数据时,会先将从0开始的4个byte读入到寄存器A中,再将从4开始的4个byte读入到寄存器B中,再将有效的数据拼成一个int数据,放在寄存器C中,可见,这种访问效率是多么的低下啊,如果变量i存储在从0开始的4个byt
编写高效代码(12) 优化内存访问——别让包袱拖垮了你 从理论上看,每条运算指令的执行时间都很短,大多数指令一个Cycle就能完成,很多时候还能一个Cycle执行多条指令,可是实际上,执行指令只是处理器要做的很少一部分工作,处理器还要从存储器中取指令,从存储器中将数据导入到寄存器中,等算完后,再将结果存入到存储器中。 处理器运算的速度像兔子赛跑一样快,但是存储器的访问速度像乌龟走路一样慢,而且越是远离内核的存储器,访问速度越慢。
编写高效代码(11) 尽量减少分支 我们在介绍处理器时,已经知道了,现在的处理器都是流水线结构,if和switch等语句会带来跳转,而跳转会打乱流水线的正常执行,影响程序的执行效率。 下面这段代码,把奇数赋一个值,把偶数赋一个值,可以用这种方式实现: [cpp] view plaincopyprint?for(i=0; i { if(i%2 == 0) {
编写高效代码(9) 减少处理器不擅长的操作——不要逼我做我不喜欢的事情 尺有所短,寸有所长,每种处理器都有自己擅长与不擅长的操作。 在与处理器配套发布的指令集手册中,都会描述每个指令的执行周期,单周期指令是处理器最喜欢的,不仅执行时间短,而且利于流水线执行。加、减、逻辑运算等,常常是单周期指令,乘、除、分支指令、浮点指令、内存存取操作等,常常需要较多的时钟周期。我们在编程时,就应该少使用执行时间长的指令。 Q:这些复杂指令都有它的用
《大话处理器》Cache一致性协议之MESI Cache一致性协议之MESI 处理器上有一套完整的协议,来保证Cache一致性。比较经典的Cache一致性协议当属MESI协议,奔腾处理器有使用它,很多其他的处理器都是使用它的变种。单核Cache中每个Cache line有2个标志:dirty和valid标志,它们很好的描述了Cache和Memory(内存)之间的数据关系(数据是否有效,数据是否被修改),而在多核处理器
OC、OD、线与、线或、推挽概念 一.什么是OC、OD集电极开路门(集电极开路 OC 或源极开路OD)open-drain是漏极开路输出的意思,相当于集电极开路(open-collector)输出,即ttl中的集电极开路(oc)输出。一般用于线或、线与,也有的用于电流驱动。open-drain是对mos管而言,open-collector是对双极型管而言,在用法上没啥区别。开漏形式的电路有以下几个特点:1.利用
C语言宏与单井号(#)和双井号(##) C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP) /do{ i
strtok()和strtok_r() 下面的说明摘自于最新的Linux内核2.6.29,说明了strtok()这个函数已经不再使用,由速度更快的strsep()代替/** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*//** stupid library routines.. The optimized versions sh
Android.mk文件详解介绍 Android.mk 编译文件是用来向 Android NDK描述你的 C,C++源代码文件的, 这篇文档描述了它的语法。在阅读下面的内容之前,假定你已经阅读了 docs/OVERVIEW.TXT 文件,了解了它们的脚色和用途。一、概述 一个 Android.mk file 用来向编译系统描述你的源代码。具体来说: (1) 该文件是GNU Makefile的一小部分,会
git使用详细介绍 1. Git概念 1.1. Git库中由三部分组成 Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git目录位于工作目录内。1) 工作目录:用户本地的目录; 2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,G
Android Boot Loader Android Boot loader 的 code 在 bootable/bootloader/lk 底下, LK 是 Little Kernel 的缩写, 是 andriod bootloader 的核心精神.入口函数在 kernel/main.c 中的 kmain(), 以下就来读读这一段 code.view plaincopy to clipboardprint?
MCR和MRC MCR指令的格式为:MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2MCR指令用于将ARM处理器寄存器的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常,其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作。源码寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄存器指令示例
嵌入式ARM CPU协处理器讲解 三星公司ARM11 CPU采用ARM核版本ARM1176JZF-S, 基于ARM V6体系架构,ARM11包括CP14和CP15协处理器,关于ARM11的协处理CP14和CP15的详细介绍请参看文档《ARM1176JZF-S Technical Reference Manual》,ARM官方网http://infocenter.arm.com/help/index.jsp?topic=/com.a
Android 开发之 ---- bootloader (LK) LK 是 Little Kernel 它是 appsbl (Applications ARM Boot Loader)流程代码 ,little kernel 是小内核小操作系统。 LK 代码 在 bootable/bootloadler/lk 目录下 LK 代码结构 +app // 应用相关
vboot完全解读 上半个月在学习bootloader,突然找到了一个非常好的vboot,vboot只有最基本的内核引导功能(基于s3c2440,从nand flash启动),对其深入研究后,发现对bootloader有了比较全面的理解,虽然没有像uboot那么多功能,但vboot已经实现了bootloader最核心的功能,其他像什么网络功能、烧写功能等等也只是一些裸机驱动而已。学习bootloader需要有汇编的基
嵌入式系统开发:C语言中的位结构体 在嵌入式开发中,经常需要表示各种系统状态,位结构体的出现大大方便了我们,尤其是在进行一些硬件层操作和数据通信时。但是在使用位结构体的过程中,是否深入思考一下它的相关属性?是否真正用到它的便利性,来提高系统效率?下面我将进行一些相关实验(这里以项目开发中的实际代码为例):1.位结构体类型设计[cpp] view plaincopyprint?//dat
__attribute__((packed))详解 1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。例如:在TC下:struct my{ char ch; int a;} sizeof(int)
Android高通平台处理器间通讯驱动 高通平台AP与CP直接通信由Share Memory负责,这是一块两端可以同时操作的内存区域。由于高通平台Modem占主导作用,在Application Processor启动初始化时,从Share Memory区读取已经由Modem predeclared的一些数据。Share memory根据功能,分为静态+动态部分,每个部分又分为数个小区,每个区的大小不一,与本区实现的功能相关。Mode
linux下i2c接口的电容触摸屏驱动开发 原文地址: http://hi.baidu.com/god_sperm/blog/item/2aaac228e8a1ece8e7cd400a.html电容触摸屏2011-01-14 15:36 1.Kconfig文件 增加宏定义 2.Makefile文件 增加编译处理 3.添加程序源码Touch screen
电容屏原理 电容屏 电容技术的触摸屏是一块四层复合玻璃屏,如下图所示。玻璃屏的内表面和夹层各涂有一层ITO导电层,最外层是只有0.0015毫米厚的矽土玻璃保护层。内层ITO作为屏蔽层,以保证良好的工作环境,夹层ITO涂层作为检测定位的工作层,在四个角或四条边上引出四个电极。电容屏基本工作原理的最初想法是:人是假象的接地物(零电势体),给工作面通上一个很低的电压,当用户触摸屏幕时,手指头吸收走一
关于汇编ARM指令DCD 数据定义( Data Definition )伪指令数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。— DCD ( DCDU ) 用于分配一片连续的字存储单元并用指定的数据初始化。3、 DCD(或DCDU)语法格式:标号 DCD (或 DCDU ) 表达式DCD (或 DCDU )伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初
汇编中AREA和ENTRY理解 1、AREA 语法格式: AREA 段名 属性1 ,属性2 ,…… AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如:|1_test| 。 属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下: — CODE 属性:用于定义代码段,默认为
xargs——维基百科 xargs是一条Unix和类Unix操作系统的常用命令。它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。例如,下面的命令:rm `find /path -type f`如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。find /path -type f -print0 |
gcc -I -L -l区别 gcc -I -L -l区别我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:例:gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld上面这句表示在编译hello.c时
Linux下静态库与动态库的使用 Linux下静态库与动态库的使用Linux下有静态链接库和动态链接库两种,静态链接库的后缀名是.a,动态链接库的后缀名是.so,下面详细介绍:静态链接库:静态链接库是指程序在编译链接的过程中就把依赖的库插入到程序中,这样程序的运行就不需要这些库的支持,但缺点是文件变大,下面以一个例子介绍如何制作静态链接库:有add.c和mul.c两个文件,分别实
objdump命令的使用 objdump命令的使用objdump命令是Linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以ELF格式可执行文件test为例详细介绍:objdump -f test显示test的文件头信息objdump -d test反汇编test中的需要执行指令的那些sectionobjdump -D tes
readelf命令的使用 readelf命令的使用readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍:readelf -v显示版本readelf -h显示帮助readelf -a test显示test的全部信息readelf -h test显
硬断点和软断点的区别 硬断点--break point软断点--assert简单的解释:硬件断点:硬断点需要硬件寄存器提供支持,断点的数目受Embedded ICE中的Watchpoint数目的限制,但是可以在任何地方设置断点。软件断点:软件断点通过在运行起来的程序中设置特征值实现,其数目不受限制,但是一般情况下软件断点只能在可写的存储器的地址中设置(比如:RAM),而不能在ROM(比如:Flash)中