嵌入式系统分层(转自电子发烧友)

一、嵌入式系统的分层与专业的分类。 嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。 1、硬件层,是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件 层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但 硬件平台是基础,增值还要靠软件。 硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C语言。 2、 驱动层,这部分比较难,驱动工程师不仅要能看懂电路图还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导 至其它任务不能动行,不懂操作系统内核架构和实时调度性,没有良好的驱动编写风格,按大多数书上所说添加的驱动的方式,很多人都能做到,但可能连个初级的 驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不 就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几编,不是太容易成功的,但其工资在嵌入式系统四层中可 是最高的。 驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞,除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通了解。 3、操作系统层,对于操作系统层目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工 程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP操作系统是微软投入300人用两年时间才搞定 的,总时工时是600人年,中科院软件所自己的女娲Hopen操作系统估计也得花遇几百人年才能搞定。因此这部分工作相对来讲没有太大意义。 4、应用层,相对来讲较为容易的,如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环 境有相应的变化而已。如果涉及Jave方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌 入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于SIP、H.323、Astrisk)方面又较为复杂, 并且有难度了。

关于冯.诺伊曼架构和哈佛架构

         典型的冯.诺伊曼架CPU是x86的CPU。pc机cpu在运行的时候程序是存储在RAM即内存中的,需要运行的程序从硬盘、U盘等外存读取加载进内存中供CPU高速运行(CPU不可能从外存中直接读取指令),所以程序和数据都是放在内存中的。取指令和取操作数都在同一总线上,通过分时复用的方式进行的。缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。 而大多数单片机等嵌入式系统则是存于flash中,flash逐步取代较古老ROM。单片机的程序是固化在flash中,cpu运行时直接从flash中读取程序,从RAM中读取数据。即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。 哈佛总线技术应用是以DSP和ARM为代表的。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指令和取操作数,从而大大提高了运算能力。它们都有独立的程序地址总线(PAB),数据地址读总线(DRAB)和数据地址写总线(DWRB)。

关于ADS V1.2开发环境

从开始用freescale 的CodeWarrior起到这个ADS V1.2 ,一直认为这个开发环境做得不好。有几个问题。 1.当make完之后在xx.o文件报错有不明物体,双击这条error, 它没帮你定位到xx.c里。以至于你还得打开xx.c CTRL+F,找出这个不明物体。这很烦,有时候会觉得这个编译器很无语。 2.ADS V1.2的工程管理不能靠边?dock,至今没找到这个功能。。以至于窗口管理乱糟糟的。    

嵌入式开学-先认识硬件

这里使用的是TQ2440开发板,CPU 一般运行在400M的时钟频率。核心板载有两片Hynix(海力士,又叫现代内存)256Mb的SDRAM合64MB的内存,256MB SAMSUNG 的Nand flash,2MB 的Eon(宜扬) 的Nor flash。 首先,Nor flash 和 Nand flash 的区别? Nor flash的有自己的地址线和数据线,操作以字为单位,可以采用类似于memory的随机访问方式,在nor flash上可以直接运行程序,所以nor flash可以直接用来做boot,采用nor flash启动的时候会把地址映射到0x00上。类似于计算机内BIOS的存放位置。 Nand flash是IO设备,类似于计算机的硬盘,数据、地址、控制线都是共用的,需要软件区控制读取时序,更无法挂在ARM的程序空间,所以不能像nor flash、内存一样随机访问,不能EIP(片上运行),因此不能直接作为boot。一般Nand flash 用来存储系统程序,系统上电后由Nor flash中的BootLoader将系统加载进RAM中的可执行地址中运行,然后跳到主程序中运行。(这有点像冯.诺伊曼架构,程序和数据都在RAM中)。Nand flash在读取数据量较大的成块数据时,速度较快。

基于Altera FPGA的 摄像头+LCD DIY

        前些日子买了个大家玩得很火的OV7670来玩玩,由于之前没玩过摄像头,也听说不带FIFO的摄像头采集起来是那么困难,所以就买了个不带FIFO的来尝尝鲜。后来看了资料才知道,一幅QVGA的图像按320*240*2Byte来算,也要153.6KB内存,对单片机来说是一比不小的开销。更何况单片机的速率才多少M,就按50M主频来说,捕捉一个8M左右的像素时钟也是相当困难的。当然后面也用STM32F103ZET6来尝试捕捉了一下,结果也是不尽人意。 考虑到时钟的捕捉,当然是用FPGA的硬件电路来实现才是王道了。又想想摄像头和液晶屏的初始化也是相当麻烦的,如果也用硬件电路来实现,那写起代码来就是一大串了,而且改起来也不方便。于是乎,脑子里一直存在的一个想法在这里就能得到真正的应用和实现了。那就是MCU与FPGA结合的方案。手上正有一款Altera 的EP2C8Q208C的开发板。那么我们的DIY就开始了。           首先要准备的东西就是 一个OV7670摄像头,一块TFT液晶屏,一块FPGA核心板。使用Nios II做为主控MCU会使你的DIY简洁很多。系统主要的结构就如下:           一个Nios II MCU,一个VGA转8080并口的模块VGA_8080,一个MCU与VGA_8080模块分别对LCD控制的总线切换模块。模块分工,MCU负责初始化液晶屏和OV7670。 VGA_8080负责OV7670的VGA输出时序转换成LCD的16bit的8080并口时序 。由于我的LCD是320*240的,所以我们只 使用QVGA输出,并且LCD使用的是565的像素格式,我们也将OV7670配置成565像素格式,这样能够使我们的编程方便很多。 我们的主要任务分为以下几块:1.nios ii MCU的搭建; 2.nios ii软件程序的编写;3.fpga硬件代码的编写。 一、NIOS ii MCU搭建可参考《NIOS ii 那些事儿》,硬件上要求板子上带有SDRAM, 否则内存不够会很麻烦。等系统整体编译通过后可以把代码写入flash当中,这样每次掉电后开机就能直接运行了。主要配置一个LCD的控制口,SDRAM的控制口,OV7670的SCCB控制口。这里有几个注意点:1.FPGA的双向口处理,由于SCCB的SIOD数据口是双向的,所以在配置时要配置成双向口,画顶层Pin时也要用bidir。2.本来液晶屏的数据口也是双向的,但是在FPGA内部没有三态门,按顶层那样的连接无法实现双向,要实现的话只能通过将IO口引出来,再把IO口连接到其它pin脚输入,不过这样很麻烦,就省了,LCD代码中要改动LCD读数据的部分。(不知道各位还有什么好办法能实现内部的双向口?) 二、然后就是LCD代码,和OV7670初始化代码的移植,之前都是在STM32上跑的,想办法把它们移植到NIOS ii当中,基本上只需修改IO口读写部分的代码就行了。 三、关键部分就是FPGA硬件上实现 OV7670的QVGA时序到液晶屏读写时序的转换。Bus_Switcher就是个2选一的多路选择器,负责切换LCD的控制总线。在主MCU初始化液晶屏和OV7670之后,就把液晶屏的控制总线交给VGA_8080控制模块,直接将OV7670的QVGA时序写入到液晶屏的GRAM当中,这样显示的帧频就能达到很高,画面非常流畅。在后期设计中可以再设置一个存储器,将图片保存下来。这里仅仅实现的摄像头信号的高速显示。这里的代码基本上可达到要求了,还有些小细节要优化,后期还可以添加一系列按钮调整OV7670的各种参数,非常之方便。 module VGA_8080(iclk, rst_n, XCLK, HREF, VSYNC, PCLK, C_DATA, LCD_CS, LCD_WR, LCD_RD, LCD_RS, LCD_RST, LCD_DATA); input rst_n; input iclk; // camera IO; output XCLK; input HREF, VSYNC,
Read More »