嵌入式3D-嵌入式3D开发环境的建立-嵌入式linux系统

    由于毕业设计所要进行的是3D图像的开发,那么就必须有一个高效,稳定,安全,可移植性强的嵌入式操作系统,有考虑到我们是一般学生用户,所以也要经济实惠。因此我选择的嵌入式操作系统是Linux。Linux具体的优势主要在以下几方面。
   随着微处理器的产生,价格低廉、结构小巧的 CPU 和外设连接提供了稳定可靠的硬件架构,那么限制嵌入式系统发展的瓶颈就突出表现在了软件方面。尽管从八十年代末开始,陆续出现了一些嵌入式操作系统,比较著名的有 Vxwork、pSOS、Neculeus 和 Windows CE。但这些专用操作系统都是商业化产品,其高昂的价格使许多做低端产品的小公司望而却步;而且,源代码封闭性也大大限制了开发者的积极性。另外,结合国内实情,当前国家对自主操作系统的大力支持,也为源码开放的 LINUX 的推广提供了广阔的发展前景。 还有, 对上层应用开发者而言,嵌入式系统需要的是一套高度简练、界面友善、质量可靠、应用广泛、易开发、多任务,并且价格低廉的操作系统。在不久的将来,从冰箱到收音机都会内置处理器。
   Linux 系统的架构决定他可靠,安全,稳定,高效的特点:
   
   因为 Linux 的开放性,许多人认为 Linux 非常适合多数 Internet 设备。他们认为 Linux 可以支持不同的设备,支持不同的配置。Linux 对厂商不偏不倚而且成本极低,能够很快成为用于各种设备的操作系统。如今,业界已经达成共识:即嵌入式 Linux 是大势所趋,其巨大的市场潜力与酝酿的无限商机必然会吸引众多的厂商进入这一领域。
   嵌入式操作系统主要有 Palm OS, Windows CE, EPOC, LinuxCE, QNX, ECOS,LYNX,高端嵌入式系统要求许多高级的功能,如图形用户界面和网络支持。很多高端 RTOS供应商已经提供了这些功能,但其价格也很高端,一般人难以接受。微软的 Windows CE 也有此类功能,却不具备大多数嵌入式系统要求的实时性能,而且难以移植,也曾经有人想以 DOS 为基础用单独的第三方工具拼凑一个系统,但这种努力将是白费。现在需要的是一个便宜、成熟并且提供高端嵌入式系统所必须特性的操作系统,嵌入式 Linux 操作系统以价格低廉、功能强大又易于移植而正在被广泛采用,成为新兴的力量,所以,众多商家纷纷转向了嵌入式 Linux。
   Linux 为嵌入操作系统提供了一个极有吸引力的选择,它是个和 Unix 相似、以核心为基础的、完全内存保护、多任务多进程的操作系统。支持广泛的计算机硬件,包括 MOTOROLA,X86,Alpha,Sparc,MIPS,PPC,ARM,NEC 等现有的大部分芯片。软件源码全部公开,任何人可以修改并在 GNU 通用公共许可证(GNU General Public License)下发行,这样,开发人员可以对操作系统进行定制,再也不必担心像 Microsoft Windows 操作系统中“后门”的威胁。同 时由于有 GPL 的控制,大家开发的东西大都相互兼容,不会走向分裂之路。Linux 用户遇到问题时可以通过 Internet 向网上成千上万的 Linux 开发者请教,这使最困难的问题也有办法解决。Linux 带有 Unix 用户熟悉的完善的开发工具,几乎所有的 Unix 系统的应用软件都已移植到了 Linux 上。Linux 还提供了强大的网络功能,有多种可选择窗口管理器(X windows)。其强大的语言编译器 gcc、g++等也可以很容易得到。不但成熟完善、而且使用方便。
  总的来说,嵌入式系统选择 Linux 的原因:
  可应用于多种硬件平台。Linux 已经被移植到多种硬件平台,这对受开销、时间限制的研究与开发项目是很有吸引力的。原型可以在标准平台上开发然后移植到具体的硬件上,加快了软件与硬件的开发过程。
  Linux 可以随意地配置不需要任何的许可证或商家的合作关系。 唯一的限制是开发者必须做出对 Linux 社区有益的改动。
  它是免费的,源代码可以得到。这是最吸引人的。毫无疑问,这会节省大量的开发费用。
  微内核直接提供网络支持,而不必象其他操作系统要外挂 TCP/IP 协议包。
  Linux 的高度模块化使添加部件非常容易。
  Linux 在台式机上的成功,也保证了 Linux 在嵌入式系统中的辉煌前景。
  Linux 是一种很受欢迎的操作系统,它与 UNIX 系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式系统领域。
  Linux 是一个自由开放的世界,在 Linux(无论 PC 还是嵌入式系统)上进行软件开发都可以在广袤的网络资源中获取帮助。

1.移植u-boot
在移植Linux之前,我们需要先移植嵌入式Linux的装载系统,这相当于我们PC机上的BIOS。嵌入式Linux装载系统有很多个开源项目,u-boot, ppcboot,bootloader,reboot等等,综合考虑之后,决定移植u-boot。
我使用的u-boot版本是1.1.2。
下面是移植的主要过程。
1).修改u-boot代码(如果有必要的话)
如果你纯粹为了更新u-boot,而不用对u-boot的一些属性的进行定制的话是不用修改源码的,直接编译就可以了。
我这次由于要修改内核的长度和ramdisk的起始地址,所以进行了  u-boot-1.1.2/include/configs/pxa270.h  文件的修改,当然其他板子的话要修改对应的文件,我主要修改了以下属性:
/*modified FLASH_RAMDISK_START  0x001a0000  to 0x001c0000*/
#define FLASH_RAMDISK_START     0x001c0000
/*modified FLASH_KERNEL_LEN  0x00160000  to 0x00180000*/
#define FLASH_KERNEL_LEN        0x00180000

2).编译代码
#先清除原来的编译
make distclean
#对不同的开发板进行配置
make pxa270_config
#然后
make
编译后会生成u-boot.bin 这就是我们要烧写到flash的u-boot文件,配置启动tftp服务,把它拷贝到tftpboot目录下。
3).minicom下进入u-boot
使用minicom连接板子,启动板子后,当出现u-boot的启动信息:
start linux now(y/n):
按空格或者回车就可以进入u-boot控制台。

4).去除扇区保护
在一些比较新的版本的u-boot里,会有扇区保护,烧写之前必须去掉保护,要获知有无烧写保护可以用通过查看u-boot新息命令
=>flindo
输出如下:
Bank # 1: INTEL 28F128J3A
  Size: 16 MB in 128 Sectors
  Sector Start Addresses:
    00000000 (RO) 00020000      00040000      00060000      00080000
    000A0000      000C0000      000E0000      00100000      00120000
    .........
    .........
(RO)表示保护
=> protect off 1:0
输出如下:
Un-Protect Flash Sectors 0-0 in Bank # 1
..
---------------------[说明]--------------------------
 保护和去除保护的命令如下:
protect on 1:n--m
protect off 1:n--m
这里的n和m的值为flash芯片128个扇区中整数 0,1,2,…… 126, 27) n < m 。参数m可以省略, 略m表示对指定的扇区执行操作,1 是protect函数执行的判断条件,如果是0就不执行相关操作。
另外还可以设置或取消u-boot的所有保护:
=>protect on all
=>protect off all
--------------------------------------------------------

5).烧写
=> protect off 1:0
=> tftp a0008000 u-boot.bin
=> fl 0 a0008000 20000
输出如下:
start_sect=0x0,end_sect=0x0
************erase sector 0x0***********
----------program sector 0x0---------
然后重新设置扇区保护
=> protect on 1:0

reset一下,启动系统引导成功的话就可以了。

2. Linux-2.6.10到PXA270上的移植
Linux 移植过程中内容非常多,涉及的知识量也很大,而且由于平台的不同,和内核版本的不同所涉及的内容往往也有很大不同。针对不同的版本和硬件系统,需要修改内核源码。由于我使用的是开发板商配带的Linux内核源码,基本的驱动和针对PXA270的内核源码已经有了,所以下面主要介绍配置交叉编译和调试烧写过程。
2.1 内核的交叉编译
2.1.1 配置
首先我要针对PXA270的硬件特性进行配置内核,其次,由于我进行的嵌入式3D开发,涉及到嵌入式GUI,嵌入式文件系统的相关支持,所以也要对相应的特性进行配置,下面是配置的一些基本过程。
在内核源码的目录执行shell命令
[root@MagicLinux linux-2.6.10]# make menuconfig
此时在shell的终端会出现linux的配置菜单。嵌入式linux内核的配置的原则是尽量减少不必要的属性,这样可以减少内核的大小,节省有限的嵌入式存储空间。我主要配置下面的属性:
针对PXA270的属性编译进内核
System Type -> ARM system type (PXA2xx-based) -> (X) PXA2xx-based  
System Type -> Intel PXA2xx Implementations -> Select target board (Intel HCDDBBVA0 Development Platform) -> (X) Intel HCDDBBVA0 Development Platform

配置linux装载系统u-boot的装载地址
General setup -> (0x0) Compressed ROM boot loader base address -> 0x0
General setup -> (0x0) Compressed ROM boot loader BSS address  -> 0x0

配置命令行字符串为
General setup -> (root=/dev/ram initrd=0xa0800000,0x400000 mem=64M init=/linuxrc console=ttyS0,115200) Default kernel command string
存储系统设置。由于3D开发库和嵌入式GUI开发库比较大,所以我要移植jffs2 文件系统,作为辅助文件系统,所以我要配置相关的支持,特别是 CFI Flash device in physical memory map  这一项,配置的是文件系统在内存中的映像。
Memory Technology Devices (MTD) -> <*> Memory Technology Device (MTD) support
Memory Technology Devices (MTD) -> [*]   MTD partitioning support
Memory Technology Devices (MTD) -> RAM/ROM/Flash chip drivers -> <*> Support for Intel/Sharp flash chips
Memory Technology Devices (MTD) -> Mapping drivers for chip access -> <*> CFI Flash device in physical memory map
                (0x5c0000) Physical start address of flash mapping
                 (0xa40000) Physical length of flash mapping 
                 (2)   Bank width in octets
Memory Technology Devices (MTD) -> Mapping drivers for chip access -> <*> CFI Flash device mapped on ARM Integrator/P720T

配置ramdisk根目录文件系统的支持。开发板是以ramdisk作为根目录文件系统的,所以要在内核里配置相关的支持
Block devices -> <*> RAM disk support
    (16)  Default number of RAM disks
    (8192) Default RAM disk size (kbytes)
    [*]   Initial RAM disk (initrd) support

网络配置。由于3D开发过程中,需要用到nfs等网络协议对程序进行调试,所以要在内核中编译相关的网络支持。有一点比较特别的是我所移植的嵌入式GUI,Qt-embedded 需要本地socket的支持,所以内核必须配置这个特性,否则qt-embedded程序无法在linux上运行。
Networking support -> [*] Networking support
Networking support -> [*] Network device support
Networking support -> Networking options -> <*> Packet socket
         <*> Unix domain sockets   #这一项对Qt-embedded很重要
         [*] TCP/IP networking
         <*> IP: TCP socket monitoring interface

配置文件系统
File systems -> <*> Second extended fs support
   <*> Ext3 journalling file system support
   <*> Kernel automounter support
   <*> Kernel automounter version 4 support (also supports v3)
File systems -> Miscellaneous filesystems -> <*> Journalling Flash File System v2 (JFFS2) support
File systems -> Network File Systems -> <*> NFS file system support
        [*] Root file system on NFS

配置frame buffer。frame buffer 是嵌入式GUI和OpenGL 3D的必须设备,所以一定要配置
Graphics support -> [*] Support for frame buffer devices
Graphics support -> <*> PXA LCD framebuffer support

到此为止,内核配置基本完成。至于其他配置,还要看开发过程中的需要。
2.1.2 编译内核,执行以下shell命令
make clean
make zImage
编译好后就生成一个名为zImage的内核文件。
2.2 调试内核
由于很多时候我们要根据需要配置内核,然后编译,然后想看看效果,这时候不需要急着每次都去把内核和文件系统都烧写进开发板上的flash,flash有一定的寿命,烧写多了就容易出现坏块,这时候我们就要使用tftp来调试内核和文件系统。u-boot上是有tftp客户端的。我们只需把linux内核映像拷贝到fttp的共享目录/tftpboot,在u-boot启动时利用minicom进入它的控制后台,设置好serverip等环境变量,然后执行
tftp a0008000 zImage   #内核映像
tftp a0800000 ramdisk.image.gz #ramdisk文件系统映像
这样就把内核和文件系统下载到了SDRAM里面,tftp后面的是载入到SDRAM地址映射,必须和u-boot的配置是一样的。其实这个时候跟u-boot把内核和文件系统从flash载入是一样的。
然后我们执行
go a0008000
内核就启动调试了。这样就不用平凡烧写内核到flash了

2.3 烧写内核及文件系统
内核和文件系统的个中属性调试好后,我们最终要把内核和文件系统烧写到flash上,基本过程也是把内核和文件系统映像利用tftp下载到SDRAM上,然后用u-boot的 fl 命令烧写到flash上
tftp 0xa0008000 zImage
fl 0x40000 0xa0008000 0x180000
tftp a0800000 ramdisk.image.gz
fl 0x1c0000 0xa0800000 0x280000

烧写成功后,内核移植基本完成。嵌入式3D的关键一步算是完成了。

Copyright (C) duwchy, Please give source when reprint.

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页