当前位置:   article > 正文

驱动工程师面试_c驱动初级工程师面试问题

c驱动初级工程师面试问题
2、stack栈和heap堆的关系?
 

一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)—   由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) —   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区  —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
二、例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。

2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数 据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总 之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。


2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。

2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

2.6存取效率的比较

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#i nclude
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。


2.7小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

 

下面是另一篇,总结的比上面好:

堆和栈的联系与区别dd

   在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。

    首先,我们举一个例子:

    void f() { int* p=new int[5]; }

    这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:

    00401028  push        14h

    0040102A  call        operator new (00401060)

    0040102F  add         esp,4

    00401032  mov         dword ptr [ebp-8],eax

    00401035  mov         eax,dword ptr [ebp-8]

    00401038  mov         dword ptr [ebp-4],eax

    这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?澳,错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。

    好了,我们回到我们的主题:堆和栈究竟有什么区别?

    主要的区别由以下几点:

    1、管理方式不同;

    2、空间大小不同;

    3、能否产生碎片不同;

    4、生长方向不同;

    5、分配方式不同;

    6、分配效率不同;

    管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak

    空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:   

    打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。

注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。

    碎片问题:对于堆来讲,频繁的new/delete势 必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。

    生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

    分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

    分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

    从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。

    虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。

    无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)

     对了,还有一件事,如果有人把堆栈合起来说,那它的意思是栈,可不是堆,呵呵,清楚了

 
 
3、进程和线程的关系。
解释一:
        Linux是一个多用户、多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未 执行完一个任务时又执行另一项任务。在操作系统设计上,从进程(Process)演化出线程(Thread),最主要的目的就是更好地支持多处理器,并且 减小(进程/线程)上下文切换的开销。

进程和线程的关系

根据操作系统的定义,进程是系统资源管理的最小单位,线程是程序执行的最小单位。线程和进程十分相似,不同的只是线程比进程小。

首先,线程采用了多个线程可共享资源的设计思想。例如,它们的操作大部分都是在同一地址空间进行的。其次,从一个线程切换到另一线程所花费的代价比进程低。再次,进程本身的信息在内存中占用的空间比线程大。

因此,线程更能允分地利用内存。线程可以看作是在进程内部执行的指定序列。线程和进程的最大区别在于线程完全共享相同的地址空间,运行在同一地址上。

Linux线程的定义

线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。在两个普通进程(非线程)间进行切换时,内核准备从一个进程的上下文切换到另一个进程的上下文要花费很大的开销。

这里上下文切换的主要任务是保存老进程CPU状态,并加载新进程的保存状态,用新进程的内存映像替换老进程的内存映像。线程允许进程在几个正在运行的任务之间进行切换,而不必执行前面提到的完整的上下文。

在Unix类系统中,曾经出现过一些不同线程标准,它们都支持可移植操作系统接口标准POSIX(Portable Operating System Interface Standard)。

POSIX 标准由IEEE制定,并由国际标准化组织接受为国际标准。POSIX 1003.1c是一个用于线程(在一个程序中当前被执行的代码段)的标准,以前是P1993.4或POSIX.4的一部分,这个标准已经在1995年被 IEEE通过,归入ISO/IEC 9945-1:1996。

本文介绍线程主要是针对POSIX线程,即Pthread,因为Linux 对它的支持最好。相对进程而言,线程是一个更加接近于执行体的概念,它可以与进程中的其它线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。在串行 程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。

也可以将线程和轻量级进程(LWP)视为等同,但其实在不同的系统/实现中有不同的解释。LWP更恰当的解释可能为一个虚拟CPU或内核的线程,它可以帮助用户态线程实现一些特殊的功能。Pthread是一种标准化模型,它用来把一个程序分成一组能够同时执行的任务。
解释二:
 进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序, 系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分 配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。 

        在Mach、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。

线程概念 

         线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的 子任务之一。例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程。假设用户要从数据库中产生一份工资单报表,并 传到一个文件中,这是一个子任务;在产生工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。这样,操作系统则把每一个请求――工资单 报表和新输人的数据查询表示为数据库进程中的独立的线程。线程可以在处理器上独立调度执行,这样,在多处理器环境下就允许几个线程各自在单独处理器上进 行。操作系统提供线程就是为了方便而有效地实现这种并发性 

引入线程的好处 

(1)易于调度。 

(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 

(3)开销少。创建线程比创建进程要快,所需开销很少。。 

(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。 

进程和线程的关系 

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 

(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 

(3)处理机分给线程,即真正在处理机上运行的是线程。 

(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
 
4、硬件I2C和软件I2C的对比。

用软件实现和硬件实现基本上没有区别,可以把多个不同种类的器件加到一个双线结构上,只是要注意:

1.  注意软件产生的时序要满足i2c协议要求,就是那些AC参数,具体情况和MCU种类,速率等有关; 因为指令延时的关系,可能无法达到要求的通讯速率,但可以很接近;

2. 作为SDA总线的I/O端口在转换输入和输出方向时,要注意满足总线协议,当器件较多时要使用一个外部上拉电阻;

3.如果使用带有扩展地址字节的存储器和一般的I2C器件在同一总线中,注意不要产生协议上的冲突;

 解释二:

I2C(发音为:”I squared see”)能用于替代标准的并行总线,能连接的各种集成电路和功能模块。对于嵌入式系统设计者来说,有以下好处:

·        更少的管脚连接,也就不需要并行总线接口。

·        由更少的管脚连接带来的更小的电路规模。

·        更少的电路板层数和更少的电路连线。

·        由于I2C支持多主控,所以更容易调试。

支持I2C的设备有微控制器,A/D、D/A转换器,储存器,LCD控制器,LED驱动器,I/O端口扩展器以及实时时钟。

通过使用内建的I2C接口硬件或者连接到微控制器标准并行总线的外部I2C控制芯片,微控制器能够连接到I2C总线。任选其中一种方式,通过通常的 I/0管脚和软件上的“位拆裂(bit-banging)”技术,你就能实现一种软件I2C接口。这种方式比较慢,比以硬件为基础的实现要复杂的多。

I2C的性能

标准I2C总线传输速率可以到100Kbit/s,通过使用了7位地址码,就能支持128个设备。加强型I2C总线用了10位地址码(能够支持1024个设备),快速模式(400Kbit/s)和高速模式(最高有3.4Mbit/s)。

I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存。

只要很小的电路附件,I2C总线就能够支持设备在不同电平下工作(例如:3.3伏和5伏),

I2C总线的工作情况

I2C总线的规范中规定了如何在两个设备之间传递数据,采取的方法是总线仲裁、时钟同步和总线的电气特征。

在一次数据传输中,一个设备扮演临时主控器,开始在它和一个有单一地址设备(从控器)之间的传输。主控器为数据传输产生时钟信号。规范中要求数据线(SDA,串行数据线)只有在时钟(SCL,串行时钟线)处于低平时才能变化。

总线的一次典型工作流程如下:

1.开始:信号表明传输开始。

2.地址:主设备发送地址信息,包含7位的从设备地址和1位的指示位(表明读或者写,即数据流的方向)。

3.数据:根据指示位,数据在主设备和从设备之间传输。数据一般以8位传输,最重要的位放在前面;具体能传输多少量的数据并没有限制。接收器上用一位的ACK(回答信号)表明每一个字节都收到了。传输可以被终止和从新开始。

4.停止:信号结束传输。

I2C的仲裁

在向那些只有一个主设备(典型的是主微控制器)的基本系统中不会有仲裁的。然而,更多的复杂系统能够有多个主控设备,因此,就有必要用某种形式的仲裁来避免总线冲突和数据丢失。

通过用线与(开路基极)连接I2C总线的两路信号(数据和时钟)可以实现仲裁。所有的主设备必须监视I2C的数据和时钟线,如果主设备发现已经有传输正在进行,它就不会开始传输了。

有很小的几率会产生一下情况:有两个或更多的设备同时发出“开始”信号。在这种情况下,相互竞争的设备自动使它们的时钟保持同步,然后像平常一样继续发射信号。

第一个检测到自己发送的数据和总线上的数据不匹配的设备要失去仲裁能力。这种情况会在这时发生:当前述设备发送一个高电平时,而同时另一个主控设备也正在发送一个低电平。也许直到相互竞争的设备已经传输了许多字节后,仲裁才会完成。

因为没有数据丢失,仲裁处理是不需要一种特殊的仲裁相位的。获得主控权的设备从本质上来说,是不知道它为了总线而和其它设备竞争的。

在一个以硬件为基础的I2C中,有关发送、同步和仲裁的细节是自动处理的,不用你操心。如果你计划实现一个软件驱动的多主控I2C接口,那你需要研究I2C详细规范(study the I2C specification in detail),并懂得其细微差别,

 
5、待机电流、底电流。
 

通常在测待机电流出现异常时,要先打开某个功能,然后离开,等待手机进入待机状态,然后再测试待机电流。

比如开机->进入待机->打开照相机->关闭照相机->待机->测待机电流

要一个功能一个功能去验证,看看是否因为没有真正关闭某个功能而导致待机电流很大

 
 

有一个基站的参数是BS_PA,它的设定值为2到9,设为X;

一个单位周期为一个复帧,51*5000*12/13=0.235S

每 X*0.235 手机将会醒过来,与基站同步。

还有一点很重要,X的不同,测出来的待机电流相差也很大的。

 
 
那是不是说如果PR为2的话,那么手机每0.47S与基站同步一次,也就是0.47秒搜网一次吧。
比较我以前测的数据。推测联通是paging 2,移动是paging 8
实际测联通卡的搜网间隔是470mS,测移动卡的搜网间隔是1.89秒,
算出来的是0.235*2=0.47S,0.235*8=1.88S都非常吻合,现在明白了,谢谢!
 
 
经常碰到这种波形,往往是闹钟啊,记事本呀等等定时启动。
与基站联络时的波形为周期性2A脉冲的波形,前面已经提到周期的计算方法不累诉。
叫MMI的查查,很容易的,先关掉与RTC有关的模块,往往就正常了。
 

正常的情况下,很多RF模块大概1秒钟和基站通信一次,所以一秒钟会有个高脉冲,至于连续10秒的脉冲,这是对应的RF模块有关,一个稳定的RF模块是没有这个情况出现的,你可以测试一下其他平台,
手机RF部分最小电流一般有1mA,平均下来差不多3mA,当然这和不同的手机RF模块有关

 
 

我从软件来简单分析下待机电流问题:

1、所谓待机电流就是bb cpu主动降低cpu运行时钟,如果原来高速运行是26M的话,那么在待机的情况下

 可能就是几k,这样,整个系统io都关闭,系统只是非常慢的处理一些待机程序。

2、有人说到卡不同,待机电流不同,这是由于手机软件在待机的情况下,要每隔段时间搜索网络,如果网络信号好的话,

  搜索快,电流就小,如果网络信号不好,就慢,同时耗电流就大。

4、所谓的搜网间隔时间,在手机系统中一般是比较固定的,因为对整个系统的时间片要求比较严格。

3、地域不同引起的电流不同同2一样,与网络信号有关。

 
 
 
 
6、BB和LCDC的通信。16位通过发命令和数据通信。
 
I80总线即80总线。
 
7、sensor的数据格式YUV和RAW data RGB的区别。
 
解释一:
 
RGB是三基色,一般每个象素点用24表示,RGB个占8位。YUV中Y为亮度分量,UV为色度分量,YUV有好几种格式,相比RGB,YUV可以减少数据量。对于黑白电视,只需要使用Y分量即可,因而YUV可以兼容黑店电视。
 
RGB和YUV都是色彩空间,用于表示颜色,两者可以相互转化.至于电视采用YUV分量形式是由ITU(国际电信联盟)规定的,因为其能减少数据储存空间和数据传输带宽,同时又能非常方便的兼容黑白电视!
 
首先,200万象素的sensor,就是有2M个pixel;
    YUV是电视传输用的名词,一个亮度信号(Y),两个色差信号(U分量、V分量)
    YUV (亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL)。YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与 RGB视频信号传输相比,它最大的优点在于只需占用极少的带宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或 Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜 色。“亮度”是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面—色调与饱和度,分别用Cr和CB 来表示。其中,Cr反映了GB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。 


     在现代彩色电视系统中,通常采用三管彩色摄像机或彩色CCD(点耦合器件)摄像机,它把摄得的彩色图像信号,经分色、分别放大校正得到RGB,再经过矩阵 变换电路得到亮度信号Y和两个色差信号R-Y、B-Y,最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这就是我们常用的YUV色彩空 间。 

    YUV (YCrCb)和4:2:2, 4:1:1, 4:2:0
  是指亮度信号Y和红/蓝色差信号的抽样格 式. 在dv中, ntsc是4:1:1, pal采用4:2:0. 注意, 4:2:0并非蓝色差信号采样为0,而是和4:1:1相比,在水平方向上提高1倍色差采样频率,在垂直方向上以Cr/Cb间隔的方式减小一半色差采样.
 
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
  而与我们电脑相关的地方,就是目前的显示器大都是采用了RGB颜色标准,这就是为什么它对我们来说这么重要了。
  在显示器上,是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的,目前的电脑一般都能显示32位颜色,约有一百万种以上的颜色。如果说它所显示的颜色还不能完全吻合自然界中的某种色彩的话,那已经几乎是我们肉眼所不能分辩出来的了。 

RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好象有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。

  有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在软件中设定颜色就容易理解了.

  红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。
  红、绿、蓝三个颜色通道每种色各分为255阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色。
 
解释二:

       YUV和RGB是两种不同的颜色空间。一般来说,用YUV的话,可以节省存储空间,且对视频编解码有利。不过LCD直接接收的格式基本都是RGB的,在DSP或者类似控制器里面有专门的YUV到RGB的转换电路。

 
解释三:
RGB是由YUV进行矩阵计算得到的,其效果要比S端子和CVBS好很多.是目前电脑显示器上主要用的视频接口(VGA),但毕竟还是模拟信号,所以以后 的主流都是TMDS(最小差分信号传输)信号的DVI接口和HDMI接口.毕竟数字才是未来吗,呵呵...而这些接口之间有些是可以很轻松的进行转换的, 所以使用的时候我们根据需要可以进行必要的改进.
 
解释四:
RGB三基色信号,YUV是色差信号。
/f
F:fK;h_X 如果是摄像机输出,RGB三基色信号可以比YUV色差信号清晰度高,UV信号一般经过压缩。‑s*B"N;S p5t nKIg 如果是卫星机输出,RGB三基色信号和YUV色差信号清晰度一样,只是信号方式不一样。
 
解释五:
RGB   颜色模式   
    虽然可见光的波长有一定的范围,但我们在处理颜色时并不需要将每一种波长的颜色都单独表示。因为自然界中所有的颜色都可以用红、绿、蓝(RGB)这三 种颜色波长的不同强度组合而得,这就是人们常说的三原色原理。因此,这三种光常被人们称为三基色或三原色。有时候我们亦称这三种基色为添加色 (Additive   Colors),这是因为当我们把不同光的波长加到一起的时候,得到的将会是更加明亮的颜色。把三种基色交互重叠,就产生了次混合色:青(Cyan)、洋 红(Magenta)、黄(Yellow)。这同时也引出了互补色(Complement   Colors)的概念。基色和次混合色是彼此的互补色,即彼此之间最不一样的颜色。例如青色由蓝色和绿色构成,而红色是缺少的一种颜色,因此青色和红色构 成了彼此的互补色。在数字视频中,对   RGB   三基色各进行   8   位编码就构成了大约16.7万种颜色,这就是我们常说的真彩色。顺便提一句,电视机和计算机的监视器都是基于   RGB   颜色模式来创建其颜色的;     
  Lab   颜色模式   
    Lab   颜色是由   RGB   三基色转换而来的,它是由   RGB   模式转换为   HSB   模式和   CMYK   模式的桥梁。该颜色模式由一个发光率(Luminance)和两个颜色(a,b)轴组成。它由颜色轴所构成的平面上的环形线来表示颜色的变化,其中径向表 示色饱和度的变化,自内向外,饱和度逐渐增高;圆周方向表示色调的变化,每个圆周形成一个色环;而不同的发光率表示不同的亮度并对应不同环形颜色变化线。 它是一种具有“独立于设备”的颜色模式,即不论使用任何一种监视器或者打印机,Lab   的颜色不变。     
  HSB   颜色模式   
    从心理学的角度来看,颜色有三个要素:色泽(Hue)、饱和度(Saturation)和亮度(Brightness)。HSB   颜色模式便是基于人对颜色的心理感受的一种颜色模式。它是由   RGB   三基色转换为   Lab   模式,再在Lab   模式的基础上考虑了人对颜色的心理感受这一因素而转换成的。因此这种颜色模式比较符合人的视觉感受,让人觉得更加直观一些。它可由底与底对接的两个圆锥体 立体模型来表示,其中轴向表示亮度,自上而下由白变黑;径向表示色饱和度,自内向外逐渐变高;而圆周方向,则表示色调的变化,形成色环。     
  YUV   颜色模式   
    这是电视系统中常用的颜色模式,即电视中所谓的分量(Component)信号。该模式由一个亮度信号   Y   和两个色差信号   U、V   组成。它是利用了人眼对亮度信号敏感而对色度信号相对不敏感的特点,将   RGB   颜色通过亮度信号公式Y=039R+050G+011B转换为一个亮度信号   Y   和两个色差分量信号   U(R-Y)、V(B-Y),即对色差信号进行了频带压缩。毫无疑问,这是以牺牲信号的质量为代价的。     
  CMYK   颜色模式   
    这是彩色印刷使用的一种颜色模式。它由青(Cyan)、洋红(Magenta)、黄(Yellow)和黑(Black)四种颜色组成。其中黑色之所以 用   K   来表示,是为避免和   RGB   三基色中的蓝色(Blue,用B表示)发生混淆。该种模式的创建基础和   RGB   不同,它不是靠增加光线,而是靠减去光线,因为和监视器或者电视机不同的是,打印纸不能创建光源,它不会发射光线,只能吸收和反射光线。因此通过对上述四 种颜色的组合,便可以产生可见光谱中的绝大部分颜色了
 
解释六:
在Camera Sensor中,最常用的YUV模型是 YUV422格式,因为它采用4个字节描述两个像素,能和RGB565模型比较好的兼容。有利于Camera Sensor和Camera controller的软硬件接口设计。
 
解释七:http://dearymz.blog.163.com/blog/static/2056574200741774122887/

自然界的颜色千变 万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领域中为了更好更准确的满足各自的需求,就出现了各种各样的色彩空间模型来量化的描述颜色。我们比较常接触到的就包括 RGB /CMYK / YIQ / YUV / HSI等等。

       对于数字电子多媒体领域来说,我们经常接触到的色彩空间的概念,主要是RGB ,YUV这两种(实际上,这两种体系包含了许多种具体的颜色表达方式和模型,如sRGB,Adobe RGB, YUV422, YUV420 …), RGB是按三基色加光系统的原理来描述颜色,而YUV则是按照 亮度,色差的原理来描述颜色。

       即使只是RGB YUV这两大类色彩空间,所涉及到的知识也是十分丰富复杂的,自知不具备足够的相关专业知识,所以本文主要针对工程领域的应用及算法进行讨论。

而在Camera Sensor中,最常用的YUV模型是 YUV422格式,因为它采用4个字节描述两个像素,能和RGB565模型比较好的兼容。有利于Camera Sensor和Camera controller的软硬件接口设计。
 

进一步分析,我们可以看到,因为在手机等嵌入式运用上我们最终是要把数据转换成RGB565格式送到LCD屏上显示的,所以,对于RGB三分量来说,我们根本不需要8bit这么高的精度,为了简单和运算的统一起见,对每个分量我们其实只需要高6bit的数据就足够了,所以我们可以进一步把表格改为4个6*6的二维表格,这样一共只需要占用16K内存!在计算表格元素值的时候还可以把最终的溢出判断也事先做完。最后的算法如下:

       y = (YUVdata[Y1POS] >> 2);
        u = (YUVdata[UPOS] >> 2);
        v = (YUVdata[VPOS] >> 2);

        r = yv2r_table[ y ][ v ];
        g = yig2g_table[ y ][ uv2ig_table[ u][ v ] ];
        b = yu2b_table[ y ][ u ];
 
        RGBdata[1] =( (r & 0xF8)  |( g >> 5) );
        RGBdata[0] =( ((g & 0x1C)<< 3) | ( b >> 3) );

       这样相对部分查表法,我们增加了3次移位运算,而进一步减少了4次加法运算和6次比较赋值操作。

       在计算表格元素数值的时候,要考虑舍入和偏移等因数使得计算的中间结果满足数组下标非负的要求,需要一定的技巧。

       采用完全查表法,相对于第一种算法,最终运算速度可以有比较明显的提高,具体性能能提高多少,要看所在平台的CPU运算速度和内存存取速度的相对比例。内存存取速度越快,用查表法带来的性能改善越明显。在我的PC上测试的结果性能大约能提高35%。而在某ARM平台上测试只提高了约15%。

3.4 进一步的思考

       实际上,上述算法:

        RGBdata[1]=( (r & 0xF8)  | ( g >> 5) );
        RGBdata[0] =( ((g & 0x1C)<< 3) | ( b >> 3) );

       中的 (r & 0xF8) 和 ( b >> 3) 等运算也完全可以在表格中事先计算出来。另外,YU / YV的取值实际上不可能覆盖满6*6的范围,中间有些点是永远取不到的无输入,RB的运算也可以考虑用5*5的表格。这些都可能进一步提高运算的速度,减小表格的尺寸。

       另外,在嵌入式运用中,如果可能尽量将表格放在高速内存如SRAM中应该比放在SDRAM中更加能发挥查表法的优势。

4 RGB2YUV ?

       目前觉得这个是没法将3维表格的查表运算化简为2维表格的查表运算了。只能用部分查表法替代其中的乘法运算。

       另外,多数情况下,我们需要的还是YUV2RGB的转换,因为从Sensor得到的数据通常我们会用YUV数据,此外JPG和MPEG实际上也是基于YUV格式编码的,所以要显示解码后的数据需要的也是YUV2RGB的运算。

 
 
8、LCD的总线类型。
 
80总线,SPI总线+RGB,
 
1.YU (Touch panel)
2.XL
3.YD
4.XR
5.VCC
6.GND
7.RESET:reset pin
8.DATA0-DATA15:data bus pin
9.RD:read pin
10.WR:write pin
11.RS:register select pin
12.CS:chip select pin
13.IM0:18/16/9/8 –bit parallel switching pin
14.LED_K:LED cathode connection
15.LED_A1:power supply for LED(BLU)
 
Lcd is RGB interface:
1.YU (Touch panel,up,lefe,down,right)
2.XL
3.YD
4.XR
5.GND
6.R0-R5(RED SIGNAL 0-5)
7.G0-G5(GREEN SIGNAL 0-5)
8.B0-B5(BLUE SIGNAL 0-5)
9.SPI_CLK
10.SPI_SDI:serial data input
11.SPI_CS
12.VSYNC:Vertical synchronous for display data.
13.HSYNC:Horizontal synchronous for display data
14.VDDIO:POWER supply for I/O logic
15.LED+:B/L LED Anode
16.LED-:B/L LED Cathode
17.DE:Data Enable signal for display
18.PCLK:clock signal for display data
19.reset
 
9、按键的原理。
 
 
10、T卡的接口。
 
1.  sd_sdata0
2. sd_sclk
3.sd_scmd
4.sd_sdata3
5.vdd
6.vss
 
 
 
11、ARM的各个接口的理解和区别。
 
12、存储类器件sd等的硬件连接和软件协议理解
 
13、文件系统的理解,底层协议的编写。
 
14、编译器的工作
 
15、camera各个功能的实现方式(dsp or isp)和函数原型
 
16、lcd的硬件连接和软件接口
 
17、camera中容易出现的问题和解决方法
 
18、lcd中容易出现的问题和解决方法,例如lcd不亮我们将如何解决。
 
19、如果lcd显示的数据变斜了,是什么原因。
 
20、camera的硬件连接和软件接口
 
21、刷屏的buffer的组织。mirror
 
22、如何使用链表
Struct pnode{
*pnext;
Data;
}
23、如何用结构体实现一个数据包
Struct pack{
Int length;
Char data[1];
}
Pack xx(int length,char *data)
{
       Pack *p = NULL;
       Malloc(p);
       p.length = length;
       p->data = data;
       return p;
}
应该注意给p分配空间,以及如何释放data的空间。
24、如何用结构体实现如下32位数据的控制。
3 bit control
4 bit type
5 bit length
10 bit data
10 bit end
Struct x{
Con:3;
Type:4;
Length:5
Data:10;
End10
}
 
25、写一个函数实现挑选一个字符串内“0-9”或者“a-z”的函数。
 
26、进程和线程的关系,进程如何调度线程?
 
27、如何用嵌入式的思想优化下面的代码:
Int pcc(int a,int b)
{
   Return (a/16+b/32);
 
}
应该更改为:
Int pcc(int a,int b)
{
   Return (a>>16+b>>32);
 
}
 
28、#define dddd(a,b)  (a*b) is wrong?
 
29、对结构体内的数组如何操作?
Struct pack{
Int length;
Char data[1];
}
Pack p;
p.length =1;
int i;
for(i=0;i<10;i++)
{
  p->data++ = i;
}
Why is wrong below?
for(i=0;i<10;i++)
{
  p->data[i] = i;
}
 
30、#define addoffset(addr,field)  (*field->0)(field)
 
31、#define startAddress(addr,field) (*field-offset)
 
 
32、头文件如何定义?
 
33、对寄存器的某一位如何用code操作?set clear
 
34、对位操作时,intel 何motolona都有哪些指令。或者其他地方的指令。
 
35、如何用一行代码实现输入“1234”输出也为“1234”
Int x(int *string,int length)
{
       Int i,ret=0;
       For(i=0;i<length;i++)
       {
       Ret = ,,,,,
}
Return ret;
}
 
36、gsm,td-scdma,wcdma的协议理解
 
37、同样的硬件接口,如何使用软件区分不同的lcd?
 
38、如何管理mmi?
 
39、如何调度任务?
 
40、linux操作系统中对链表的操作,操作系统和驱动的关系
 
41、如何求一个指针的起始地址和偏移地址
 
 
 

Freescale使用的是大端系统。

Drogfly使用的是小端系统。

Pc使用的是小端系统。

如何去判断是大端或者小端系统?

定义两个char类型变量,然后附初始值,然后打trace对比看。

NAND和NOR flash的区别

 

NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR 和NAND闪存。

  相“flash存储器”经常可以与相“NOR存储器”互换使用。许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。

  NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。

NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。

  NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理和需要特殊的系统接口。



性能比较

   flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数 情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。

  由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。

  执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。

  ● NOR的读速度比NAND稍快一些。

  ● NAND的写入速度比NOR快很多。

  ● NAND的4ms擦除速度远比NOR的5s快。

  ● 大多数写入操作需要先进行擦除操作。

  ● NAND的擦除单元更小,相应的擦除电路更少。


接口差别
  NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。

  NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制、地址和数据信息。

  NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。

容量和成本

  NAND flash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。

   NOR flash占据了容量为1~16MB闪存市场的大部分,而NAND flash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、 Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。
可靠性和耐用性
  采用flahs介质时一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash是非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。
  寿命(耐用性)
  在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。
  位交换
  所有flash器件都受位交换现象的困扰。在某些情况下(很少见,NAND发生的次数要比NOR多),一个比特位会发生反转或被报告反转了。
  一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障可能导致系统停机。如果只是报告有问题,多读几次就可能解决了。
  当然,如果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。位反转的问题更多见于NAND闪存,NAND的供应商建议使用NAND闪存的时候,同时使用EDC/ECC算法。
  这个问题对于用NAND存储多媒体信息时倒不是致命的。当然,如果用本地存储设备来存储操作系统、配置文件或其他敏感信息时,必须使用EDC/ECC系统以确保可靠性。
  坏块处理
  NAND器件中的坏块是随机分布的。以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。

  NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成的器件中,如果通过可靠的方法不能进行这项处理,将导致高故障率。



易于使用
  可以非常直接地使用基于NOR的闪存,可以像其他存储器那样连接,并可以在上面直接运行代码。
  由于需要I/O接口,NAND要复杂得多。各种NAND器件的存取方法因厂家而异。
  在使用NAND器件时,必须先写入驱动程序,才能继续执行其他操作。向NAND器件写入信息需要相当的技巧,因为设计师绝不能向坏
块写入,这就意味着在NAND器件上自始至终都必须进行虚拟映射。

软件支持
  当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算法的软件,包括性能优化。
  在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。

   使用NOR器件时所需要的MTD要相对少一些,许多厂商都提供用于NOR器件的更高级软件,这其中包括M-System的TrueFFS驱动,该驱动被 Wind River System、Microsoft、QNX Software System、Symbian和Intel等厂商所采用。

  驱动还用于对DiskOnChip产品进行仿真和NAND闪存的管理,包括纠错、坏块处理和损耗平衡。

 

 

/***************************question**********************/

1.mmu的意义和作用

⑴.MMU的使用
MMU是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。 MMU通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由 MMU决定数据是在RAM内还是在大容量存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断。
MMU的两个主要功能是:
1.    
将虚地址转换成物理地址。
2.    
控制存储器存取允许。MMU关掉时,虚地址直接输出到物理地址总线。
在实践中,使用MMU解决了如下几个问题:
①使用DRAM作为大容量存储器时,如果DRAM的物理地址不连续,这将给程序的编写调试造成极大不便,而适当配置MMU可将其转换成虚拟地址连续的空间。
②ARM内核的中断向量表要求放在0地址,对于ROM在0地址的情况,无法调试中断服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。
③系统的某些地址段是不允许被访问的,否则会产生不可预料的后果,为了避免这类错误,可以通过MMU匹配表的设置将这些地址段设为用户不可存取类型。
启动程序中生成的匹配表中包含地址映射,存储页大小(1M,64K,或4K)以及是否允许存取等信息。
例如:目标板上的16兆DRAM的物理地址区间为0xc000,0000~0xc07f,ffff;0xc100,0000~0xc17f,ffff;16兆ROM的虚拟地址区间为:0x0000,0000~0x00ff,ffff。匹配表配置如下:
可以看到左边是连续的虚拟地址空间,右边是不连续的物理地址空间,而且将DRAM映射到了0地址区间。 MMU通过虚拟地址和页面表位置信息,按照转换逻辑获得对应物理地址,输出到地址总线上。
应注意到的是使能MMU后,程序继续运行,但是对于程序员来说程序计数器的指针已经改变,指向了ROM所对应的虚拟地址。

 

2。读取DMA变量和cpu共享区域变量时,应注意什么

一、关于DMA 的问答

1、问:DMA的优点是什么?
答:它有以下几项优点: 由于把CPU从多任务的环境的数据传输和单任务环境的大量数据传输解放出来了,从而明显提高了整个系统的性能可以把数据从HDD直接传输到主存而不占用很多的CPU资源 在数据传输中解放了CPU,使得CPU可以工作在多任务环境下 在多任务环境下,DMA的作用尤其显著

2、问:DMA和PIO模式有哪些不同?
答: DMA(Direct Memory Access) PIO(ProgrammedInput/Output) 在内存中建立了输出/输入描述表,还在主板中设计了总线管理芯片用以实现数据的传输按照优先次序来执行计算和数据的传输 数据的传输工作不再由CPU来完成,从而使得它可以专门去做计算工作 CPU不但要做文件的传输还要做计算,因此某些任务可能会被挂起

3、问:Ultra DMA 33是什么?
答:Ultra DMA 33是一种由Intel公司设计的同步DMA协议。Intel的PIIX4芯片组包括了这一功能。传统的IDE数据传输仅仅用于单边带的数据脉冲。Ultra DMA/33则在数据传输时使用了双边带的数据脉冲。因此,在ATA 2驱动器传输速度可以由16MB/s提高到33MS/s。

4、问:Ultra DMA 33有什么优点?
答:除了显著的性能提高之外,该协议还具有以下优点: 节省了CPU的数据传输时间;从而CPU可以不做数据传输而专门进行计算工作 提高了整个系统的性能效率;数据传输速率由16MB/secATA 2提高到33MB/sec 改善了在DMA/33模式下的ATA现存信号;IDE集线器不再需要外部信号引脚 对原先的ATA驱动器完全兼容;控制器和驱动器在每一次传输中均可使用正确的协议 即插即用;由于UltraDMA/33的兼容性,设备可以自动识别 具有检错功能;16位的CRC寄存器可以在每一个脉冲实现CRC检查 实现自动搜索以确保能够检测到所有的CD ROMs 包括了Window NT 4.0驱动程序 不必改变主板的设置

5、问:什么是SDRAM?
答: SDRAM代表同步动态随机存取内存。由于所有地址、数据和控制系统都是同步的,或者说是被控制在一个单个的系统时钟下,SDRAM可以提高到主内存的带 宽。所有的操作都和系统时钟同步,这样系统等待的状态就被消除。SDRAM简化了设计和内存-系统控制,它大大减少了安装和运行的时间。

6、问:DRAM和SDRAM有何不同?
答: DRAM: 没有系统时钟 水平行地址选通控制One-bank 运行 SDRAM: 以系统时钟运行 脉冲行地址选通控制 为单一芯片交错的两个触排可编程读延迟 问: SDRAM的优点是什么? 答: SDRAM技术使设计者能够解决带宽限制,并且提供给他们许多优点: 1.使用现存的设备技术,符合JEDEC标准 2.能够支持速度在100MHz的外部总线频率,并且在将来外部总线频率超过100MHz时,可提供一种升级的途径 3.为主内存提供一种单一的,有效的设计,合并了内存系统 4.提供了一种非专有途径来适应高速外部总线频率带宽需要  5.控制芯片组的设计被简化,因为它是基于机器运行状态而取代了以前的水平/脉冲宽度驱动

7、问:什么是ATX?
答:ATX是对Baby-AT主板结构的发展,是今天占主要地位的主板结构。它的特征有以下几点:易于使用: о 扩展插槽增多 о 重新安置的CPU使得电路的电容量利用率更高、电压更利于管理 о 减小了电路板布线的复杂度增强了对将来的I/O发展趋势的适应性: о 在统一的缓冲结构中使用了完整的算法 о 支持将来的连接和I/O标准,诸如USB、TV综合业务服务网的输 入/输出等等 减少了整个系统的消耗 о 冷却系统由单个风扇承担,而且噪音减少了

8、问:ATX规格有哪些需求?
答:它有以下几点需求: 对主板结构的限制 о 可调节的双层高度的I/O。外围设备的高度限制在3.5”和5.25”о 主板面积为12'×13' 对电源供应的限制 о 基于PS/2标准。只用一个电源就可以把±5V、±12V、3.3V和遥控电源信号合为一体о 把连向主板的线路统一固化到一个20针的接口上 о 重新放置的风扇使得风可以吹向CPU 全新的主板设计 о PCB的面积是12'×9.6',与Baby-AT结构完全不同

9、问:ATX 2.0是什么?它与ATX 1.0有那些不同?
答:在1996年十一月,Intel公司发布了最新的ATX 2.0结构规格说明:它与 ATX 1.0的主要不同有: A . 对主板上的组件高度有了限制 主板上扩展槽组件的最大高度范围为0.6”(大约1.5cm)。驱动器隔板为0.35”、1.2”和1.5”。PSU为2.8”。之所以规定了这些限制,是为了方便Intel公司的Pentium II处理器。 B . 改变了托架的位置 托架的位置稍有改变。因此,系统集成商应该注意这种改变对ATX结构的最佳M/B匹配。 C . 具有了I/O后面板和I/O外壳 ATX 2.0具有独特的底座接口,而I/O后面板外壳的设计并非独特。代而替之的是Intel公司推荐的CIS(Chassis Independent Shields)。系统集成商应该通过底座制造商、主板制造商或其他单位来得到他们最好的解决方案。   

二、微软的解释
Ultra DMA(也称作 Ultra DMA/33 或ATA/33)是对 ATA 硬盘接口的扩展,Ultra DMA就是并口的,也就是IDE口,它从理论上允许以每秒 33.3 MB 的突发速率传输数据。 这是 ATA-2/ATA-3 标准(每秒 16.6 MB)的两倍。 与 ATA-2/ATA-3 标准相比,使用 Ultra DMA 会有 40% 的性能提高。
也就是从Ultra DMA/33开始

3。进程通信的几种办法

IPC:信号量,锁,共享内存,消息队列,管道;

 进程间通信机制允许任意进程同步交换数据,其通信方式通常有无名管道、有名管道、软中断信号、共享存储区几种形式. 前3 种通信方式对于该系统来说都存在不足:无名管道的缺点是相互无关的进程不能通过无名管道通信;有名管道则不能多路复用,无法为多对通信的进程提供私有的通 道;而软中断信号,虽然任意进程间可以通过系统调用kill 发送软中断信号来通信,但所传递的消息只有软中断信号的序号,信息量较少. 使用共享存储区,则进程能够通过共享它们虚地址空间的若干部分,对存储在其中的数据进行读写,进而实现彼此的直接通信.

共享存储区的操作:
  操作共享存储区的系统调用有:SHMGET 可建立一个新的共享存储区或返回已存在的一个共享存储区;SHMAT可从逻辑上将一个共享存储区附接到一个进程的虚地址空间上;SHMDT 可从一个进程的虚地址空间断接一个共享存储区;SHMCTL 可对与共享存储区相关联的各种参数进行操纵. 进程使用与读写普通存储器一样的机器指令来读写共享存储区,所以,在附接了共享存储区以后,该共享存储区就变成了进程虚地址空间的一部分,进程就能以存取 其他虚地址一样的方法存取它,而不需要系统调用来存取共享存储区中的数据. 具体的使用方法如下面的程序段:


# include < sys/ ipc. h >
# include < sys/ shm. h >
# include < sys/ unistd. h >
# include < sys/ signal . h >
# define SHMKEY 25
# define K  1024
in shmid ;
...
void communicate (  )
{
int I ,
3
point ;
int
3
addr ,
3
addr1 ;   / / 定义共享存储区的指针
extern cleanup (  ) ;
⋯⋯
shmid = shmget (SHMKEY,2
3
K,0777| IPC CREAT) ;   / / 建立一个2 KB 的共享存储区
addr = shmat (shmid ,0 ,0) ;   / / 附接到共享存储区的地址
}

注:在Unix中实现 。

 

 

4。中断程序的特征

 

5。char a[]={2,3,4,5,6};  int b;

   b = *(char *) ((int *)a+1);  输出b =6

 

6.林锐那本书的4道内存题目,

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);  

strcpy(str, "hello world");

printf(str);

}

 

请问运行Test函数会有什么样的结果?

答:程序崩溃。

因为GetMemory并不能传递动态内存,

Test函数中的 str一直都是 NULL。

strcpy(str, "hello world");将使程序崩溃。

 

char *GetMemory(void)

{  

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();   

printf(str);

}

 

请问运行Test函数会有什么样的结果?

答:可能是乱码。

因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。

void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello");  

printf(str);   

}

请问运行Test函数会有什么样的结果?

答:

(1)能够输出hello

(2)内存泄漏

 

 

void Test(void)

{

char *str = (char *) malloc(100);

    strcpy(str, “hello”);

    free(str);     

    if(str != NULL)

    {

      strcpy(str, “world”);

printf(str);

}

}

请问运行Test函数会有什么样的结果?

答:篡改动态内存区的内容,后果难以预料,非常危险。

因为free(str);之后,str成为野指针,

if(str != NULL)语句不起作用。

 

 

 

7。下列哪个掉电后可读取变量认为是正确的。选择题,应该是eeprom,你自己查查

8。虚拟内存的作用

进程地址空间的独立性,扩大线性空间的连续行;

 

9。int a=5;int i = 6;a =(--i)*(i++);则i = 6 ,a = 25

10,提高读取数据速度的方法,选择题,好像和虚拟内存有关

DMA方式:预读取;

 

11,pv操作,修改代码的错误,这题我不会,你自己看看相关的知识

1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾恩德霍芬技术大学(Eindhoven Technical University)任数学教授。在这里,他参加了X8计算机的开发,设计与实现了具有多道程序运行能力的操作系统——THE Multiprogramming SystemTHE是艾恩德霍芬技术大学的荷兰文Tchnische Hoogeschool Eindhov –en的词头缩写。狄克斯特拉在THE这个系统中所提出的一系统方法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样一些重要的思想和概念都是狄克斯特拉在THE中首先提出并为以后的操作系统如UNIX等所采用的。为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为就绪”(ready)运行”(running)阻塞”(blocking)三个工作状态。由于在任一时刻最多只有一个进程可以使用处理机,正占用着处理机的进程称为运行进程。当某进程已具备了使用处理机的条件,而当前又没有处理机供其使用,则使该进程处于就绪状态。当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机,使之进入阻塞状态,待造成其退出运行的条件解除,再进入就绪状态。而对系统中所有同时运行的进程,在一个进程访问共享数据时,另一个进程不访问该数据)和互斥(mutually-  exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源,诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中信号灯”(semaphore,或叫信号量”)概念加以解决。所谓信号灯,实际上就是用来控制进程状态的一个代表某一资源的存储单元。例如,P1  P2是分别将数据送入缓冲B和从缓冲B读出数据的两个进程,为了防止这两个进程并发时产生错误,狄克斯特拉设计了一种同步机制叫“PV操作P操作和V操作是执行时不被打断的两个操作系统原语。执行P操作PS)时信号量S的值减1,若结果不为负则PS)执行完毕,否则执行P操作的进程暂停以等待释放。执行V操作VS)时,S的值加1,若结果不大于0则释放一个因执行PS)而等待的进程。对P1P2可定义两个信号量S1S2,初值分别为1  0。进程P1在向缓冲B送入数据前执行P操作PS1),在送入数据后执行V操作VS2)。进程P2在从缓冲B读取数据前先执行P操作PS2),在读出数据后执行V操作VS1)。当P1往缓冲B送入一数据后信号量S1之值变为0,在该数据读出后S1之值才又变为1,因此在前一数未读出前后一数不会送入,从而保证了P1P2之间的同步。我国读者常常不明白这一同步机制为什么叫PV操作,原来这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫  passeren,释放叫vrijgevenPV操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。

12,以下协议在手机的分层结构中,分别在哪层?只记得几个简单的协议,具体我也不会

      pop3,ppp,icmp,ip,udp,tcp,arp,  你查查这些吧,我不懂。

应用层:pop3,ppp

网络层:icmp,ip,udp,tcp

arp三层

 

Pop3,ppp
Icmp,tcp,udp
Ip
Arp

 

13,程序员可见的buffer,我不知道,你查查吧

        GUI-Framebuffer,
//文件系统的高速缓存;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/112227
推荐阅读
相关标签
  

闽ICP备14008679号