嵌入式系统项目报告.docx
《嵌入式系统项目报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统项目报告.docx(11页珍藏版)》请在冰豆网上搜索。
![嵌入式系统项目报告.docx](https://file1.bdocx.com/fileroot1/2023-3/1/cfa15100-6433-4115-8b89-d59cef7168de/cfa15100-6433-4115-8b89-d59cef7168de1.gif)
嵌入式系统项目报告
嵌入式系统项目报告
项目名称:
基于DM3730的Android系统
启动进程分析和Logo移植
1.项目开发目的
本次项目研究和开发的要紧目的如下:
(1)基于DM3730处置器研究Android系统的启动进程及其要紧流程;
(2)基于Android系统的启动流程init进程深切明白得。
(3)移植Android系统启动进程中的Logo和相关动画;
(4)修改Android系统的指定桌面,让系统启动后直接跳入自己的开发的应用程序。
2.项目开发内容
本次项目需要完成的要紧内容有如下几点:
(1)在上下载Android专用源码,完成Android系统的软件开发环境的搭建;
(2)在EVM37x开发板上搭建Android系统的硬件开发环境;
(3)Android系统的init进程和文件简单解析;
(4)Android系统启动的动画和Logo的修改;
(5)Android系统桌面源码的修改,实现直接调入自己的应用程序。
3.项目开发软硬件设备
(1)硬件平台:
TI高性能处置器DM3730,TI核心开发板EM/AM37xxEVM板
(2)操作系统:
Android(3)PC端的开发平台:
(4)开发所需的IDE:
TI集成开发环境
4.项目开发流程
项目开发前期预备
Android源码下载和编译
本项目是在Ubuntu宿主机上完成Android源码的下载和编译。
在此之前需要完成以下工作,要紧包括各类Android开发所需的插件,编译时所需的基础库和开发调试的minicom终端等。
sudoadd-apt-repository"deblucidpartner"
sudoadd-apt-repository"deb-srclucidpartner"
sudoapt-getupdate
sudoapt-getinstallgit-coregnupgsun-java6-jdkflexbisongperflibsdl-devlibesd0-devbuild-essentialzipcurllibncurses5-devzlib1g-devminicomtftpduboot-mkimageexpect
sudoupdate-java-alternatives-sjava-6-sun
repoinit-u-minit-u-msync
./.repo/repo/reposync–local-only
下载Android源码的进程和命令:
Android源码的编译:
包括环境变量的设定,x-loader、u-boot、LinuxKernel和Android文件系统。
环境变量:
x-loader编译:
u-boot编译:
makeCROSS_COMPILE=arm-eabi-distclean
makeCROSS_COMPILE=arm-eabi-omap3_evm_config
makeCROSS_COMPILE=arm-eabi-
LinuxKernel编译:
makeARCH=armCROSS_COMPILE=arm-eabi-distclean
makeARCH=armCROSS_COMPILE=arm-eabi-omap3_evm_android_defconfig
makeARCH=armCROSS_COMPILE=arm-eabi-uImage
Android文件系统编译:
整个系统编译进程约3个小时左右,占用空间达12G,因此对PC机的要求较高。
Android文件系统制作:
到此为止,整个Android系统的各个部份都编译和制作完成。
EVM板硬件环境的搭建
那个地址说的硬件开发环境的搭建,主若是指将上述编译好的Android系统所需的xloader、u-boot、Linuxkernel和文件系统镜像通过tftp协议下载到Linux的NandFlash上去。
利用如下命令进行镜像文件的烧录:
OMAP3_EVM#tftp0xMLO
OMAP3_EVM#nanderase0x00x50000
OMAP3_EVM#nandecchw2
OMAP3_EVM#nandwrite0x0x00x50000
通过以上要紧内容,顺利完成项目开发所需的软硬件开发环境的搭建,为后续项目的顺利进行打下了良好的基础。
Android启动init进程和文件的解析
Android中的内核启动后,kernel会启动第一个用户级别的进程:
init,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)以后,就通过启动一个用户级别的进程,完成系统的引导。
init始终是第一个进程,位于/sbin/init下面。
而是init进程启动读取的第一个文件,该文件时一个配置Android系统所需要启动的效劳和相关Android应用程序最初始化的配置。
因为它与Android启动的界面有直接的联系,因此为了项目的顺利进行,有必要先对其进行明白得和熟悉。
分析init进程需要结合进行,在那个地址要紧通过度析部份代码,做合理的说明。
Init进程的源代码位于Android源码的system/core/init/下面,由于代码过于庞大那个地址不在粘贴。
1.uevent进程
if(!
strcmp(basename(argv[0]),"ueventd"))
returnueventd_main(argc,argv);
那个函数是掏出argv中的第一个参数,比如/sbin/ueventd,那么basename为ueventd。
android系统第一次启动的进程名init,因此该函数ueventd_main不执行,该函数的真正执行在init启动serviceueventd/sbin/ueventd后,fork出一个子进程,execve启动/sbin/ueventd后,事实上该函数是对init的符合链接,也确实是ueventd进程执行起来后执行的代码仍是中的main,因此不同的进程名会去执行相同的main函数。
ueventd_main函数的要紧功能:
在Linux系统中此刻都利用uevent机制来治理设备的热插拔事件,给用户空间权利来完成一些设备文件节点的创建。
这种机制是成立在socket的通信机制上,用户空间和内核驱动进行交互,详细的机制没有去了解过。
是的版本中经常使用的机制。
比如驱动显现device_create等时,会向用户空间报告一个uevent事件,用户空间由uevent进程解析后去创建设备节点。
的解析
INFO("readingconfigfile\n");
init_parse_config_file("/");
是一个配置文件,内部有许多的语言规那么,所有语言会在init_parse_config_file中进行解析。
挪用流程如下init_parse_config_file—>read_file—>parse_config.
parse_config(源代码略)。
通过对那个文件的解析,会启动Android的应用程序,使得Android进入Java的世界。
Android启动Logo和动画移植
在那个地址要紧对Android系统的3个画面进行移植,一是Linux内核在启动加载Frambuffer帧缓冲驱动时会挪用一个函数完成Linux的Logo图标的显示。
二是Android的第一个init用户进程启动会挪用函数完成一个图片的显示。
三是Android系统中Java应用程序启动时显示出来的动画成效bootanimation。
Android启动第一个Logo图标移植
Android系统是基于Linux内核设计而成的,Linux下利用帧缓冲(Framebuffer)的概念来表示一个显示接口,通俗明白得就表示一块LCD。
帧缓冲区的相关驱动在内核启动时挪用fbmem_init,在该函数中要紧完成利用register_chrdev来注册了一个名称为fb的字符设备,最后挪用函数class_create在/sys/class目录下创建了一个graphics目录等。
一样的驱动加载中会挪用硬件平台相关LCD的驱动初始化函数omapfb_init。
那个函数会针对对个fb,完成相关节点的创建在/dev/graphics/fb0,fb1...等。
主设备号为29一旦完成创建,会挪用fb_notifier_call_chain,函数通知操纵fb的console(明白得为操纵台).每一个fb都会对应于一个console来操纵。
而Logo的显示启动,确实是在fbcon_init和fbcon_switch中来完成的。
在fbcon_init中利用fbcon_prepare_logo函数预备需要显示的Logo数据源,在fbcon_switch利用fb_show_logo来显示Logo。
本项目中需要将一张Jpg的图片作为Logo样式的图标显示在LCD上面。
实现的步骤如下:
1.为了能让这部份的Logo图标能够正常显示,需要在编译时必然的配置:
CONFIG_FRAMEBUFFER_CONSOLE
CONFIG_LOGO
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
完成这些配置以后的Logo才能够正常显示,不然内核在启动驱动加载时,显示Logo图标的函数可不能执行相关的操作。
图标的格式转换。
Linux启动图标格式不直接支持jpg格式,要紧支持ppm、pbm格式的图像文件,因此需要先将图像进行适当的转换:
1)利用gimpimage软件随意修改图片的像素大小
2)利用终端命令完成convert
3)利用如下命令完成最终的转换(被转换的文件必需是png格式)
#pngtopnm>
#pnmquant224>
最终生成一张格式的图像文件。
完成图片的预备工作后,需要修改部份Linux内核的源码,具体的操作如下进行:
a.对Makefile文件做必然的修改
添加如下内容:
obj-$(CONFIG_LOGO_ICS_CLUT224)+=logo_ics_clut224.
b.对等源文件做必然的修改
添加如下内容:
#ifdefCONFIG_LOGO_ICS_CLUT224
logo=&logo_ics_clut224;始化操纵台。
init进程在启动的时候,会解析内核的启动参数(保留在文件/proc/cmdline中)。
若是发觉内核的启动参数中包括有了一个名称为“”的属性,那么就会将那个属性的值保留在字符数组console中。
如此咱们就能够够通过设备文件/dev/来访问系统的操纵台。
若是内核的启动参数没有包括名称为“”的属性,那么默许就通过设备文件/dev/console来访问系统的操纵台。
若是能够成功地打开设备文件/dev/或/dev/console,那么就说明系统支持访问操纵台,因此,全局变量have_console的就会被设置为1。
b.显示第二个开机画面。
显示第二个开机画面是通过挪用函数load_565rle_image来实现的。
在挪用函数load_565rle_image的时候,指定的开机画面文件为INIT_IMAGE_FILE。
INIT_IMAGE_FILE是一个宏,概念在system/core/init/文件中,如下所示:
#defineINIT_IMAGE_FILE"/"
图像文件保留的第二个开机画面的图像格式是565rle的。
rle的全称是run-lengthencoding,翻译为游程编码或行程长度编码,它能够利用4个字节来描述一个持续的具有相同颜色值的序列。
在rle565格式,前面2个字节顶用来描述序列的个数,而后面2个字节用来描述一个具体的颜色,其中,颜色的RGB值别离占5位、6位和5位。
c.制作文件。
预备一张png格式的文件,利用Ubuntu自带的图片转换工具执行如下命令:
convert-depth8rgb:
利用android编译后的rgb2565工具,在android/out/host/linux-x86/bin目录下(android为当前源码所在目录),转换命令如下:
rgb2565-rle<>。
通过以上步骤就完成了代码的移植和图片的制作,最后只需要将文件拷贝到Android的文件系统下面,从头启动就能够够看到图片的正常显示。
Android启动第三个动画移植
考虑到第三个启动的动画位于Android的Java层,因此代码量相当庞大,因此只写如何替换启动动画来实现咱们预期的成效。
第三个开机画面是由应用程序bootanimation来负责显示的。
应用程序bootanimation在启动脚本中被配置成了一个效劳,如下所示:
.servicebootanim/system/bin/bootanimation
usergraphics
groupgraphics
disabled
oneshot
应用程序bootanimation的用户和用户组名称别离被设置为graphics。
注意,用来启动应用程序bootanimation的效劳是disable的,即init进程在启动的时候,可不能主动将应用程序bootanimation启动起来。
当SurfaceFlinger效劳启动的时候,它会通过修改系统属性的值来通知init进程启动应用程序bootanimation,以即能够显示第三个开机画面,而当System进程将系统中的关键效劳都启动起来以后,ActivityManagerService效劳就会通知SurfaceFlinger效劳来修改系统属性的值,以即能够通知init进程停止执行应用程序bootanimation,即停止显示第三个开机画面。
Android的所有版本都能够添加一个文件。
内容包括part文件夹和。
前者的文件夹下面寄存的是持续的png格式文件,后者里面是播放信息设置,其内容和格式如下:
48072015
p10part1
p00part2
其中480800是指显示的分辨率宽和高,15是图像播放的帧数。
p后面的数字别离指播放次数0和播放时刻。
Android系统启动时会文件系统如下目录查找:
#defineUSER_BOOTANIMATION_FILE"/data/local/"
#defineSYSTEM_BOOTANIMATION_FILE"/system/media/"
只需要将制作好的动画文件放到指定的目录即可实现自己设计的美观的动画以替换默许的开机画面。
到此为止,完成项目所需完成的要紧内容:
移植完成了三个动画来替换系统自带的图片,使得产品能够实现加倍友好的用户界面,提高产品的销量。
Android桌面移植
这部份的内容主若是完成Android系统启动桌面进程的移植,目的是讲那个默许的桌面进程修改成自己所设计的应用进程,使得用户在利用Android终端设备是能够直接进入自行设计的应用操作界面。
既然是移植桌面系统,那么需要修改的确实是桌面的源码,阅读Android系统庞大的源码,能够发觉Android源码的Home应用程序确实是Launcher进程。
Android系统中的应用程序安装好了以后,SystemServer组件接下来就要通过ActivityManagerService来启动Home应用程序Launcher了,Launcher在启动的时候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展现在桌面上,如此用户就能够够利用这些应用程序了。
既然作为Home应用程序有如此的优先级,那他的特点确实是在文件中指定了如下内容:
name=""/>
name=""/>
name=""/>
name=""/>
这几句代码,使得系统能够检索到该应用程序时Home应用程序,因此那个地址咱们能够直接将这部份代码去除,而在自己设计的Android应用程序文件中指定如上内容,那么就能够够完成Home应用程序的替换,也确实是第一个启动在LCD上的是自己设计的应用程序。
另一方面,在调试时发觉系统的锁屏应用程序并无被禁止掉,因此需要做如下源码的修改:
在/frameworks/base/policy/src/com/android/internal/policy/impl中的函数全局变量mExternallyEnabled=true变成false,如此就能够够再任何情形下,其他app或着显示超时刻,可不能再去自动锁屏。
如此通过以上的所有内容,使得整个Android系统从Linux内核启动到Android第一个init进程启动,再到进入Java的世界、启动第一个Home程序,都修改成了项目所需要实现的任务和功能,对产品的自主化打下了良好的基础。
5.项目开发总结
整个界面移植项目的顺利完成,使得对Android系统的启动有了加倍深刻的了解和应用,对熟悉嵌入式系统的开发和移植有专门大的帮忙。
对Android应用程序的开发和调试加倍的熟练。
整个项目的开发有较强的客户需求,能够使得终端设备界面加倍美观,进一步提高产品的销售量,符合嵌入式系统设计和运营的理念。