当前位置:文档之家› 嵌入式Linux下3G模块的驱动和应用

嵌入式Linux下3G模块的驱动和应用

嵌入式Linux下3G模块的驱动和应用
嵌入式Linux下3G模块的驱动和应用

嵌入式Linux下3G模块的驱动和应用

1、开发资源

1.1、硬件资源:

ZTE-mf637u(中国联通)

ZTE-mu351(中国移动)

1.2、软件资源:

1.2.1、usb-modeswitch-1.1.3

libusb-0.1.12.tar.gz

usb-modeswitch-1.1.3.tar.bz2

1.2.2、ppp-2.4.4

libpcap-0.9.8.tar.gz

ppp-2.4.4.tar.gz

1.2.3、wvdial

1.2.3.1、wvdial-1.54.0(arm-linux-gcc 3.4.1) zlib-1.2.5.tar.bz2

openssl-0.9.7g.tar.gz

openssl-0.9.7g-fix_manpages-1.patch wvstreams-4.0.1.tar.bz2

wvstreams-4.0.1-tcl84-1.patch

wvdial-1.54.0.tar.gz

1.2.3.2、wvdial_1.60.4(arm-linux-gcc 4.2.2)

zlib-1.2.5.tar.bz2

openssl-0.9.8n.tar.gz

openssl-0.9.8n-fix_manpages-1.patch

wvstreams-4.6.1.tar.gz

wvdial_1.60.4.tar.gz

2、Linux开发环境

2.1、主机环境

2.1.1、主机linux系统

Fedora Core 6

2.1.2、主机编译环境

2.1.2.1、gcc -v

Using built-in specs.

Target: i386-redhat-linux

Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix

--enable-checking=release --with-system-zlib --enable-__cxa_atexit

--disable-libunwind-exceptions --enable-libgcj-multifile

--enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk

--disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre

--with-cpu=generic --host=i386-redhat-linux

Thread model: posix

gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)

2.1.2.2、/usr/local/arm/

3.

4.1/bin/arm-linux-gcc -v

Reading specs from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/specs

Configured with:

/work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure

--target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/usr/local/arm/3.4.1

--with-headers=/usr/local/arm/3.4.1/arm-linux/include

--with-local-prefix=/usr/local/arm/3.4.1/arm-linux --disable-nls --enable-threads=posix

--enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long

Thread model: posix

gcc version 3.4.1

2.1.2.3、/usr/local/arm/4.2.2/usr/bin/arm-linux-gcc -v

Using built-in specs.

Target: arm-unknown-linux-gnueabi

Configured with:

/home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm/gcc-4.2.2/configu re --prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu

--target=arm-unknown-linux-gnueabi --enable-languages=c,c++

--with-sysroot=/usr/local/arm/4.2.2-eabi/

--with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-gnueabi/bin --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --enable-shared

--with-gmp=/usr/local/arm/4.2.2-eabi//gmp --with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr --disable-nls --enable-threads --disable-multilib --disable-largefile --with-arch=armv4t --with-float=soft --enable-cxx-flags=-msoft-float

Thread model: posix

gcc version 4.2.2

2.2、开发板环境

2.2.1、CES-6410开发平台

Samsung S3C6410X, ARM1176JZF-S

128MB, Mobile DDR SDRAM

USB HOST:一个USB HOST 接口,USB2.0全速(12Mbits/s)

3、Linux应用软件的编译

3.1、usb-modeswitch-1.1.3

[root@localhost cdma]# tar xzf libusb-0.1.12.tar.gz

[root@localhost cdma]# cp libusb-0.1.12 libusb-0.1.12-arm

[root@localhost cdma]# cd libusb-0.1.12-arm

[root@localhost libusb-0.1.12-arm]#./configure --prefix=/works/cdma/install

--host=arm-linux CC=arm-linux-gcc CXX=arm-linux-g++

[root@localhost libusb-0.1.12-arm]# make

[root@localhost libusb-0.1.12-arm]# make install

[root@localhost libusb-0.1.12-arm]# cd ..

[root@localhost cdma]# tar xjf usb-modeswitch-1.1.3.tar.bz2

[root@localhost cdma]# cp usb-modeswitch-1.1.3 usb-modeswitch-1.1.3-arm [root@localhost cdma]# cd usb-modeswitch-1.1.3-arm

[root@localhost usb-modeswitch-1.1.3-arm]#

修改Makefile

CC = gcc

改为

CC = arm-linux-gcc

CFLAGS += -Wall -l usb

改为

CFLAGS += -Wall -l usb -I/works/cdma/install/include -L/works/cdma/install/lib 修改usb_modeswitch.c

// readConfigFile("/etc/usb_modeswitch.setup");

改为

readConfigFile("/etc/usb_modeswitch.setup");

[root@localhost usb-modeswitch-1.1.3-arm]# make

[root@localhost usb-modeswitch-1.1.3-arm]# make install

[root@localhost usb-modeswitch-1.1.3-arm]# cd ..

[root@localhost cdma]#

3.2、ppp-2.

4.4

[root@localhost cdma]# tar xzf libpcap-0.9.8.tar.gz

[root@localhost cdma]# cp libpcap-0.9.8 libpcap-0.9.8-arm

[root@localhost libpcap-0.9.8-arm]# ./configure --prefix=/works/cdma/install --host=arm-linux --with-pcap

make: *** No rule to make target `pcap-yes.o', needed by `libpcap.a'. Stop.

修改Makefile

PSRC = pcap-yes.c

改为

PSRC = pcap-linux.c

[root@localhost libpcap-0.9.8-arm]# make

[root@localhost libpcap-0.9.8-arm]# make install

[root@localhost libpcap-0.9.8-arm]# cd ..

[root@localhost cdma]# tar xzvf ppp-2.4.4.tar.gz

[root@localhost cdma]# cd ppp-2.4.4

[root@localhost ppp-2.4.4]# ./configure --host=arm-linux

vi pppd/Makefile

LIBS += -lpcap

CFLAGS += -DPPP_FILTER

改为

LIBS += -lpcap -L../../libpcap-0.9.8

CFLAGS += -DPPP_FILTER -I../../libpcap-0.9.8

[root@localhost ppp-2.4.4]# make CC=arm-linux-gcc

3.3、wvdial

3.3.1、wvdial-1.5

4.0

[root@localhost wvdial-1.54.0]# export PATH=/usr/local/arm/3.4.1/bin:$PATH [root@localhost wvdial-1.54.0]# tar xjf zlib-1.2.5.tar.bz2

[root@localhost wvdial-1.54.0]# cd zlib-1.2.5

[root@localhost zlib-1.2.5]#./configure --prefix=/works/wvdial-1.54.0/install

修改Makefile

CC = arm-linux-gcc

CPP=arm-linux-gcc -E

AR=arm-linux-ar rc

RANLIB=arm-linux-ranlib

[root@localhost zlib-1.2.5]# make

[root@localhost zlib-1.2.5]# make install

[root@localhost wvdial-1.54.0]# tar xzf openssl-0.9.7g.tar.gz

[root@localhost wvdial-1.54.0]# cd openssl-0.9.7g

[root@localhost openssl-0.9.7g]# patch -Np1

-i ../openssl-0.9.7g-fix_manpages-1.patch

[root@localhost openssl-0.9.7g]#./Configure --prefix=/works/wvdial-1.54.0/install os/compiler:arm-linux-gcc

[root@localhost openssl-0.9.7g]# make

[root@localhost openssl-0.9.7g]# make install

[root@localhost openssl-0.9.7g]# cd ..

[root@localhost wvdial-1.54.0]# tar xjf wvstreams-4.0.1.tar.bz2

[root@localhost wvdial-1.54.0]# cd wvstreams-4.0.1

[root@localhost wvstreams-4.0.1]# patch -Np1 -i ../wvstreams-4.0.1-tcl84-1.patch 修改configure

with_openssl=no

改为

with_openssl=yes

(有两处)

[root@localhost wvstreams-4.0.1]# ./configure --prefix=/works/wvdial-1.54.0/install --host=arm-linux CFLAGS=-I/works/cdma/install/include

LDFLAGS=-L/works/cdma/install/lib/ --with-zlib=/works/cdma/zlib-1.2.5

--with-openssl=/works/cdma/openssl-0.9.8n --without-dbus --with-pam=no --with-tcl=no --with-qt=no

[root@localhost wvstreams-4.0.1]# make

linking libwvutils.so...

/usr/lib/libz.so: could not read symbols: Invalid operation

collect2: ld returned 1 exit status

make: *** [libwvutils.so] Error 1

[root@localhost wvstreams-4.0.1]# arm-linux-gcc -L./xplc -L/works/cdma/install/lib/ -L./xplc -L. -g -Wl,-soname,libwvutils.so.4.0 -shared -o libwvutils.so utils/strcrypt.o utils/verstring.o utils/wvaudioencoder.o utils/wvbase64.o utils/wvbdbhash.o

utils/wvcrash.o utils/wvdiriter.o utils/wvgzip.o utils/wvhashtable.o utils/wvhex.o

utils/wvmagiccircle.o utils/wvmatrix.o utils/wvqdbmhash.o utils/wvrateadjust.o

utils/wvserialize.o utils/wvshmzone.o utils/wvstringtable.o utils/wvsubproc.o utils/wvtest.o utils/wvwordwrap.o libwvbase.so -lsupc++ -lgcc_eh

[root@localhost wvstreams-4.0.1]# make

[root@localhost wvstreams-4.0.1]# vi wvrules.mk

XX_LIBS := $(XX_LIBS) $(shell $(CC) -lsupc++ -lgcc_eh 2>&1 | grep -q "undefined reference" && echo " -lsupc++ -lgcc_eh")

改为

XX_LIBS := $(XX_LIBS) $(shell $(CC) -lsupc++ -lgcc_eh 2>&1 | grep -q "undefined reference" && echo " -lz -lcrypt -lsupc++ -lgcc_eh")

[root@localhost wvstreams-4.0.1]# make

compiling crypto/wvtripledes.o...

crypto/https://www.doczj.com/doc/f12802971.html,: In member function `virtual bool

WvTripleDESEncoder::_encode(WvBuf&, WvBuf&, bool)':

crypto/https://www.doczj.com/doc/f12802971.html,:108: error: cannot convert `const unsigned char*' to `

unsigned char (*)[8]' for argument `1' to `void DES_ecb3_encrypt(unsigned char (*)[8], unsigned char (*)[8], DES_key_schedule*, DES_key_schedule*, DES_key_schedule*, int)'

make: *** [crypto/wvtripledes.o] Error 1

解决方法:

crypto/https://www.doczj.com/doc/f12802971.html,

修改

#if OPENSSL_VERSION_NUMBER >= 0x0090705FL

改为

#if 0

compiling crypto/wvx509.o...

crypto/https://www.doczj.com/doc/f12802971.html,: In member function `WvString WvX509Mgr::get_extension(int)': crypto/https://www.doczj.com/doc/f12802971.html,:1168: error: invalid conversion from `unsigned char**' to ` const unsigned char**'

crypto/https://www.doczj.com/doc/f12802971.html,:1171: error: invalid conversion from `unsigned char**' to ` const unsigned char**'

make: *** [crypto/wvx509.o] Error 1

解决方法:

crypto/https://www.doczj.com/doc/f12802971.html,

if (method->it)

ext_data = ASN1_item_d2i(NULL, &ext->value->data,

ext->value->length,

ASN1_ITEM_ptr(method->it));

else

ext_data = method->d2i(NULL, &ext->value->data,

ext->value->length);

改为

if (method->it)

ext_data = ASN1_item_d2i(NULL, (const unsigned char

**)&ext->value->data,

ext->value->length,

ASN1_ITEM_ptr(method->it));

else

ext_data = method->d2i(NULL, (const unsigned char

**)&ext->value->data,

ext->value->length);

compiling streams/wvpam.o...

streams/https://www.doczj.com/doc/f12802971.html,: In member function `bool WvPam::authenticate(const WvFastString&, const WvFastString&, const WvFastString&)': streams/https://www.doczj.com/doc/f12802971.html,:71: error: `fail' undeclared (first use this function)

streams/https://www.doczj.com/doc/f12802971.html,:71: error: (Each undeclared identifier is reported only once

for each function it appears in.)

make: *** [streams/wvpam.o] Error 1

解决方法:

return fail;

改为

return false;

[root@localhost wvstreams-4.0.1]# make install

[root@localhost wvstreams-4.0.1]# cp libwvutils.so ../install/lib/libwvutils.so.4.0 -a [root@localhost wvstreams-4.0.1]# cd ..

[root@localhost wvdial-1.54.0]# tar xzf wvdial-1.54.0.tar.gz

[root@localhost wvdial-1.54.0]# cd wvdial-1.54.0

[root@localhost wvdial-1.54.0]# cp

/works/wvdial-1.54.0/install/include/wvstreams/*.h .

[root@localhost wvdial-1.54.0]# vi Makefile

PREFIX=/usr/local

改为

PREFIX=/works/wvdial-1.54.0/install

PPPDIR=/etc/ppp/peers

改为

PPPDIR=${PREFIX}/etc/ppp/peers

XPATH=.. ../wvstreams/include $(PKGINC)

改为

XPATH=/works/wvdial-1.54.0/install/include/wvstreams

LIBS += -L../wvstreams -lwvutils -lwvstreams

改为

LIBS += -L/works/wvdial-1.54.0/install/lib -lwvutils -lwvstreams -lwvbase -lz

[root@localhost wvdial-1.54.0]# vi wvrules.mk

增加

CC = arm-linux-g++

CXX = arm-linux-g++

[root@localhost wvdial-1.54.0]# make

[root@localhost wvdial-1.54.0]# make install

3.3.2、wvdial-1.60.4

export PATH=/usr/local/arm/4.2.2-eabi/usr/bin:$PATH

tar xjf zlib-1.2.5.tar.bz2

cd zlib-1.2.5

./configure --prefix=/works/cdma/install-4.2.2

修改Makefile

CC = arm-linux-gcc

CPP=arm-linux-gcc -E

AR=arm-linux-ar rc

LDSHARED=arm-linux-gcc ....

RANLIB=arm-linux-ranlib

make

make install

openssl-0.9.8n

patch -N -p

1 -i ../openssl-0.9.8n-fix_manpages-1.patch

./Configure --prefix=/works/cdma/install-4.2.2 os/compiler:arm-linux-gcc make

make install

wvstreams-4.6.1

修改configure

with_zlib=no

改为

with_zlib=yes

(有两处)

with_openssl=no

改为

with_openssl=yes

(有两处)

./configure --prefix=/works/cdma/install-4.2.2 --host=arm-linux

CPPFLAGS=-I/works/cdma/install-4.2.2/include

LDFLAGS=-L/works/cdma/zlib-1.2.5-4.2.2 CFLAGS=-I/works/cdma/zlib-1.2.5-4.2.2 --with-zlib=/works/cdma/zlib-1.2.5-4.2.2/

--with-openssl=/works/cdma/openssl-0.9.8n-4.2.2 --without-dbus --with-pam=no

--with-tcl=no --with-qt=no --without-valgrind

make

如果出现undefined reference to

"EVP_MD_size"错误

将出现错误的语句return

EVP_MD_size((evp_md_st *)evpmd;改成return ((evp_md_st *)evpmd)->md_size;即可

make install

wvdial-1.60.4

修改Makefile

prefix=/usr/local

改为

prefix=/works/cdma/install-4.2.2

PPPDIR=/etc/ppp/peers

改为

PPPDIR=${prefix}/etc/ppp/peers

PC_CFLAGS=$(shell pkg-config --cflags libwvstreams)

改为

PC_CFLAGS=-I/works/cdma/install-4.2.2/include/wvstreams

PC_LIBS=$(shell pkg-config --libs libwvstreams)

PC_LIBS=-L/works/cdma/install-4.2.2/lib -lwvstreams -lwvutils -lwvbase

修改wvrules.mk

WVLINK_CC = gcc

改为

WVLINK_CC = arm-linux-g++

CC = arm-linux-g++

CXX = arm-linux-g++

make

make install

4、Linux内核的配置与修改

4.1、linux内核配置

make menuconfig

Device Drivers --->

[*] Network device support --->

PPP (point-to-point protocol) support

[*] PPP multilink support (EXPERIMENTAL)

[*] PPP filtering

PPP support for async serial ports

PPP support for sync tty ports

PPP Deflate compression

PPP MPPE compression (encryption) (EXPERIMENTAL) PPP over Ethernet (EXPERIMENTAL)

[*] USB support --->

USB Modem (CDC ACM) support

USB Serial Converter support --->

USB driver for GSM and CDMA modems

4.2、linux内核修改

drivers/usb/serial/option.c

static struct usb_device_id option_ids[] = {

};

在这个数组中添加两项

{ USB_DEVICE(0x19d2, 0x0031) },

{ USB_DEVICE(0x19d2, 0x0034) },

4.3、linux内核编译

make zImage

make modules

5、3G模块的使用

5.1、加载内核模块

insmod option.ko

insmod cdc-acm.ko

insmod slhc.ko

insmod ppp_generic.ko

insmod pppox.ko

insmod pppoe.ko

insmod ppp_synctty.ko

insmod ppp_deflate.ko

insmod crc-ccitt.ko

insmod ppp_async.ko

insmod sha1_generic.ko

insmod ppp_mppe.ko

5.2、加载USB文件系统

mount -t usbfs usbfs /proc/bus/usb

5.3、ZTE-mf637u(中国联通)的使用

5.3.1、配置文件/etc/usb_modeswitch.setup

# Configuration for the usb-modeswitch package, a mode switching tool for # USB devices providing multiple states or modes

#

# This file is evaluated by the wrapper script "usb_modeswitch" in /lib/udev # To enable an option, set it to "1", "yes" or "true" (case doesn't matter)

# Everything else counts as "disable"

# Disable automatic mode switching globally (e.g. to access the original # install storage)

DisableSwitching=0

# Enable logging (results in a extensive report file in /var/log, named

# "usb_modeswitch_"

EnableLogging=0

######################################################## # ZTE MF622 (aka "Onda MDC502HS")

# ZTE MF626

# ZTE MF628+ (tested version from Telia / Sweden)

# ZTE MF633

# ZTE MF636 (aka "Telstra / BigPond 7.2 Mobile Card")

# ZTE MF637

嵌入式Linux应用程序设计试题

嵌入式Linux应用程序设计(试题) 1、嵌入式linux操作系统的特点(多选) ABCDE A、低廉性 B、广泛性 C、可移植性好 D、良好的网络支持 E、实时性好 2、Linux的基本思想有两点:A、一切都是文件;B、每个软件都有确定的用途。 3、嵌入式Linux系统构成:嵌入式微处理器,外围硬件设备,嵌入式操作系统,用户应用程序。 4、硬盘分区一般分为:主分区,扩展分区,逻辑分区,交换分区 5、主分区和扩展分区的最大的区别:C A、大小不一样 B、挂载点不一样 C、主分区的作用就是用来进行启动操作系统的,因此引导程序都应该存放在主分区上。 D、主分区在硬盘物理位置的最前面 6、Linux分区类型默认的是:C A. vfat B. ext2/ext3 C. swap D. dos 7、如何从当前系统中卸载一个已装载的文件系统 A A. umount [挂载点目录] B. dismount C. mount –u [挂载点目录] D. 从 /etc/fstab 中删除这个文件系统项 8、用户切换指令是: A A、su B、sudo C、useradd D、userdel 9、查看当前系统中的进程指令 A A、ps B、kill C、cat D、man 10、下面杀死一个ID号为9号的进程的操作正确的是 C A、ps -ef B、kill 9 C、kill -9 9 D、rm 9 11、使用重定向来把ls输出保存到文件test.txt中:A A、ls > test.txt B、ls < test.txt C、ls | test.txt D、ls | grep test.txt 12、使用重定向来把test.txt文件中内容输出:B A、more > test.txt B、more < test.txt C、more | test.txt D、more | grep test.txt 13、解压文件tar.tar.gz:C A、tar -zxvf tar.tar.gz B、tar -jxvf tar.tar.gz C、tar -cxvf tar.tar.gz D、tar -jvf tar.tar.gz 14、把目录/aaa内文件及目录的压缩到文件tar.tar.gz:D A、tar -zxvf tar.tar.gz /aaa B、tar -jxvf tar.tar.gz /aaa C、tar -cxvf tar.tar.gz /aaa D、tar -cvf tar.tar.gz /aaa 15、vi 有几种模式:三种模式 16、vi中的操作指令: :w 保存 :q 退出 :q! 强行退出 :wq 保存退出 :w [filename] 保存到filename文件中 :set nu 显示行号,设定之后,会在每一行的前面显示对应行号

嵌入式Linux应用软件开发流程

从软件工程的角度来说,嵌入式应用软件也有一定的生命周期,如要进行需求分析、系统设计、代码编写、调试和维护等工作,软件工程的许多理论对它也是适用的。 但和其他通用软件相比,它的开发有许多独特之处: ·在需求分析时,必须考虑硬件性能的影响,具体功能必须考虑由何种硬件实现。 ·在系统设计阶段,重点考虑的是任务的划分及其接口,而不是模块的划分。模块划分则放在了任务的设计阶段。 ·在调试时采用交叉调试方式。 ·软件调试完毕固化到嵌入式系统中后,它的后期维护工作较少。 下面主要介绍分析和设计阶段的步骤与原则: 1、需求分析 对需求加以分析产生需求说明,需求说明过程给出系统功能需求,它包括:·系统所有实现的功能 ·系统的输入、输出 ·系统的外部接口需求(如用户界面) ·它的性能以及诸如文件/数据库安全等其他要求 在实时系统中,常用状态变迁图来描述系统。在设计状态图时,应对系统运行过程进行详细考虑,尽量在状态图中列出所有系统状态,包括许多用户无需知道的内部状态,对许多异常也应有相应处理。 此外,应清楚地说明人机接口,即操作员与系统间地相互作用。对于比较复杂地系统,形成一本操作手册是必要的,为用户提供使用该系统的操作步骤。为使系统说明更清楚,可以将状态变迁图与操作手册脚本结合起来。

在对需求进行分析,了解系统所要实现的功能的基础上,系统开发选用何种硬件、软件平台就可以确定了。 对于硬件平台,要考虑的是微处理器的处理速度、内存空间的大小、外部扩展设备是否满足功能要求等。如微处理器对外部事件的响应速度是否满足系统的实时性要求,它的稳定性如何,内存空间是否满足操作系统及应用软件的运行要求,对于要求网络功能的系统,是否扩展有以太网接口等。 对于软件平台而言,操作系统是否支持实时性及支持的程度、对多任务的管理能力是否支持前面选中的微处理器、网络功能是否满足系统要求以及开发环境是否完善等都是必须考虑的。 当然,不管选用何种软硬件平台,成本因素都是要考虑的,嵌入式Linux 正是在这方面具有突出的优势。 2、任务和模块划分 在进行需求分析和明确系统功能后,就可以对系统进行任务划分。任务是代码运行的一个映象,是无限循环的一段代码。从系统的角度来看,任务是嵌入式系统中竞争系统资源的最小运行单元,任务可以使用或等待CPU、I/O设备和内存空间等系统资源。 在设计一个较为复杂的多任务应用系统时,进行合理的任务划分对系统的运行效率、实时性和吞吐量影响都极大。任务分解过细会不断地在各任务之间切换,而任务之间的通信量也会很大,这样将会大大地增加系统的开销,影响系统的效率。而任务分解过粗、不够彻底又会造成原本可以并行的操作只能按顺序串行执行,从而影响系统的吞吐量。为了达到系统效率和吞吐量之间的平衡折中,在划分任务时应在数据流图的基础上,遵循下列步骤和原则:

嵌入式Linux系统中音频驱动的设计与实现

第31卷 第2期 2008年4月 电子器件 Ch in es e Jo u rnal Of Electro n Devi ces Vol.31 No.2Apr.2008 Design and Implementation of Audio Driver for Embedded Linux System YU Yue,YA O G uo -liang * (N ational A S I C S ystem Eng ine ering Center ,S outhe ast Unive rsity ,N anj ing 210096,China) Abstract:This paper intro duces the fundam ental principle and architecture of the audio system w hich con -sists of the CODEC UCB1400and the 805puls,and describes the design of audio dev ice dr iv er based on Audio Codec .97for Embedded Linux System.The paper focuses o n the implementatio n of the DM A trans -port and ioctl interface.T he audio dr iv e is running w ell in actual Embedded Linux system equipments.Key words:805plus;embedded Linux;Audio A C .97driver;DM A;ioctl interface EEACC :1130B 嵌入式Linux 系统中音频驱动的设计与实现 虞 跃,姚国良 * (东南大学国家专用集成电路系统工程中心,南京210096) 收稿日期:2007-07-09 作者简介:虞 跃(1982-),男,东南大学电子工程系国家专用集成电路工程技术研究中心硕士研究生,研究方向为嵌入式系统设计; 姚国良(1979-),男,东南大学电子工程系博士研究生,yuyueo@https://www.doczj.com/doc/f12802971.html,. 摘 要:介绍了由805puls 处理器和U CB1400编解码芯片构成的音频系统体系结构及工作原理,接着阐述了嵌入式Linux 操作系统下基于A C .97协议标准的音频设备驱动程序的设计与实现。其中着重讲述了采用循环缓冲区进行音频数据的DM A 传输流程以及ioctl 接口的实现。此设计方案已在嵌入式L inux 系统中得到使用,运行效果良好。 关键词:805plus;嵌入式L inux ;AC .97音频驱动;DM A;ioctl 接口中图分类号:TP391 文献标识码:A 文章编号:1005-9490(2008)02-0709-03 嵌入式音频系统广泛应用于GPS 自动导航、PDA,3G 手机等移动信息终端,具备播放、录音功能的音频系统的应用使得移动信息终端上视听娱乐IP 电话、音频录制等成为可能,并推动了移动信息终端设备的发展。 在软件上,嵌入式操作系统的新兴力量Linux 的开源性,内核可定制等优点吸引了许多的开发者与开发商。它是个和U nix 相似、以核心为基础的、完全内存保护、多任务多进程的操作系统。支持广泛的计算机硬件,包括X86,A lpha,Sparc,M IPS,PPC,ARM ,NEC,MOT OROLA 等现有的大部分芯片[1]。 本文针对805puls 微处理器选用Philips 公司的编解码芯片(CODEC)U CB1400,构建了基于Au -dio Codec .97(AC .97)标准的音频系统。并介绍了该音频系统在Linux 操作系统2.4.19内核下驱动 程序的实现技术。 1 音频系统构架 1.1 微处理器805plus 805plus 是东南大学ASIC 系统工程技术研究中心和北京大学微处理器研究开发中心共同设计和开发的32bit 嵌入式微处理器,是采用H ar vard 结构的RISC 处理器。内部采用五级流水线结构,兼容16bit 和32bit 的指令系统805plus 嵌入式微处理器集成了存储接口EMI,时钟和功耗管理PM C,中断控制器INTC,通用定时器T IM ER,脉宽调制器PWM,实时时钟RT C,通用串口UA RT,LCD 控制器LCDC,AC .97控制器,同步外设接口SPI 。1.2 AC .97协议标准[2] AC'97协议标准是一套关于A C'97数字音频处理(AC'97Digital Controller)、AC '97数字串口(AC

嵌入式Linux应用程序开发报告

湖南工业大学 课程设计 资料袋 计算机与通信学院学院(系、部)2015~ 2016 学年第一学期 课程名称嵌入式Linux应用程序开发指导教师叶伟琼职称副教授 学生姓名皓月叶舞专业班级通信工程12XX 学号124082004XX 题目AD驱动 成绩起止日期2015 年12 月14 日~2015年12月20 日 目录清单 序号材料名称资料数量备注 1 课程设计任务书 1 2 课程设计说明书 1 3 课程设计图纸10 张4 5 6

湖南工业大学 课程设计任务书 2015 —2016学年第1 学期 计算机与通信学院通信工程专业12XX 班 课程名称:嵌入式Linux应用程序开发 设计题目: AD驱动 完成期限:自2015 年12 月14 日至2015 年12 月20 日共 1 周 内容及任务一、设计的主要技术参数 数模转换、数模编程 二、设计任务(内容) 1、完成相关编程模拟量输入采集和转换 2、将结果显示 3、测试并运行,改变模拟量输入 4、验证 5、完成课程设计说明书 三、设计工作量 1周完成 进度安排 起止日期工作内容 12月14日分组、任务分配、课题理解 12月15日-12月17日功能分析、程序设计 12月18日-12月19日实验验证和测试 12月20 日总结、书写实验报告 参考资料[1] 王实甫. 嵌入式Linux系统设计与实例开发. 吉林大学出版社,2004年 [2] 田丰兴. 嵌入式控制系统. 北京航空航天大学出版社,2002年 指导教师(签字):年月日系(教研室)主任(签字):年月日

湖南工业大学 嵌入式Linux应用程序设计 课程设计说明书 AD驱动 起止日期: 2015年 12月14日至 2015年 12月 20 日 学生姓名皓月叶舞 班级通信1204班 学号124082004XX 成绩 指导教师(签字) 计算机与通信学院 2015年 12月20日

CAN总线在嵌入式Linux下驱动程序的实现

CAN总线在嵌入式Linux下驱动程序的实现 时间:2009-11-05 09:41:22 来源:微计算机信息作者:黄捷峰蔡启仲郭毅锋田小刚 1 引言 基于嵌入式系统设计的工业控制装置,在工业控制现场受到各种干扰,如电磁、粉尘、天气等对系统的正常运行造成很大的影响。在工业控制现场各个设备之间要经常交换、传输数据,需要一种抗干扰性强、稳定、传输速率快的现场总线进行通信。文章采用CAN总线,基于嵌入式系统32位的S3C44B0X微处理器,通过其SPI接口,MCP2510 CAN控制器扩展CAN总线;将嵌入式操作系统嵌入到S3C44B0X微处理器中,能实现多任务、友好图形用户界面;针对S3C44B0X微处理器没有内存管理单元MMU,采用uClinux嵌入式操作系统。这样在嵌入式系统中扩展CAN设备关键技术就是CAN设备在嵌入式操作系统下驱动程序的实现。文章重点解决了CAN总线在嵌入式操作系统下驱动程序实现的问题。对于用户来说,CAN设备在嵌入式操作系统驱动的实现为用户屏蔽了硬件的细节,用户不用关心硬件就可以编出自己的用户程序。实验结果表明驱动程序的正确性,能提高整个系统的抗干扰能力,稳定性好,最大传输速率达到1Mb/s;硬件的错误检定特性也增强了CAN的抗电磁干扰能力。 2 系统硬件设计 系统采用S3C44B0X微处理器,需要扩展CAN控制器。常用的CAN控制器有SJA1000和MCP2510,这两种芯片都支持CAN2.0B标准。SJA1000采用的总线是地址线和数据线复用的方式,但是嵌入式处理器外部总线大多是地址线和数据线分开的结构,这样每次对SJA1000操作时需要先后写入地址和数据2次数据,而且SJA1000使用5V逻辑电平。所以应用MCP2510控制器进行扩展,收发器采用82C250。MCP2510控制器特点:1.支持标准格式和扩展格式的CAN数据帧结构(CAN2.0B);2.0~8字节的有效数据长度,支持远程帧;3.最大1Mb/s的可编程波特率;4.2个支持过滤器的接受缓冲区,3个发送缓冲区; 5.SPI高速串行总线,最大5MHz; 6.3~5.5V宽电压范围供电。MCP2510工作电压为3.3V,能够直接与S3C44B0X微处理器I/O口相连。为了进一步提高系统抗干扰性,可在CAN控制器和收发器之间加一个光隔6N137。其结构原理框图如图1: 图1.S3C44B0X扩展CAN结构框图图2.字符设备注册表 3 CAN设备驱动程序的设计 Linux把设备看成特殊的文件进行管理,添加一种设备,首先要注册该设备,增加它的驱动。设备驱动程序是操作系统内核与设备硬件之间的接口,并为应用程序屏蔽了硬件细节。在linux中用户进程不能直接对物理设备进行操作,必须通过系统调用向内核提出请求,

linux驱动开发的经典书籍

linux驱动开发的经典书籍 结构、操作系统、体系结构、编译原理、计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高 从安装使用=>linux常用命令=>linux系统编程=>内核开发阅读内核源码 其中学习linux常用命令时就要学会自己编译内核,优化系统,调整参数 安装和常用命令书太多了,找本稍微详细点的就ok,其间需要学会正则表达式 系统编程推荐《高级unix环境编程》,黑话叫APUE 还有《unix网络编程》 这时候大概还需要看资料理解elf文件格式,连接器和加载器,cmu的一本教材中文名为《深入理解计算机系统》比较好 内核开发阅读内核源码阶段,从写驱动入手逐渐深入linux内核开发 参考书如下《linux device drivers》,黑话叫ldd 《linux kernel development》,黑话叫lkd 《understading the linux kernel》,黑话叫utlk 《linux源码情景分析》 这四本书为搞内核的必读书籍 最后,第三阶段和第四阶段最重动手,空言无益,光看书也不罩,不动手那些东西理解不了 学习linux/unix编程方法的建议 建议学习路径: 首先先学学编辑器,vim, emacs什么的都行。 然后学make file文件,只要知道一点就行,这样就可以准备编程序了。 然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。 如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。 然后再看Douglus E. Comer的《用TCP/IP进行网际互连》第一卷,学习一下网络的知识,再看《UNP》的第一卷,不仅学习网络编程,而且对系统编程的一些常用的技巧就很熟悉了,如果继续网络编程,建议看《TCP/IP进行网际互连》的第三卷,里面有很多关于应用

ARM的嵌入式Linux应用程序开发设计

ARM的嵌入式Linux应用程序开发设计 嵌入式系统已经渗透到人们工作、生活中的各个领域,嵌入式处理器已占分散处理器市场份额的94%。而嵌入式Linux系统也蓬勃发展,不仅继承了Linux 源码开放、内核稳定高效、软件丰富等优势,还具备支持广泛处理器结构和硬件平台、占有空间小、成本低廉、结构紧凑等特点。1ARM处理器及开发板在嵌入式领域,ARM已取得了极大的成功,造就了IP核商业化、市场化的神话。据统计,全球有103家巨型IT公司在采用ARM技术,20家最大的半导体,一 嵌入式系统已经渗透到人们工作、生活中的各个领域,嵌入式处理器已占分散处理器市场份额的94%。而嵌入式Linux系统也蓬勃发展,不仅继承了Linux源码开放、内核稳定高效、软件丰富等优势,还具备支持广泛处理器结构和硬件平台、占有空间小、成本低廉、结构紧凑等特点。 1 ARM处理器及开发板 在嵌入式领域,ARM已取得了极大的成功,造就了IP核商业化、市场化的神话。据统计,全球有103家巨型IT公司在采用ARM技术,20家最大的半导体,一商中有19家是ARM的用户。ARM系列芯片已经被广泛的应用于移动电活、手持式计算机以及各种各样的嵌入式应用领域,成为世界上销量最大的32位微处理器。ARM已成为业界实际的RISC芯片标准。 ARM系列处理器根据各自特点应用于不同领域。从应用的角度上ARM芯片选择的一般原则:MMU;处理器速度;内置存储器容量;USB接口;GPIO数量;中断控制器;IIS(integrate interface ofsound)音频接口;nWAIT信号; RTC(real timeclock);LCD控制器;PWM输出等各项指标。 本文使用的是ARM9,其性能远远高过ARM7。开发板使用的是广州斯道信息技术有限公司的开发板,中央处理器是三星公司的S3C2410。ARM9具有以下特点:5级流水线;采用哈佛结构;高速缓存和写缓存的引入;支持MMU。 2 嵌入式Linux系统 嵌入式操作系统是嵌入式应用软件的基础和开发平台,它的出现解决了嵌入式软件开发标准化的难题。嵌入式系统具有操作系统的最基本的功能。目前主流的嵌入式系统有以下儿种:Linux、VxWorks、QNX、Windows CE、Palm OS。 嵌入式Linux操作系统具有一些独特的优势:层次结构及内核完全开放;强大的网络支持功能;具备一整套工具链;广泛的硬件支持特性。 嵌入式Linux系统有很多种。本文使用的是Red Hat9操作系统。 在安装有Windows和Linux双系统的PC上,系统会以Linux的GRUB作为引导装入器来选择启动二者。此时若直接删除Linux分区,会导致系统无法启动

linux驱动程序的编写

linux驱动程序的编写 一、实验目的 1.掌握linux驱动程序的编写方法 2.掌握驱动程序动态模块的调试方法 3.掌握驱动程序填加到内核的方法 二、实验内容 1. 学习linux驱动程序的编写流程 2. 学习驱动程序动态模块的调试方法 3. 学习驱动程序填加到内核的流程 三、实验设备 PentiumII以上的PC机,LINUX操作系统,EL-ARM860实验箱 四、linux的驱动程序的编写 嵌入式应用对成本和实时性比较敏感,而对linux的应用主要体现在对硬件的驱动程序的编写和上层应用程序的开发上。 嵌入式linux驱动程序的基本结构和标准Linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编成模块化形式,而且,要求可以在不同的体系结构上安装。linux是可以支持模块化模式的,但由于嵌入式应用是针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中。但是这种模式是调试驱动模块的极佳方法。 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在linux操作系统下有字符设备和块设备,网络设备三类主要的设备文件类型。 字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 1 字符设备驱动结构 Linux字符设备驱动的关键数据结构是cdev和file_operations结构体。

基于嵌入式linux的bsp概念与开发

引言 Linux诞生于1991年,芬兰学生LinuSTorvaldS是Linux操作系统的缔造者,与传统的操作系统不同,Linux操作系统的开发一开始就在FSF(自由软件基金会组织)的GPL(GNU Public License)的版本控制之下,Linux内核的所有源代码都采取了开放源代码的方式。Linux具有相当多的优点。 BSP(Board Support Packet——板级支持包)是介于底层硬件和上层软件之间的底层软件开发包,其主要功能为屏蔽硬件,提供操作系统的引导及硬件驱动。Linux操作系统目前已发展为主流操作系统之一,并且还在不断的壮大和发展。 最新的2.6版内核增加了很多新特性为嵌入式应用提供广泛的支持,使得它不仅可以应用于大型系统,还可以应用于像PDA这类超小型系统中。随着Linux系统在嵌入式领域的广泛应用,对它的研究也在逐渐成为热点并且走向成熟。 在嵌入式系统开发过程中,板级支持包(BSP,BoardSuport Package)的开发已成为非常重要的环节。本文以Linux系统上的BSP技术为研究内容,讨论了BSP的基本概念和设计思想,特别针对Linux系统上BSP的层次结构、各功能模块的实现技术做了详细分析。 通过分析PC机的BIOS技术阐述了嵌入式系统中板级初始化流程和技术重点,并从源代码分析入手详细分析了PC机GURB引导程序设计技术,提出了嵌入式系统上BootLoader的程序结构和设计思想。 嵌入式操作系统对设备驱动程序的管理技术是BSP设计的重要组成部分。本文对比了Linux2.4和Linux2.6的设备驱动程序框架,同时结合大量源代码的研读,对Linux2.6内核的统一设备模型进行了深入的研究,剖析了内核对象机制的主要数据结构及驱动程序设计框架,理解了该模型对设备类的抽象机制,并在实际的项目实践中,结合所作的研究工作,圆满完成了基于ARM+Linux开发平台的BSP开发任务。 最后对本文研究工作进行了总结,并对下一步工作进行了展望。

嵌入式Linux应用完全开发手册

嵌入式Linux应用完全开发手册 终端概述 在Linux中,TTY(终端)是一类字符设备的统称,包括了3中类型:控制台、串口、伪终端。 控制台:供内核使用的终端为控制台。控制台在Linux启动时,通过命令console=…指定,如果没有指定控制台,系把第一个注册的终端作为控制台。控制台是一个虚拟的终端,它必须映射到真正的终端上。 控制台可以简单的理解为printk输出的地方。 控制台是个只输出的设备,功能很简单,只能在内核中访问。 进程四要素 █有段程序供其执行。这段 程序不一定是某个进程所专 有,可以与其它进程共用。 █有进程专用的内核空间 堆栈。 █在内核中有一个 task_struct数据结构,即通 常所说的“进程控制块”。有 了这个数据结构,进程才能 成为内核调度的一个基本单位接受内核的调度。 █有独立的用户空间。 进程调度 █调度概念:从就绪的进程中选出最合适的一个进程执行。 █调度策略 -SCHED_NORMAL(SCHED_OTHER):普通的分时进程。

- SCHED_FIFO:先进先出的实时调度 - SCHED_RR:时间片轮转实时进程 - SCHED_BATCH:批处理进程 - SCHED_IDLE:只有在系统空闲时,才能够被调度执行的进程。 进程管理 █特点:动态性、并发性、独 立性、异步性 编译说明 █编译选项: -c编译不链接。 -g 带有调试信息。 -I .h文件所在目录 -预处理:语法分析,例如:将宏定义展开。 -编译:*.c 文件编译成*.s文件。 -汇编:*.s 文件编译成*.o文件。 -链接:多个*.o 文件链接成执行文件。 █Linux系统调用和C库 Linux系统调用是依赖于系统的,而C库在任何操作系统下,调用都是相同的。

Linux驱动工程师成长之路

本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。 《Linux驱动工程师》这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个linux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。我还跟我旁边那个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。回想一下我都学过什么啊:1:自己在ARM9上写bootloader(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,LCD,TOUCH,SD,USB,ETHERNET...,makefile);2:移植和学习linux驱动。下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。如果是USB,SD卡就得了解相关协议。可以通过spec(协议)、datasheet来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。2:了解linux驱动框架linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLASH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。3:了解这个驱动的数据流。这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。了解这个过程我相信在调试驱动的时候是很有帮助。3:分析与硬件相关通常需要我们实现的那部分源代码。4:三板子上将驱动调试出来。每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显,即使是浅显的问题也要把它记录下来。(这个是我上次在华为面试的时候,那个人问我你调试驱动遇到过什么问题吗?你是如何解决的。当时我学习还没有到调试驱动这一步,所以那次面试也惨败收场)。 好像说了这么多,还没有进入正题《工作的选择》。在年前去了龙芯,实习2.8K,转正3.5k,环境还是不错,经理很好,头儿也很帅都是中科院的硕士。不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔的时候,从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作,转而学习linux驱动。一直到上周日。上周日的晚上我就开始投简历一开始要找linux驱动,在智联里面输入linux驱动出来500来个职位,点开一看没有一个自己符合要求的,差不多都要3-5年经验本科,有时候好不容易有个实习的关键字在里面,一看要求硕士,严重打击了我的信心,哎不管了随便投,最后又投了一下嵌入式关键字的职位。最后就瞎申请,看看职位要求差不多就申请。周一来了,这周一共来了6个面试,创下了我求职以来的历史新高。周一下午面了一家感觉还不错不过到现在也没有给我一个通知,估计当时我要了4500把他给要跑了,这家是做测量的不是Linux驱动,差不多是把ARM当单片机用。周二上午一家也是要招linux驱动面了估计不到二分钟,他

从零开始搭建Linux驱动开发环境

参考: 韦东山视频第10课第一节内核启动流程分析之编译体验 第11课第三节构建根文件系统之busybox 第11课第四节构建根文件系统之构建根文件系统韦东山书籍《嵌入式linux应用开发完全手册》 其他《linux设备驱动程序》第三版 平台: JZ2440、mini2440或TQ2440 交叉网线和miniUSB PC机(windows系统和Vmware下的ubuntu12.04) 一、交叉编译环境的选型 具体的安装交叉编译工具,网上很多资料都有,我的那篇《arm-linux- gcc交叉环境相关知识》也有介绍,这里我只是想提示大家:构建跟文件系统中所用到的lib库一定要是本系统Ubuntu中的交叉编译环境arm-linux- gcc中的。即如果电脑ubuntu中的交叉编译环境为arm-linux-

二、主机、开发板和虚拟机要三者互通 w IP v2.0》一文中有详细的操作步骤,不再赘述。 linux 2.6.22.6_jz2440.patch组合而来,具体操作: 1. 解压缩内核和其补丁包 tar xjvf linux-2.6.22.6.tar.bz2 # 解压内核 tar xjvf linux-2.6.22.6_jz2440.tar.bz2 # 解压补丁

cd linux_2.6.22.6 patch –p1 < ../linux-2.6.22.6_jz2440.patch 3. 配置 在内核目录下执行make 2410_defconfig生成配置菜单,至于怎么配置,《嵌入式linux应用开发完全手册》有详细介绍。 4. 生成uImage make uImage 四、移植busybox 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向bu sybox的链接,busybox通过传入的参数来决定进行何种命令操作。 1)配置busybox 解压busybox-1.7.0,然后进入该目录,使用make menuconfig进行配置。这里我们这配置两项 一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。 ->Busybox Settings ->Build Options

嵌入式linux应用程序开发期末考试题库及答案

1下列哪一项不是嵌入式操作系统的特点D A、占有资源少 B、低成本 C、高可靠性 D、交互性 2下列哪一项不是嵌入式系统的基本要素C A、嵌入性 B、专用性 C、通用性 D、计算机系统 3现阶段嵌入式系统发展的主要标志为D A、以单芯片为核心的可编程控制器 B、以嵌入式CPU为基础、以简单操作系统为核心 C、嵌入式操作系统 D、Internet 4下面哪项不是嵌入式系统的特点D A、面向特定应用 B、软件一般都固化在存储器芯片或单片机本身中,而不存储于磁盘中 C、代码尤其要求高质量、高可靠性 D、具备二次开发能力 5下面哪项不是ARM处理器的特点D A、支持Thumb(16位)/ARM(32位)双指令集 B、兼容8位/16位器件 C、指令长度固定 D、大量使用RAM,指令执行速度更快 6下面哪项不是ARM处理器的特点B A、大多数数据操作都在寄存器中完成 B、采用CISC指令集 C、寻址方式灵活简单,执行效率高 D、体积小、低功耗、低成本、高性能 7下面哪项不属于ARM处理器模式A A、管理模式(root) B、用户模式(usr) C、快速中断模式(fiq) D、外部中断模式(irq) 8下面哪项为错误的说法A A、冯·诺依曼结构共用数据存储空间和程序存储空间,不共享存储器总线 B、哈佛结构有分离的数据和程序空间及分离的访问总线 C、哈佛结构在指令执行时,取址和取数可以进行并行操作 D、哈佛结构指令执行时效率更高 9采用下列哪项更有利于开发微型嵌入式应用系统B A、脚本程序语言 B、C语言或汇编语言 C、C++或SQL语言 D、HTML或XML语言 10下面哪项为一般嵌入式系统开发中不具备的环节B A、系统总体开发 B、数据库设计 C、嵌入式硬件开发 D、嵌入式软件开发 11在嵌入式系统开发过程中下面哪项为错误的说法B A、对于有些硬件和软件都可以实现的功能,需要在成本和性能上做出抉择 B、对实时性要求非常高的产品可以选择嵌入式Linux开发环境 C、嵌入式系统的软件开发与通常软件开发的区别主要在于软件实现部分 D、嵌入式系统的软件开发可分为交叉编译和交叉调试两部分 12对于Linux操作系统,下面哪项说法是错误的D A、是一种开源的操作系统 B、提供了强大的应用程序开发环境 C、可以免费使用 D、不支持Sparc硬件平台 13使用命令chmod的数字设置,可以改变C A、文件的访问特权 B、目录的访问特权 C、文件/目录的访问特权 14修改文件a.txt的权限,使每个用户都可以读取和写入这个文件,相应命令为A A、chmod666a.txt B、chmod777a.txt C、chmod755a.txt D、chmod555a.txt 15某文件的组外成员的权限为只读;所有者有全部权限;组内的权限为读与写,则该文件的权限为D A、467 B、674 C、476 D、764

嵌入式linux android驱动工程师 面试题总汇

嵌入式linux android驱动工程师面试题总汇 1.嵌入式系统中断服务子程序(ISR)收藏中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 2.C语言中对位的操作,比如对a的第三位清0,第四位置1.本来应该会的,一犯晕写反了,以后注意! #define BIT3 (1<<3) #define BIT4 (1<<4) a &= ~BIT3;a |= BIT4; 3.考到volatile含义并举例: 理解出错,举了很具体的例子,连程序都搬上去了,有些理解不深的没举出来…… volatile表示这个变量会被意想不到的改变,每次用他的时候都会小心的重新读取一遍,不适用寄存器保存的副本。 volatile表示直接存取原始地址 例: 并行设备的硬件寄存器(状态寄存器) 在多线程运行的时候共享变量也要时时更新 一个中断服务子程序中访问到的的非自动变量(不太清楚,正在查找资料ing……) 4.要求设置一绝对地址为0x67a9的整型变量的值为0xaa66

当时我的写法: #define AA *(volatile unsigned long *)0xaa66AA = 0x67a9; 答案: int *ptr =(int *)0xaa66; *ptr = 0x67a9; 我感觉自己写的应该不算错吧(自我感觉,还请达人指正),我写的适合裸机下用,当做寄存器用,而答案就是适合在操作系统下的写法。 1. linux内核里面,内存申请有哪几个函数,各自的区别? 2. IRQ和FIQ有什么区别,在CPU里面是是怎么做的? 3. int *a; char *b; a 和b本身是什么类型? a、b里面本身存放的只是一个地址,难道是这两个地址有不同么? 4.xx的上半部分和下半部分的问题: 讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现? 5.内核函数mmap的实现原理,机制? 6.驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子? 7. spinlock自旋锁是如何实现的? 8.任务调度的机制? 【二、本人碰到】

基于嵌入式Linux的汉字输入法

基于嵌入式Linux的汉字输入法 An Approach to Chinese Input based on Embedded Linux Abstract: The Chinese input problem is essential to an embedded system. An approach to on-line recognition of handwritten Chinese stroke is proposed., including its realization in embedded system. Keywords: handwritten Chinese character recognition; on-line recognition; dynamic recognition; embedded system 摘要:汉字输入法是嵌入式系统输入的一项重要技术,它的功能与性能直接影响到嵌入式系统在中国的推广与应用。主要研究了联机汉字手写体输入法,以及在嵌入式系统中实现汉字手写体输入法。 关键词:手写体识别;联机识别;动态识别;嵌入式系统; .1 引言 在信息时代,嵌入式系统如个人数字助理(PDA)、JAVA手机、人工智能电器等已广泛渗入人们的日常工作和生活中。由于受到键盘大小和按键数目的限制,汉字输入是影响嵌入式系统使用的重要因素。具有强烈人性化的手写汉字输入是解决嵌入式系统汉字输入问题的最佳方法之一。随着硬件成本的降低和汉字手写体识别技术的提高,汉字手写识别在嵌入式系统的应用将会日益广泛。 嵌入式系统是硬件资源受限系统,所以汉字手写体识别应考虑到嵌入式系统这个特点。其中比较重要的是,嵌入式系统的硬件配置低,除了考虑汉字识别的识别率外,还必须考虑输入的速度。手写汉字的输入时间包括书写时间和识别时间两部分,一般以前者所耗时间较多。当前市面上融合嵌入式手写汉字输入法的产品如PDA、智能手机、智能数码相机等几乎都在整个汉字书写完毕后才出现识别结果,所以即使系统的识别速度很快,也需要把整个汉字写完,因此整体的输入速度始终没有质的提高。针对上述问题,本文提出了一种基于汉字笔顺的联机动态手写汉字识别方法,在人们书写汉字的过程中,对其已经书写的部分汉字笔划进行动态识别,预测其想要书写的汉字并输出给用户选择,并且集成弹性网格特征法,以达到在保证识别率的前提下提高整体输入速度目的。本文主要进行以下几项工作:

嵌入式Linux应用程序开发测试题

嵌入式Linux应用程序开发测试题(14级嵌入式方向专用) 一、选择题 1、下列哪一项不是嵌入式操作系统的特点D A、占有资源少 B、低成本 C、高可靠性 D、交互性 2、在Linux内核配置过程中,下面哪项命令采用的是基于图形窗口模式的配置 界面C A、make config B、make menuconfig C、make xconfig D、make oldconfig 3、在Linux内核配置过程中,下面哪项命令建立依赖关系C A、make config B、make menuconfig C、make dep D、make clean 4、交叉编译器中,下面哪项不是必需包含的D A、glibc B、gcc C、binutils D、tmake 5、内核的编译主要步骤不包括下面哪项D A、内核配置 B、建立依存关系 C、建立内核 D、加载内核 6、内核编译时选项前的尖括号中可以是空,*,M,其中*表示C A、选项将编译为模块 B、不包含选项 C、包含选项 7、Bootloader的stage1阶段主要完成的工作不包括下面哪项D A、基本的硬件初始化 B、为加载stage2准备RAM空间 C、拷贝stage2到RAM中 D、用汇编语言跳转到main入口函数 8、GCC的正确编译流程为A A、预处理-编译-汇编-链接 B、预处理-编译-链接-汇编

C、预处理-链接-编译-汇编 D、编译-预处理-汇编-链接 9、如需GCC提供编译过程中所有有用的报警信息,则在编译时应加入选项B A、-w B、-Wall C、-werror D、-error 10、下面哪些与GDB相关的说法是错误的B A、GDB能调试可执行文件 B、GDB能调试源代码 C、GDB对编译过程有要求D、GDB支持交叉调试 11、在GDB调试过程中,使用下面哪项命令设置断点,其中m代表行号A A、b m B、c m C、n m D、s m 12、open函数原型中的O_RDWR标志表示文件打开方式为C A、只读方式打开文件 B、可写方式打开文件 C、读写方式打开文件 D、以添加方式打开文件,在打开文件的同时,文件指针指向文件末尾 13、在Linux操作系统中,串口设备的设备名一般为C A、com1 B、port1 C、ttyS0 D、serl1 14、下面哪项对Linux操作系统下fork函数的描述是错误的D A、fork函数执行一次返回两个值 B、新进程称为子进程,而原进程称为父进程 C、父进程返回值为子进程的进程号 D、子进程返回值为父进程的进程号 15、编写守护进程的第一步为A A、创建子进程,父进程退出 B、在子进程中创建新会话 C、改变当前目录为根目录 D、关闭文件描述符 16、在关于TCP/UDP的描述中,下面哪项是错误的C A、TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递

嵌入式LINUX四按键驱动

对一个具有四个按键的按键驱动的分析 源代码: /*Headers-------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef CONFIG_DEVFS_FS #include #endif /*V ars----------------------------------------------------*/ #define DEVICE_NAME "buttons" #define EXTINT_OFF (IRQ_EINT4 - 4) unsigned int buttons_major=0; unsigned int buttons_minor=0; unsigned int type = IRQT_FALLING; struct button_info { unsigned int irq_no; unsigned int gpio_port; unsigned int IN; int button_no; }; struct button_info realarm_button_info[4] = { { IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG11_INP, 1 }, { IRQ_EINT8, S3C2410_GPG0, S3C2410_GPG0_INP, 2 },

相关主题
文本预览
相关文档 最新文档