camera调试基础

1、camera如何调试? Camera的接口如下: 1.VSYNC2.HSYNC3.PWDN4.RESET5.AGND6.SCL7.SDA8.DVDD189.DOVDD2810.MCLK11.PCLK12.DGND13.DATA0-DATA714.IOVDD2815.GND 看sensor的spec来调试。 1)莫尔条纹(彩带) 从技术角度上讲,莫尔条纹是两条线或两个物体之间以恒定的角度和频率发生干涉的视觉结果,当人眼无法分辨这两条线 或两个物体时,只能看到干涉的花纹,这种光学现象就是莫尔条纹。莫尔条纹现象是由于信号取样频率接近感光器分辨率所致,通常解决方法用一个低通滤镜把高于 感光器分辨率的信号挡住,其副作用就是降低成像分辨率。因此在设计低通滤镜时设计师要在分辨率和莫尔条纹之间做一个妥协选择。因为D70的CCD前面使用 效果比较弱的低通滤镜,所以在提高成像分辨率也造成了莫尔条纹出现机率的增大,此现象也广泛出现于其他DSLR上。 推荐解决方法:避免拍摄场面有接近相机分辨率的规则性图案,或者后期通过软件去除。 "水波纹"的现象、banding或者是fliker,如下图所示: 关于你反映的手机对着日光灯preview时有类似"水波纹"的现象, 现解释如下: 这个现象叫做banding或者是fliker,主要是由于日光灯的频率 和曝光时间而引起的。我们已经避免了在室内正常情况下(不对着日光灯的情况) 没有banding的现象。但是对着日光灯时,banding现象是无法完全消除的。 这种现象属于正常的。2)对比度过大导致颜色更艳,有偏红。 3)中间亮,四周暗:shutting不够。 4)暗处噪声大:调gamma。 5)镜头能够影响分辨率和清晰度。 6)preview 和capture 时存在的坏点是由于sensor自己产生的。一般主要是亮的坏点。 OV2640在Fxxxx上通过取2.0M(1600*1200)sensor处理后输出给sunplus556(800*600)来减小坏点。 7)高低亮度动态范围太小。导致高亮时过曝,低亮图片亮度不够。(ov9655)解决方法:(会使图片变的模糊.模糊的原因是因为使用的镜头的mtf数值太小,模组整体高度太低造成的.要彻底解决这个问题,只有更换更好的镜头才行.)修改gamma:60 7A2c60 7B C60 7C 1960 7D 2860 7E 4060 7F 4b60 80 5660 81 6060 82 6760 83 7060 84 7a60 85 8960 86 9560 87 AF60 88 C860 89 DF 8)预览低亮度拍照目标效果不佳,需要改善。(ov9655)解决方法:增加gain:60 142e 9)预览低亮度拍照目标会出现闪烁,请调整。(ov9655)解决方法:(亮度的调整需要时间,所以亮度会闪几下)固定fps:60 3b0c 10) preview和capture的不一致:(ov9655)我们preview使用的是vga的模式,capture使用的是sxga的模式.两个模式切换过程中要进行亮度计算,这个计算是将sensor的增益转化成曝光时间.由于这两种实现亮度的方式有差别,所以preview和capture一定存在差异.我们的调试就是让这种差异尽量的小. 11)preview中有跳动的感觉.(ov9655)从亮到暗和从暗到亮的变化中,sensor的调整需要时间.在这个时间中,vsync一直有输出,所以可以看到这个问题.(主要是坏帧的问题)现在的修改是调整过程中的vsync不输出,所以看不到这个问题了. 12)在暗处切换夜景和自动后,回到正常光线preview不停的闪动。(ov9655) For 9655 night mode: night:0x3b,0xcc normal:0x3b,0x0c0x2d,0x000x2e,0x00在夜间模式的时候是会自动变桢率的,sensor会自动调整0x2d,0x2e的数值来变桢率.切回自动的时候要将这两个寄存器清零,不然它们还是夜间模式里面的数值. 13)Fxxxx的颜色不够鲜艳目前最新的版本发灰。这个应该是图象的数据分布有问题,范围窄(我看下来32以下的数据很少),而cxxxxx的数据分布比较宽。另外,我们和LCDC(sunplus)调整颜色是对者标准色板来调试的。其实Cxxxx的颜色反而是有些失真的。建议:必须需要isp做black levelcaliberation,让响应曲线过零点。 如果没有,看看有没有Y_offset,Y_contrast可以动动的。 14)亮度不够。从分析来看,平均亮度在128+/-10范围之内了,曝光控制是正常的。可能是因为图象发灰导致看上去亮度不够建议:解决第一条可能这条也解决了。 15)暗光下噪点大。暗光对sensor的要求高。任何sensor的噪声都要变大。对于30万象素的手机,主要还是看屏上的效果,虽然噪声大了点,但屏小 ,所以不明显。重点应该在提升其他方面,使preview的效果更好。 16)夜景下比Cxxxxxx噪点大。微带发绿。大部分sensor都会在暗处发绿和亮处发红,但应该在一个可接受的范围之内。原因:红绿蓝三个颜色的响应曲线是非线形的,在做白平衡时候靠简单的线形处理无法将三根曲线进行重合。手机DSP能力毕竟不能够和数码相机的能力相比。如果把暗光颜色很准,那么可能正常下颜色就不够鲜艳或者亮处颜色不准,或者噪声大等其他更加严重的状况出现。我觉得现在的状况还不算离谱。17)数字影像测试总评· 白平衡检测(White Balance) 白平衡差异(White Balance)影响数字相机的色彩表现甚钜,虽然大多数的数字相机自动白平衡(AUTOWB)都能应付一般的拍摄状况。不过, 若将白平衡误差 更进一步以(K)色温来区分,则误差普遍存在于各厂家的设定之中。ColorChecker 特别针对白平衡部分设计了图块检测,标示 (1) 为原始摄影图块、标示(2)则为理想的 ColorChecker HSV值合并运算曝光之表现以及标示 (3) 原始 ColorChecker 理想值,以 HSV 和 K 两种系统显示白平衡的误差比值。 · 镜头光衰减(Light FallOff) 采用多重镜片组合设计的镜头,镜片材质、形状,或多或少都会影响光线路径和光量大小;不同于色像差,Light Falloff 主要是判别自镜头中央 起至整幅画面边缘位置于拍摄均匀光线下所产生的光差。理想镜头于均匀光线下,自中心到边缘的光分布应为相同,但实际上却不容易做到,形成许多摄影人员口中的『暗角』现象。 光衰减检测,可以看出镜头中心到边缘影像光线不均匀分布的情形 优良的镜头设计下,人眼几乎难以辨认 Falloff 的发生。但在电脑或专业仪器的辅助下,镜头的光衰减却相当明显。理想的光衰减检测,可透过 Labsphere 或 Electro-Optical Industries(EOI) 产生球状均匀光线(模拟自然状态下三维空间之均匀光线产生),例如:Labsphere 出品的 USS-1200 或 USS-1200V;实际上,一般的检测也可以透过大面的素色板(或墙壁),借着散焦方式取得均匀光线进入相机之中,再利用相关的电脑软件取得对应的数据。 · 影像器材数据化量测综合评量 今日的影像器材效能检测已经是一门相当科学且专业化的科目,一般摄影玩家较难负担如此复杂且昂贵的测试器材,而必须仰赖媒体或公正第三者提供相关测试报告。为了方便大家快速且有效的认知器材性能,多数评量都集中『解像力』和『色彩』表现上。然而,实际上,影响影像品质的因素不单只是镜头和 CCD 而已,甚至包括许多外在的人为因素。 附注:人为因素的影响在测试报告中很难被发现,多数的专业媒体理当避免人为影响其最终测试结果。 影响数字相机 测试表现的因素,也往往是许多业余摄影者常犯的错误。例如:1. 相机是否固定于稳定的三角架(反光镜是否锁起);相机机身是否会晃动影像画质2. 相机与测试标的距离是否恰当3. 相机是否正确与测试标的完成对焦; 对焦选择是否正确、对焦点是否位于正确中心4. 影像格式和压缩比是否正确选择(RAW格式是否可以选择) ; 过高的压缩比或过低的解析度,同样影响画质的表现5. 环境 Gamma 值的选择 ; 环境亮度影响画质清晰表现甚钜6. 清洁工作是否确实 ; 无论镜头表现、UV滤镜、保护镜,甚至于相机内之CCD / CMOS 等,沾染上灰尘等,都将影响后续的测试值7. 镜头的设定 ; 测试标的是否位于有效的景深内(镜头之光圈和焦长是否正确设定); 测试 DSLR 最好可以选择定焦镜头8. 光线的位置 ; 直射光线易造成测试标的的反光,影响判别。 · 亲身体验 因此,数据化的测试报告,虽有助于你了解相机的性能表现,却不一定让你在操作上得心应手。一架具备完善操作设计的消费型数位相机,未必一定输给 DSLR。『尽信书,不如无书!』,实际走访体验你心目中的影像器材,辅之你网路或是平面上阅读到的测试报告,将更具说服力。18)我多次拍摄白纸的照片.一般在刚进入preview时,马上拍摄会出现严重偏红或者偏蓝等. OV:因为自动曝光和自动白平衡在preview开始前会有一个初始值得设置,在进入preview后,曝光和白平衡自动调节开始,调节过程的长短与初始设置和实际环境间的差异相关。改变初始值可以使在某一特定环境下的调节时间最短,但对其他条件,还是要视环境差异的大小而定。 通过提高preview的桢率可以缩短调节的时间,或者可以使用跳桢的方法使此现象减轻。LCDC(Sunplus):这个以前我们调过,但是AWB初始化速度太慢,没有效果。 但是你可以通过流程来控制,让开始的几帧不要显示在屏幕上,即让那个等待界面时间长一些,将preview的前几帧不要显示。 19)ov7670在对着窗外一会(亮处),再转换到室内(暗处)这时候调节亮度特别慢或者preview全黑不能恢复。这个问题是因为LCDC(sunplus)在进入preview时没有完全给ov7670初始化,而是只在手机开机初始化一次,以后只是更改少部分寄存器。后来更改为进入preview时就初始化一次寄存器就可以了。 2、stack栈和heap堆的关系? 一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放5、程序代码区—存放函数体的二进制代码。二、例子程序这是一个前辈写的,非常详细//main.cppint 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 ncludevoid 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],cl11: 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是色差信号。/fF: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的运算。
发布了116 篇原创文章 · 获赞 11 · 访问量 21万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章