当然,自己现已不是电子控制器开发的新手了。从事单片机,DSP开发十多年,可是一向没有触摸过嵌入式linux。2014年头因为公司的项目需求,决议引进嵌入式linux的渠道进行产品研制,从这个时分开端正式触摸嵌入式linux,并开端在linux上进行作业。到现在差不多1年半,现在将这个进程从头整理出来,和我们一同同享,一起也给自己留一个记载。
linux操作系统文章专题:linux操作系统详解(linux不再难明)
“嵌入式linux新手入门手记”会是一个系列,记载我从第一次正式开端在linux渠道作业,到完结项目的进程中各问题的处理进程。当然,作为作业经历的记载,这个手记的系列不评论理论方面的常识,仅仅忠诚的记载问题,以及问题的处理进程和办法。
首要在这儿介绍一下我的开发渠道:TI的AM335x的渠道,硬件现已调试完结,在本手记中将不进行硬件方面的记载。首要需求的功用是:USB接口单点触摸屏,1024*768 TFT-LCD显现,GUI的用户程序完成人机交互,100M以太网,不需求3D以及图形加速,256M DDR2,256M nand,一个SD卡槽,一个RS232接口。
首要,要进行嵌入式linux开发,当然需求树立核算机的作业渠道,考虑作业的便利和功率,决议在核算机上装置独立linux系统,和window做成双引导。
2010年时用过一段时间的ubuntu,所以决议仍是运用ubuntu,在ubuntu的官网上下载32位版别的14.04(64位的系统驱动程序比较难找)。运用ubuntu引荐的Universal-USB-Installer-1.9.5.9东西,将ubuntu的装置镜像写入到一个规范的4GU盘上(规范的意思是指不要有杂乱无章的功用,可能会导致兼容性问题而无法发动ubuntu装置程序。写入时会导致U盘的内容悉数丢掉,需求先备份U盘的文件)。
在windows7的核算机办理中发动磁盘办理器,我的核算机硬盘是500G的,分为2个分区,并格局化为2个磁盘:C(190G)和D(其他空间),在磁盘办理器中对D分区进行紧缩,紧缩出100G的磁盘空间出来,对这个紧缩出来的100G空间不要做其他处理,退出磁盘办理器。
从头发动核算机并进入到BIOS中设置发动次序,使核算机可以从U盘发动。运用制造好的Ubuntu装置U盘发动核算机后,将进入到ubuntu的体会系统中,挑选装置,然后依据装置的提示进行,这儿需求留意2点,一是言语的挑选,最好在装置时挑选中文,这样防止后续设置ubuntu时显现、输入法等的问题。二是最好不要手动指定装置分区,有ubuntu装置程序主动对之前区分出来的100G空间进行办理,我的核算机装置有6G的内存,所以装置程序将100G空间区分为一个6G的交流分区,其他用于装置ubuntu。然后ubunut会问询是否和其他操作系统共存时,一定要挑选和其他操作系统共存,不然会导致装置完ubuntu后无法发动windows的问题。
ubuntu14.04的装置仍是比较智能的,根本不需求自己的其他干与,就主动装置完结了。
在装置完结后,需求对ubuntu进行一些设置,这儿就不再过多描绘,下面仅对一些和后续嵌入式linux开发有关的进行阐明:
别的,我运用的shell是bash,而ubuntu14.04装置后默许用的是dash,需求修正为默许运用bash。
1、装置tftp服务。嵌入式linux开发,尤其是uboot和kernel相关的开发,需求不断的修正MLO,u-boot,uImage等,这些文件是需求写入到am335x的板载flash上的,假如每次都是用SD,CCS,烧写东西等,是一个很费事的作业。因为uboot支撑tftp下载文件并烧写flash,这是一个较为快捷的方法。
在自己作业目录home/XXXX下树立一个空目录,取名为tftp;
给这个目录赋予读写等权限:sudo chmod 777 ./tftp;
装置tftp服务:sudo apt-get install xinetd tftpd-hpa tftp-hpa;
装置完结后,会主动从头发动xinetd,这时在/etc下会呈现xinetd.d目录;
进入到这个目录中,履行sudo touch tftpd;
然后履行sudo gedit ./tftpd,在tftpd文件中增加以下内容并保存退出:
service tftp
{
disable=no
socket_type=dgram
wait=no
user=root
protocol=udp
server=/usr/sbin/in.tftpd
server_args=-s /home/XXXX/tftp
log_on_success=PID HOST DURATION
log_on_failure=HOST
}
修正/etc/inetd.conf文件:sudo gedit /etc/inetd.conf,增加以下内容:
tftp dgram udp wait
root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /home/XXXX/tftp
修正/etc/default/tftpd-hpa:
#/etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/XXXX/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="–secure"
#Defaults for tftpd-hpa
RUN_DEAMON="yes"
OPTIONS="-1 -s /home/XXXX/tftp"
保存并退出后,从头发动tftp服务:sudo /etc/init.d/xinetd restart
sudo /etc/init.d/tftpd-hpa restart
2、装置nfs服务。nfs服务是嵌入式linux开发一个非常重要的服务,运用这个服务,可以将核算机上的一个文件目录挂载为am335x运转时的根文件系统,这样防止不断烧写flash。
树立一个文件夹,用于nfs服务,名称为nfs;
为装置nfs服务,修正ubuntu的软件源,假如不是“main server”,修正为“main server”,然后点击close,弹出对话框点击reload,然后等候处理完毕;
装置nfs服务,sudo apt-get install portmap nfs-kernel-server
sudo apt-get install portmap nfs-common
装备同享文件,修正/etc/exports,在文件结尾增加一行:/home/XXXX/nfs *(rw,sync,no_root_squash)。用于设置nfs目录的作业形式,以及用户进入该目录的权限为root;
从头发动nfs服务,sudo /etc/init.d/portmap restart
sudo /etc/init.d/nfs-kernel-server restart
查看nfs服务是否现已装备成功。
3、设置核算机的网卡。为开发嵌入式linux,我的核算机装置了2个网卡,一个USB接口的无线网卡,用于上网。别的一个100M PCI接口的有线以太网卡,用于衔接am335x。将有线以太网卡的IP地址设置为固定:192.168.1.50,子网掩码255.255.255.0,其他可以不设置。
4、下载TI的am335x的开发东西包,这儿我运用的是2011年取得的开发包,其间uboot是2011版,以及linux3.2.0。合作这个开发包运用的是arm-none-linux-gnueabi和arm-arago-linux-gnueabi穿插编译东西。因为种种原因,公司决议运用TI-SDK-AM335X-01.00.00.00中的穿插编译东西,是arm-linux-gnueabihf-gcc 4.7.3。
将TI的SDK解紧缩到/home/XXXX/ti-sdk-am335x-evm-01000000目录;
将uboot2011解紧缩到/home/XXXX/uboot目录;
将linux3.2.0解紧缩到/home/XXXX/kernel目录;
修正上述目录的权限,使得XXXX具有对这些目录以及其文件的读写权限。
5、修正环境变量装备,进行第一次编译uboot和kernel。
修正~/.bashrc文件,将编译uboot和kernel需求的环境变量加入到文件中,并使收效。 下面是需求加入到~/.bashrc中的内容:
PATH=$PATH:/home/XXXX/ti-sdk-am335x-evm-01000000/linux-devkit/sysroots/i686-arago-linux/usr/bin:/home/XXXX/uboot/am335x/tools:
上述/home/XXXX/uboot/am335x/tools目录,在编译uboot时,会生成后续用于制造uImage文件的东西,用来编译kernel,所以在这儿要加入到PATH中。不然后续编译kernel时会呈现过错。
编译uboot时会生成用于制造kernel的image的东西,这些东西在编译kernel是被make调用,所以在编译kernel时,有必要确保之前现已正确编译或uboot,而且没有对uboot履行过clean。
6、进入到uboot的目录中,修正两个sh文件,用于后续作业运用。
mkclean.sh,用于履行clean操作:
#/bin/sh
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm O=am335x distclean
上述履行的指令,运用arm-linux-gnueabihf穿插编译器,arm系统的CPU,输出文件保存到./am335x目录,履行distclean铲除所以之前的临时文件。
mkboot.sh,用于履行编译操作:
#/bin/sh
make -j4 CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm O=am335x am335x_evm
上述履行编译uboot,其间-j4奉告编译器运用4线程进行编译,这个设置取决于核算机CPU的核心数,可以加速编译的进程。
ARCH=arm指定方针CPU的系统架构。O=am335x指定文件输出目录为./am335x,编译完毕后,可以在这个目录下找到MLO,u-boot.img等文件。
am335x_evm选项奉告编译器运用这个板的装备对uboot进行编译。
7、进入到kernel目录中,修正三个sh文件,用于后续编译和装置kernel:
mkcln.sh,用于履行clean操作:
#/bin/sh
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm distclean
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm am335x_evm_defconfig
这个sh将进行铲除临时文件的操作,然后运用arm335x_evm_defconfig文件对kernel进行编译装备。
mkkn.sh,用于履行编译操作:
#/bin/sh
make -j4 CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm uImage
make -j4 CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm modules
穿插编译kernel并生成uImage文件。
穿插编译可动态加载的modules。
mkins.sh,用于装置kernel:
#/bin/sh
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm modules_install INSTALL_MOD_PATH=/home/XXXX/nfs
cp ./arch/arm/boot/zImage /home/XXXX/nfs/boot
将编译好的内核zImage和modules文件装置到nfs文件目录中。
在编译完结后,在kernel/arch/arm/boot目录下会生成uImage文件,这个是linux kernel可引导文件,需求将这个文件拷贝到nfs或许tftp目录中。
8、编译后的几个重要文件:
编译uboot将会生成2个重要文件,MLO和u-boot.img。其间MLO是第2次引导程序,am335x复位后,内部otp中的引导程序会发动,然后依据LCD_DATA管脚的设置来加载指定存储器上的MLO。
MLO运转后,将加载相应存储器上的u-boot.img。
u-boot.img发动后,将依据bootargs和bootcmd环境变量设置的参数,挑选加载uImage,并发动uImage。
uImage是kernel的可履行内核镜像文件。
9、开发嵌入式linux,需求将am335x经过串口和核算机衔接,并运用核算机的超级终端 进行操作。ubuntu下的minicom比较好用。
现在的核算机一般都没有规范的RS232接口,我自己规划了一块CH340T的通讯转接板,一端衔接am335x的UART0,别的一端接核算机的USB口,在芯恒的官网可以下载到ubuntu的驱动程序,下载下来后insmod成功后,/dev下可以看到ttyUSBX(X取决于核算机,一般为ttyUSB0)。
这样运用USB模仿串口和am335x通讯,便利运用。
下一篇将叙述第一次发动am335x。