S3C6410

2024-09-30

S3C6410(精选7篇)

S3C6410 篇1

嵌入式系统已经广泛应用于消费类电子产品的设计中,该文提出了基于S3C6410和Linux为平台的嵌入式遥控小车,利用L298N电机驱动芯片驱动两个直流电机,通过Boa嵌入式web服务器实现对小车的远程控制。该文分三个部分:硬件系统设计与实现部分说明了L298N硬件电路的基本构成;驱动程序和应用程序部分详细讲述了L298N及PWM定时器底层驱动的编写与小车控制应用程序的编写;Boa嵌入式web服务器部分描述了网页程序及如何将控制参数传递给底层驱动。

遥控小车的总体构如图1所示:

1 硬件系统设计与实现

为了避免复杂的外围电路,我们选用了L298N,它是SGS公司的产品,内部集成2路H桥电路的电机驱动专用芯片,电路简单,使用方便,可以驱动两个直流电机。L298N典型应用电路如图2所示,L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7 V电压,我们选用4节5号电池串联起来的电池组以驱动内部逻辑电路工作。4脚VS接电源电压,VS电压范围VIH为+2.5~46 V,输出电流可达2.5 A,是供电机工作的主电源,我们选用的是南孚6LR61型号的9V电池。1脚和15脚是输出电流反馈引脚,这两个引脚可以直接接地。L298N分别通过OUT1,OUT2和OUT3,OUT4连接两电动机。5,7,10,12脚接输入控制电平,控制电机的正反转,我们使用S3C6410处理器的四个GPIO接口连接L298N这四个控制输入端,从而控制左右两个电机的运动;ENA,ENB接控制使能端,控制电机的停转;对于电机的调速,我们采用PWM调速的方法,其原理是开关管在一个周期内的导通时间为t,周期为T,则电机两端的电压U=Vcc*(t/T);电机的转速与电机两端的电压成比例,我们可以通过调整占空比来调整电机的转速;这里我们将S3C6410的TOUT1输出给L298N使能端EN A和EN B。

2 驱动程序与应用程序的设计与实现

L298N可以分别控制2个直流电机的正转、反转、刹车和停止,两组电机的控制信号分别是EN A、IN1、IN2、OUT1、OUT2和EN B、IN3、IN4、OUT3、OUT4;当EN A/EN B输入PWM使能信号时,电机的转动与输入控制信号的逻辑关系如表1所示:

由表1可知,当我们在OUT1,OUT2端接好左电机时,如果IN1端输入高电平,IN2端输入低电平,EN A端输入PWM信号时,左电机正转。IN1端输入低电平,IN2端输入高电平,EN A端输入PWM信号时,左电机反转,右电机的控制原理也一样。

根据L298N电机驱动芯片使用文档[1]、S3C6410芯片手册[2]、mini6410使用手册[3],将S3C64XX_GPQ3、S3C64XX_GPQ4、S3C64XX_GPQ5、S3C64XX_GPQ6分别与L298N芯片的IN1、IN2、IN3、IN4输入端相连接;

#define L_IN1 S3C64XX_GPQ(3)

#define L_IN2 S3C64XX_GPQ(4)

#define R_IN1 S3C64XX_GPQ(5)

#define R_IN2 S3C64XX_GPQ(6)

在驱动程序的初始化函数static int__init dev_init(void)中将S3C64XX_GPQ3、S3C64XX_GPQ4、S3C64XX_GPQ5、S3C64XX_GPQ6这4个GPIO接口配置为输出模式,并置初始值为0:

gpio_direction_output(L_IN1,0x0);

gpio_direction_output(L_IN2,0x0);

gpio_direction_output(R_IN1,0x0);

gpio_direction_output(R_IN2,0x0);

为了控制电机转速的快慢,我们通过脉宽调制PWM的方式控制。我们使用的S3C6410的GPIO引脚分配表[2],有2个PWM输出引脚,即GPF14,GPF15引脚分别对应于TOUT0、TOUT1的输出;TOUT0直接与蜂鸣器相连接[3],所以我们选择TOUT1作为PWM的信号输出端,与A PWM和B PWM相连。根据TOUT1PWM定时器1的使用步骤包括[2]:设置预分频值50和分频值16、设置比较寄存器值为8192、设置计数寄存器值为16384、启动定时器,清除手动更新位等[2]。在设备模块初始化函数里实现这些步骤。

1)初始化PWM1控制模块的主要代码如下:

2)电机调速函数static void PWM_Set_Speed的主要代码如下:

__raw_writel(PWM_TCNT/2+rapid,S3C_TCMPB(PWM_TIMER1));

分别用命令字1、2、3、4、5、6表示小车的前进、后退,左转、右转、停止及调速。根据上表1,写出小车运转状态的主要源代码如下:

小车控制程序car_app的作用是岔气网页控制页面传递的控制命令字和调速参数,调用驱动模块提供的ioctl函数控制小车的运动状态及车速。小车控制程序的主要源代码如下:

其中type=5停止,type=1前进,type=2后退,type=3左转,type=4右转;当type等于6时,speed=0表示正常速度,speed=1表示加速,speed=2表示减速。

3 Boa嵌入式web服务器的搭建

为了能够在远程控制小车的运行,需要在开发板上安装web服务器,我们选择Boa作为嵌入式web服务器[4],可以通过http://www.boa.org/网址下载最新的源代码,编译及安装过程可以参考http://www.boa.org/documentation/。Boa web服务器将安装开发板的/root/boa目录下。

网页页面大小为480x320,这样大部分智能手机都可以控制小车,在网页的上部放放置两个按钮用来给小车加速或减速,加速按钮定位在100px,5px,减速按钮定位在300px,5px;在网页的下部提供前进、后退、左转、右转、停止五个按钮以控制小车的运行,前进按钮定位在200px,70px,后退按钮定位在200px,210px,左转按钮定位在100px,140px,右转按钮定位在300px,140px,停止按钮定位在200px,140px;这七个按钮的尽寸均为60x60。图3表明了如何将网页上的按钮事件转换为小车控制参数的过程。

网页控制界面(car-ctl.html)的主要源代码如下,以前进按钮为例,其它按钮类似修改:

以上代码表示,当前进按钮被摁下时,将会执行web服务器里的do_forward脚本,而do_forward脚本将会调用驱动程序控制小车前进。后退、左转、右转、停止、加速及减速按钮分别执行do_back、do_left、do_right、do_stop、do_faster、do_slower脚本以控制小车的运行状态;这些脚本将不同的命令参数、电机调速参数传递给小车控制程序car_app,以前进脚本forward.cgi为例:

do_back、do_left、do_right、do_stop脚本中第一个参数分别2、3、4、5,调速参数为0;do_faster脚本的命令参数为6,调速参数为1;do_slower脚本的命令参数为6,调速参数为2。

4 部署

以上所有程序都做好之后,登陆开发板,将编译好的电驱动car_drv.ko和小车控制程序car_app上载开发板的/root/目录下。将car-ctl.html网页文件拷贝到/root/boa/www/目录,再进入/root/boa/www/cgi-bin/目录下,将do_forward、do_back、do_left、do_right、do_stop、do_faster、do_slower文件拷贝到此目录。通过执行chmod+x文件名,赋予以上文件可执行权限,最后在开发板的命令行上执行如下命令:

insmod/root/car_drv.ko/root/boa/boa&

/root/boa/boa&

以上所有步骤如无误完成的话,给开发板接上电池,一路4节串联的5号电池组给开发板供电,另一路为南孚6LR61 9V电池给电机供电;将无线网卡连接至开发板,并配置IP地址为192.168.1.99,具体步骤可参考mini6410用户手册[3]。打开智能手机的web浏览器,输入http://192.168.1.99/car-ctl.html,即可远程控制小车了。

5 结论

随着智能手机等手持终端设备功能日益强大、无线网络的快速覆盖,基于智能手机控制的技术应用必将成为消费类应用的热点。该文基于s3c6410处理器和嵌入式Linux操作系统,设计并制作出了遥控小车。智能手机通过wifi网络来控制小车的运动并调速,运行结果表明该设计方案运行可靠方便,可以直接用手机等设备控制。

参考文献

[1]STMicroelectronics.L298N datasheet[EB/OL].[2011-11-03].http://www.st.com.

[2]samsung.S3C6410X datasheet v1.10[EB/OL][2008-08-22].http://www.samsung.com.

[3]mini6410用户手册[Z].广州:友善之臂计算机科技有限公司,2011.

[4]Larry Doolittle,Jon Nelson.Boa Official Website.[2012-05-01].http://www.boa.org.

S3C6410 篇2

电子技术、嵌入式计算、通信技术的发展使液晶显示器 (LCD) 的应用越来越广泛, LCD以功耗低、显示信息量大、易于色彩化、使用寿命长等特点很快取代了其它显示输出设备。通过对S3C6410处理器LCD初始化、S3C6410处理器LCD初始化程序的研究, 本文以S3C6410处理器和s70液晶显示器为基础平台, 着重介绍硬件模块和软件模块的设计。

2 硬件设计

S3C6410显示控制器转换图像数据的逻辑是从本地总线的后处理器 (Post Processor) 或系统内存的视频缓冲区到外部LCD驱动器接口传输图像数据。LCD驱动有四种接口, 如传统的RGB接口, I80接口, NTSC/PAL标准TV编码器接口和IT-R BT.601接口。显示控制器支持5层图像窗口。覆盖图像窗口支持多种颜色格式、16级alpha混合、color key, 横纵坐标位置控制, 软滚动, 可变窗口尺寸等。[2]。

(1) GPIO

S3C6410包含了187个多功能输入/输出端口管脚。这些管脚用于对CPU与外设进行连接, 并通过相应的GPIO寄存器配置管脚功能。连接LCD的GPIO使用了GPI和GPJ, 并且要对GPI和GPJ分别初始化为0XAAAAAAAA和0X00AAAAAA。

(2) LCD控制器寄存器

S3C6410显示控制器支持两种显示模式:正常模式和BY-PASS模式。系统复位后, LCD控制器初始输出路径是BY-PASS, 为了在常规显示模式下运行, 需将地址0X7410800C的第三位设置为“0”。同时还要初始化另一个特殊功能寄存器———将0x74F0081A0设置为“01”, 即使用RGB I/F类型。

(3) LCD时序寄存器参数

LCD时序寄存器参数的选择要依据对应的LCD数据手册进行设置。寄存器参数与数据手册推荐值之间的关系如表所示。

3 软件设计

本系统软件的设计分为两个重要部分, 第一部分是初始化6410平台上的时钟、SDRAM等硬件, 第二部分对LCD相关的IO和功能控制寄存器初始化。

首先, 系统加电之后可以根据跳线设置选择从SD卡或者Nand Flash中开始执行程序, 并且完成初始化硬件设备, 例如初始化系统时钟、IO端口等, 下面主要对LCD的初始化进行说明。

(1) 与LCD相关IO端口初始化

正确配置IO端口, 使LCD可以与处理器正常连接, 这是LCD使用前必须的准备工作。依据芯片的数据手册可知LCD控制和数据传输管脚通过GPI和GPJ两组IO端口与6410处理器连接的, 并进行下面的初始化。

(2) 特殊功能寄存器

显示控制器有一个用于转换图像数据的逻辑, 这个逻辑是指从本地总线的后处理器或系统内存内的帧缓冲区到外部LCD驱动器接口的传输图像数据的逻辑。复位以后, LCD控制器初始输出路径是BY-PASS, 为了在常规显示模式下运行, 特殊功能寄存器MIFPCON的第三个二进制位必须设置为“0”。还要使SPCON的LCD_SEL初始化为01, 即LCD I/F管脚组态设置为RGB I/F形态。

(3) 显示控制器初始化

6410显示控制器最多支持5个窗口层显示数据, 可以在同一时间对同一个索引混合五个窗口层。每个窗口层和颜色都可以由混合Alpha值寄存器控制。下面以窗口0为例初始化显示控制器为24位色、分辨率800*480。

综上所述, 通过对S3C6410的GPIO、LCD寄存器和时序参数的初始化, 可以使得LCD进行各种显示操作, 分辨率和颜色数据能正确显示。驱动程序运行稳定, 能可靠地完成处理器与LCD之间的数据传输。

摘要:研究了基于ARM的处理器对4.3寸LCD、7.0寸LCD初始化程序, 提出了一种驱动LCD的编程模式。设计中采用具有ARM11内核的S3C6410等芯片进行相关的硬件设计, 使用GNU编译器进行软件程序设计, 在此基础上, 专门设计了测试程序用于测试程序的正确性和有效性。

关键词:ARM,显示控制器,驱动程序

参考文献

[1]S3C6410X RISC Microprocessor User's Manual[EB/OL].

[2]王国伟, 曾碧, 谭昌盛.基于S3C6410的H.264视频采集传输系统[J].微计算机信息, 2011, 5.

[3]邓中亮等.基于S3C6410和无线传感器网络的手持终端设计[J].电子设计工程, 2011, 2.

S3C6410 篇3

1 系统总体结构

本文的目的是设计一个无线视频通信系统, 系统主要由三个部分组成, 如图1所示发送设备, 无线信道和接收设备。由于本系统的工作模式是点对点全双工模式, 每个终端都可以同时传输和显示图像, 其发送和接收设备在某一时刻只是功能上的相对不同, 其硬件结构二者相同, 都具有视频传输和接收的装置。针对某一时刻而言, 发送设备的视频采集模块采用CMOS摄像头, 把采集到的视频数据传输到S3C6410, 使用S3C6410的硬件编码器进行H.264编码, 以便传输。无线收发模块用于收发视频数据。接收设备将接收到的数据利用S3C6410的硬件解码器进行解压缩处理后, 恢复出原始数据, 并把数据在视频LCD上显示。

2 系统硬件设计

无线视频传输硬件部分在板局分布上分为核心部分和扩展部分。核心部分由主控模块、视频显示模块组成。扩展部分由视频采集模块, 无线传输模构成。

2.1 主控模块

主控模块是整个无线视频传输的核心, 负责控制视频采集模块进行图像采集, 完成对采集到的图像进行H.264视频编码, 并控制无线传输模块发送封装后的视频数据。另外, 在接收方面, 它还可以控制wifi模块对信道中的视频数据进行接收解码并显示到LCD屏幕上。主控模块包含主控芯片模块、电源管理模块、时钟模块、和SDRAM存储模块, RS232接口、Camera接口, wifi接口。

主控模块采用三星公司的S3C6410处理器作为主控制器。该处理器含有主频533M的ARM1176JZF-S, 同时集成了硬件编解码器 (MFC) 对采集到的数据进行编码解码、LCD控制器等硬件外设。

2.2 视频采集模块

视频采集模块采用OV9650, 一种CMOS图像彩色传感器。OV9650被广泛应用于网络摄像头、可视电话、数码相机等电子产品。该摄像头最高像素为130W, 最大图像转换速率为SXGA 15fps, VGA 30fps, QVGA60fps, QCIF120pfs;输出数据格式包括YUV/YCbCr 4:2:2、YCrCb、RGB三种, 能够满足一般图像采集系统的要求。OV9650内部具有可编程功能寄存器, 其设置有上电模式和SCCB编程模式。本次设计控制采用SCCB协议, 连续扫描, 输出8位YUV数据格式。

2.3 无线传输模块

无线传输模块采用芯片WM-G-MR-09, 它支持IEEE 802.11 b/g协议, 采用OFDM调制方式, WPA加密, 最大速率支持54Mbps, 满足视频传输的需求。本系统采用WLAN中的wi-fi技术, 工作在2.4GHz频段。

2.4 视频显示模块

由于S3C6410有一个LCD控制器, 因此我们利用S3C6410的LCD控制器来显示视频。利用帧缓存技术将视频数据放入显示缓存中, 然后再显示到4.3寸彩色液晶屏幕上面。

3 系统软件设计

无线视频传输软件部分分为底层软件和应用软件。

3.1 底层软件设计

底层软件主要完成操作系统、驱动程序和文件系统的移植。对于系统的编译, 采用交叉编译器为arm-linux-gcc-4.2.2。

操作系统采用Linux内核版本为2.6.32。驱动设计部分的MFC模块驱动、USB OTG作为主机接口的驱动由Samsung公司提供, 可添加到内核当中。在内核配置中, 选择视频设备的UVC驱动选项以支持视频采集模块, 选择wlan驱动选项以支持无线传输模块, 选择帧缓存驱动选项以支持LCD显示缓存。内核配置完成后, 编译并移植到硬件系统上。

3.2 应用层软件设计

应用层软件设计主要完成视频采集、H.264视频编码、数据无线传输、H.264视频解码, 视频显示功能。

3.2.1 视频采集显示

Linux内核中关于视频设备的API———V4L2 (video for Linux two) , 具有对视频设备进行打开, 处理数据, 和关闭视频设备的功能。摄像头对应的设备文件在/dev/video0下。其操作流程如下流程图2所示:首先用open函数打开视频设备, 取得设备的capability, 如设备支持的最大最小分辨率、亮度、对比度等信息。在初始化过程中利用cam_p_init () 函数, cam_c_init () 函数对摄像头预览和摄像头编码进行初始化。然后再设置输出视频的制式和帧格式, 利用fb_init函数向驱动申请帧缓冲, 并将采集到的数据显示到LCD屏幕上面。下一步开始采集视频, 取得视频帧的原始数据, 将缓冲重新入队列尾, 以便循环采集。采集完成的数据为8位的YUV格式送入地址指针为g_yuv的内存和framebuffer里面, 分别对采集到的数据进行编码和显示。对其编码采集完成后用close函数关闭视频设备。

3.2.2 H.264视频编码

6410有内建的硬件编码器, 因此对于H.264的视频编码, 调用MFC的API对摄像头采集到的数据进行编码。对采集到的视频进行编码是在另外一个线程encoding_thread里面进行的。程序流程图如图3所示。

在该线程中, 利用线程互斥锁防止编码的数据被采集的数据覆盖掉。然后调用SsbSipH264EncodeInit函数对264编码器进行初始化。编码方面, 使用SsbSipH264EncodeGetInBuf函数得到编码器输入数据的缓存, 然后再将g_yuv内存中的YUV格式的数据拷贝到编码器的输入缓存中。利用SsbSipH264EncodeExe函数对数据进行H.264的编码;对于是第一帧数据编码的情况, 使用函数SsbSipH264EncodeGetConfig得到流媒体的信息。将编码后的数据使用SsbSipH264EncodeGetOutBuf函数放入编码器的输出缓存中, 完成对YUV数据的编码。输出数据存放在内存指针为encoded_buf的内存中以便网络发送线程send_thread线程进行发送。

当编码完成后, 调用SsbSipH264EncodeDeInit函数来释放编码器, 释放线程互斥锁。

3.2.3 数据无线传输

无线传输部分分为两个子部分, 利用socket网络

编程的client/server模型对传输部分进行编程。在发送端创建线程send_thread用于发送, 在接收端创建线程recv_thread用于接收。

3.2.3. 1 发送端

发送端为服务器模型。

在该线程中, 先将编码后的数据拷贝到M_PoolData所指向的内存中, 然后利用socket函数创建socket套接字, 定义发送方式为UDP发送, 定义端口号, 定义服务器端可以接收的客户端IP地址。然后, 使用bind函数绑定套接字, 等待客户端的请求, 如果没有请求, 则线程阻塞;如果有请求, 则服务器端对请求进行服务应答, 使用sendto函数将M_PoolData里面的数据发送出去。发送完成后, 利用close函数关闭套接字, 并且关闭线程互斥锁。

3.2.3. 2 接收端

接收端为客户端模型。

在该线程中, 利用socket函数创建套接字, 然后设置服务器端IP和端口号。设置接收方式为UDP方式。利用bind函数绑定套接字。利用sendto函数发送数据客户端的数据请求。如果服务器端收到请求并对请求应答, 则接收到数据, 将接收到的数据放入接收缓存recvbuf中, 如果接收完成, 则关闭套接字。

3.2.4 H.264视频解码与显示

解码是编码的逆过程。接收端同样采用S3C6410处理器。利用S3C6410内建的解码器对接收到的数据进行解码, 并且显示到LCD上面。程序的流程图如图4所示。

在该线程中, 打开线程互斥锁, 防止解码的数据输入缓存P_stream中的数据被接收的数据覆盖掉。然后初始化解码器, 调用SsbSipH264EncodeInit函数创建一个解码句柄。然后使用SsbSipH264DecodeGetInBuf函数来获得解码器的输入缓存的指针。此时, 将接收到的数据拷贝到该缓存中。然后配置刚才创建的解码句柄。再利用SsbSipH264DecodeGetConfig函数配置流媒体选项。然后对post processor进行初始化以方便LCD屏幕显示解码后的数据。下一步, 初始化LCD控制, 获得LCDbuffer的地址, 配置OSD。解码方面, 使用SsbSipH264DecodeExe函数对接收到的数据进行解码, 使用SsbSipVC1DecodeGetConfig函数配置解码输出缓存。输出YUV格式的数据存放在内存指针为decoded_buf的内存中以便LCD显示。解码结束后, 释放线程互斥锁, 释放解码器。

结束语

本文设计的无线视频实时通信系统, 集合了无线通信技术、视频压缩技术、实时传输技术和点对点互联技术等多种先进技术。利用ov9650的采集和S3C6410的硬件编解码以及无线传输模块, 很好的实现了无线视频监控的功能。本系统也可以进一步改进, 增加音频的通信, 和视频回放功能, 使得音频和视频同步通信, 提高它的灵活性、实用性和可扩展性, 实现更大的商用价值, 获得广阔的市场前景。

摘要:选用S3C6410处理器为硬件平台, 嵌入式Linux操作系统为软件平台, 对采集到的实时图像进行H.264视频编码, 通过3G中的分支—wi-fi传输, 设计并实现了一个无线视频传输系统。

关键词:S3C6410,H.264,无线视频传输,嵌入式,Linux

参考文献

[1]陈友荣, 杨海波, 程菊花, 郑国惠.基于Linux的无线视频传输系统设计与实现.中国有线电视, 2010, (9) :1048

[2]杜春雷.ARM体系结构与编程.北京:清华大学出版社, 2003.25~27

[3]王阳.基于H.264/AvC的嵌入式网络监视系统的研究.中国优秀硕士学位论文全文数据库:大连理工大学硕士论文.2009:55~57

[4]孙红波.A R M与嵌入式系统.北京:电子工业出版社, 2005:28~62

[5]马燕, 李存, 李晓勇, 刘海涛.基于ARM平台的多媒体播放器的设计与实现.计算机工程, 2006, 12

[6]张秋林, 夏靖波, 邱婧, 胡图.基于ARM和FPGA的双路远程视频监控系统设计.液晶与显示, 2011, 26 (6) :780~784

[7]吕金刚, 杨建全, 文代明.智能视频监控技术的应用与发展.通信电源技术, 2006, (5) :62~67

[8]郝继辉.网络视频监控技术的发展和展望.中国科技信息, 2007, (7) :97~99

[9]张翔, 张宁.基于IP视频监控应用的H.264视频压缩.工业控制计算机2003, (12) :28~30

S3C6410 篇4

关键词:视频监控,S3C6410,MPEG-4,实时传输协议

视频监控的应用领域日益广泛。随着电子信息技术、多媒体技术以及网络技术的快速发展,嵌入式视频监控技术也得到了快速的发展。相比较传统的监控系统,嵌入式监控系统具有成本低,小巧灵活,高可靠性等特点[1,2]。本文以三星S3C6410微处理器为基础处理器ARM11,实现了一种简单高效的视频监控系统。系统既可以使用网线进行传输,也可以采用无线USB网卡进行无线传输。本文在说明系统框架的同时,着重对系统实现的具体软件进行了说明。

1 系统的组成和工作原理

嵌入式视频监控系统由硬件部分和软件部分组成。硬件部分由视频采集模块、视频编码模块、网络传输模块以及嵌入式处理器模块组成;软件部分基于嵌入式操作系统平台,包括视频数据采集模块、视频编码模块和网络传输模块等。

系统的总体设计原理为:通过OV9653的130万像素摄像头采集视频数据,然后将视频数据发送到S3C6410的MFC(多媒体格式编解码)模块进行视频编码后,得到MPEG-4视频流,最后将数据通过网络模块发送到接收端。系统组成框图如图1所示。

2 系统的硬件设计

2.1 数据采集模块

视频采集模块采用OV9653摄像头传感器。OV9653摄像头传感器是低电压的CMOS图像传感器。采集图像的输出格式[3]可以是YUV/YCbCr4∶2∶2或者RGB 4∶2∶2。

2.2 视频编码模块

系统基于ARMSYS6410开发板开发。ARM-SYS6410开发板以三星S3C6410微处理器(ARM1176JZF-S内核)为核心[4]。

利用S3C6410提供的MFC(多媒体格式编解码)模块进行编码,将OV9653采集到的YUV格式数据编码成MPEG-4格式数据流。同时,也可以将OV9653采集的RGB格式的数据直接显示在LCD屏上。

2.3 网络传输模块

基于S3C6410微处理器的ARMSYS6410开发板提供了1路10M/100M网络接口,1路USB2.0-OTG,1路USB Host[4]。在网络传输模块中可以直接使用网络接口来进行有线的网络数据传输,也可以使用USB接口的网络卡来进行无线的数据传输。区别只是在软件部分使用的驱动不同,而对程序的结构没有任何影响。

2.4 嵌入式处理器模块[4]

三星S3C6410微处理器(ARM1176JZF-S内核)是一款高性能的多媒体应用处理器,具有强大的硬件多媒体格式编解码单元(MFC),完善的外部设备,同时拥有高达667 MHz的运行频率。

3 系统的软件设计

嵌入式操作系统是嵌入式系统的重要组成部分,为应用程序的开发提供了一个软件平台。由于Linux系统具有良好的可裁剪和可移植等特性,目前较多地采用Linux系统来进行嵌入式系统的开发[5]。

基于S3C6410的ARMSYS6410开发板,已经提供了基于Linux 2.6.28内核的操作系统源码。通过对内核各个功能模块进行裁剪,编译出镜像文件,然后下载到开发板上,即可实现Linux嵌入式操作系统以及相应的驱动程序的移植[6]。

系统的整体数据流如图2所示[7]。图中①表示原始数据从外部摄像头到摄像头驱动模块。②表示数据由驱动模块经过处理传输到内存。此时数据可以有不同的格式。③表示数据从内存中传送给视频编码模块的输入缓冲区。④表示MFC编码模块从输入缓冲区读取数据进行MPEG-4编码。⑤表示编码结束后将数据传送到视频编码模块的输出缓冲区。⑥表示从视频编码的输出缓冲区读取编码后的数据传送给网络传输模块进行传输。

在此需要注意的是,图示中的视频输入缓冲区对于解码模块是输入缓冲区,但是对于编码模块却是输出缓冲区。对于图示中的输出缓冲区也同样如此。

3.1 视频数据采集程序

视频采集程序使用内存映射的方式进行读取。通过内存映射直接把设备文件映射到内存中,绕过内核缓冲区,进程访问设备文件时和访问普通内存一样,极大的提高了视频数据的读取速度[8]。

视频采集部分的流程图如图3所示。下面列出视频采集部分的关键代码。

首先打开设备,其中CODEC_NODE为预定义宏,表示摄像头结点文件路径。

dev_fp=open(CODEC_NODE,O_RDWR);

在设置参数部分,首先要得到设备能力参数,检查是否具有所需的功能,然后再进行参数的设置。使用下面的代码来实现。

ioctl(dev_fp,VIDIOC_QUERYCAP,&cap);

上一行代码得到设备的功能信息,存储到参数cap中。在检查设备具有所需功能后,下一行代码进行参数设置。

ioctl(dev_fp,VIDIOC_S_FMT,&codec_fmt);

其中,codec_fmt为一个格式信息的结构体类型参数。

在Linux平台,采集图像数据部分的实现方式与文件读取类似,采用下面的代码实现。

read(dev_fp,g_yuv,YUV_FR_BUF_SIZE);

而将数据传送给MFC模块这部分,可以采取直接共享缓冲区的方式,这样减少了一次数据在内存中的传输,增加了效率。

最后是关闭设备文件。先停止图像的采集,然后关闭文件。

ioctl(dev_fp,VIDIOC_STREAMOFF,&start);

close(dev_fp);

上述代码片段是视频采集部分的关键代码段。在实现部分还有很多的条件判断和分支选择等控制流程部分,这里不进行详细描述。

3.2 视频编码程序

视频编码部分直接采用S3C6410的MFC视频编解码模块进行视频的编码。由于采用硬件编码,编码效率非常高。同时在程序的设计方面,不用涉及具体的硬件细节,只需要通过S3C6410提供的驱动模块进行。编码部分的流程图如图4所示。

下面列出视频编码部分的关键代码。

hOpen=open(MFC_DEV_NAME,O_RDWR|O_NDE-LAY);

上一行代码打开MFC设备。由预定义的宏MFC_DEV_NAME指定MFC设备文件路径。

模块的初始化部分需要指定编码帧的长宽,编码帧的速率等参数。初始化的这些信息并没有直接应用于设备,而是存储于一个编码参数的结构体类型参数pCTX中,然后用下面的代码进行参数设置,也即将参数应用于实际的设备。

ioctl(pCTX->hOpen,cmd_init,&mfc_args);

编码部分用下一行代码实现。

ioctl(pCTX->hOpen,cmd_exe,&mfc_args);

在编码完成后,可以通过函数获取编码后视频帧的内存地址。函数原型为:

void*SsbSipMPEG4EncodeGetOutBuf(void*openHandle,long*size)。

最后关闭设备文件。

close(pCTX->hOpen);

同样,对于一些流程控制部分的代码,限于篇幅,没有进行详细的描述。

3.3 网络传输程序

网络部分采用RTP实时传输协议进行视频数据的传输。RTP(Real-time Transport Protocol)是用于网络多媒体数据流的一种传输协议[9]。为了使系统的实现更简单和稳定,采用已有的RTP库进行程序的开发。本系统选用开源的C语言库oRTP进行开发。

oRTP库是对RTP协议的一种实现,完全采用C语言编写。oRTP库使用简单易用的接口,实现了RTP协议,可以工作于Linux,Windows等多个平台[10]。

系统网络传输模块的流程比较简单。模块首先初始化oRTP库,然后传输数据,在传输完成后释放oR-TP库资源。由于模块流程较简单,在此就不列出系统的流程图,仅针对具体的实现进行说明。下面列出网络传输模块的关键代码。在传输数据之前,要对oRTP库进行一些基本的初始化操作。首先对时间戳进行初始化,采用下面的一行代码实现。

m_nUser_Timestamp=0;

然后,调用oRTP库提供的初始化接口函数:

ortp_init();

ortp_scheduler_init();

在完成基本的初始化后,创建一个新的rtp会话对象,并且设置会话对象的一些参数和属性。

session=rtp_session_new(RTP_SESSION_SENDONLY);

上面的代码创建了一个新的rtp会话对象,接下来用下面的函数对session进行参数和属性的设置。

上面的函数依次对rtp会话对象的调度管理、阻塞模式、发送目的地址和负载类型进行设置。限于篇幅,略去了调用参数。

发送数据调用库函数:

rtp_session_send_with_ts();

在发送数据完成后,销毁rtp会话对象,然后释放oRTP库的资源。

rtp_session_destroy(session);

ortp_exit();

在网络传输模块中需要注意的是,由于RTP协议对数据包的大小是有限制的,所以如果传输的视频帧过大,需要进行分包传输处理。

4 结语

S3C6410 篇5

RFID(Radio Frequency Identification) 即射频识别技术,可通过无线电讯号识别特定目标并读写相关数据。国内大多数城市的公交车上都使用了具备RFID技术的电子车票,电子车票一般采用非接触式IC卡,具有使用方便、防伪性高、结算安全的特点。读卡器的微处理器通常是51单片机或者STM32。由于它们不支持操作系统,数据向服务器传输时需要采用USB口或者串口,操作复杂,所以渐渐难以满足公交系统的需求。所以本文提出了基于S3C6410的公交车读卡器。它移植了Linux系统,移植了Wpa_supplicant, Openssh,Sftp服务,支持多线程操作,可以通过WIFI无线连接到路由器。传输数据简单,快捷。

1硬件设计方案

读卡器CPU采用S3C6410微处理器。 它是一个16/32位RISC微处理器,功耗低,性能高,包括许多硬件外设,如TFT24位真彩色液晶显示控制器、IIC总线接口、通用I/O端口、系统管理器、USBHost、 4通道UART、USB OTG(480Mbps)、4通道定时器、32通道DMA、3通道SD/ MMC Host控制器、IIS总线接口和用于产生时钟的PLL等。其稳定主频667 MHz, 最高时可达到800MHz。系统结构如图1所示

读卡器的LED显示屏上是12个8位数码管来显示数字。采用两个CH452芯片控制。CH452可直接驱动8位数码管,可控制数码管的数字独立闪烁,左移右移, 支持自定义的BCD码,用于显示特殊字符。读卡器的内存为128M的SDRAM,存储外设为256M的Nand Flash和SD卡。 Bootloader、内核镜像,以及文件系统都都通过串口烧写在Nand Flash中。

wifi模块采用了88W8686芯片,通过SDIO接口与cpu连接。88w8686是一款低成本、低功耗的系统级芯片,集成了802.11a/g/b无线射频和基带,MAC, CPU,内存,和主机接口。支持19.2,20,24, 26,38.4,和40Hz的晶体时钟源。具有128MHz的操作频率和两路DMA通道。

射频芯片采用FM1702,通过spi接口与cpu连接。它支持ISO14443 type A协议, 带有512字节的EEPROM,64字节的密钥缓冲区,操作距离可达10cm,电压范围从3V到5V,支持多种加密算法。

2读卡器的软件设计

读卡器的操作系统采用Linux2.6.28.6内核,文件系统为yaffs文件系统。 软件分为3部分:第一部分为LED屏的驱动;第二部分为射频驱动程序;第三部分为裁剪Linux内核,配置各个驱动模块。 移植SFTP,openssh,Wpa_supplicant服务到读卡器上。

LED屏的显示驱动,底层根据Linux下ioctl函数控制IO口,然后根据CH452的时序编写IO口控制驱动。使数码管刷卡时显示剩余金额,消费金额,不刷卡时显示时间。如图2所示。

在射频驱动程序中,采用M1类S50IC卡来进行读卡,写卡。S3C6410通过IO口模拟spi的时序来控制FM1702芯片。 在底层编写spi读函数,spi写函数。然后向上层编写应答,防碰撞,选卡,验证,读块,写块,加值,减值,中止函数。

移植Sftp,openssh,Wpa_supplicant服务到读卡器上时,再linux的环境下, 需要先下载SSH,zlib,openssl,Wpa_ supplicant的源码包。配置后,通过arm- linux-gcc交叉编译出zlib,openssl,然后将这两个库安装到linux环境中。然后交叉编译openssh,Wpa_supplicant 。将编译出的wpa_cli,wpa_passphrase,wpa_ supplicant,和sshd文件拷贝到读卡器的/ usr/sbin目录下,再复制sftp-server到local文件夹下的libexec目录下,然后将wifi驱动所需要的库文件拷贝到lib文件夹下, 以及编译openssh后所生成的一些必要文件拷贝到对应目录下。复制wpa-psk- tkip.conf到etc文件夹下,重命名为wpa_ supplicant.conf。修改这个文件为

路由器参数配置为SSID号:VACD, 安全类型WPA-PSK,安全选项:WPA- PSK,加密方法:AES,密码:12345678。再配置一下IP,读卡器运行wpa_supplicant-B -ieth0 -c/etc/wpa_supplicant.conf命令, 即可连接到路由器。将服务器也连上路由器,,即可通过SSH客户端远程控制读卡器,SFTP客户端上传下载数据。

3结论

S3C6410 篇6

SAMSUNG S3C6410片上AD主要用来监控直流电压, 该AD可设置的采样率偏高, 如果采用中断方式处理会加大系统负载, 如果采用轮询方式, 应用程序设置较精确的采样间隔较困难, 所以对于采集信号的波形数据就显得力不从心。但在一些应用中我们需要采集一些低频信号来监控系统状态, 如果添加专用的AD板可能带来诸如Linux驱动不支持、电磁兼容性不好、设备结构复杂以及成本增加等问题。其实在嵌入式系统中如何利用有限的硬件资源去实现系统所需的功能是一个值得深入研究的问题。

本文提出了一种方案, 该方案仅仅利用S3C6410片上AD与一个定时器就可有效地解决上述问题, 并且可同时采集多路低频信号数据, 配合应用程序则可监控各路信号波形。

1 AD与定时器介绍

S3C6410提供了一个8通道10位或者12位可选的CMOS片上AD转换器, 该转换器可通过软件设置为休眠模式, 以减少功率损失, 其模拟电压输入范围0~3.3V。

S3C6410片上TIMER0是一个16位的定时器, TIMER0与TIMER1共享一个8位预分频器, 但计数器以及控制器是各自独立的。

表1与表2给出了与控制AD和定时器0相关的寄存器信息。

AD的模拟电压输入范围是0~3.3V, 为了采集诸如正弦的交流信号则需要对输入电压进行简单的幅度缩放与添加直流偏置才可有效采集。为了采集低频信号 (本文把采样频率设为1 250Hz) , 我们利用S3C6410的片上TIMER0来生成周期中断信号, 利用该中断信号激发AD采样, 使具有较精确的采样频率, 在中断处理程序中可以灵活设置AD采集的数据通道, 获得的信号波形数据满足系统需求。

2 Linux下驱动程序设计

该驱动程序采用模块方式编写, 属于字符型设备。驱动通过s3c6410_fops提供了open、release、read、ioctl、fasync和poll接口。驱动没有实现write接口, 对AD的控制命令通过ioctl接口设置。

2.1 文件系统接口定义

文件系统接口struct file_operations的成员全部是函数指针, 这些指针指出了设备驱动程序所提供的入口点位置, 它实质上是函数跳转表。对于不需要的函数接口可以直接初始化为NULL , 也可不定义, 但此时将会调用缺省函数。从程序员的角度来说, 写驱动程序的任务之一就是实现file_operations中的函数指针所指向的函数。

本驱动程序定义的file_operations为:

2.2 驱动程序ioctl接口

在ioctl接口中主要处理3个控制命令:选择采样通道 (SELECT_CHANNEL) 、 开始AD采样 (AD_START) 和停止AD采样 (AD_END) 。

AD_START主要实现两个功能:

(1) 配置TIMER0的各相关寄存器:

(2) 激活定时器0的中断, 通过激活TIMER0的中断来开始AD采样:

enable_irq (IRQ_TIMER0) ;

AD_END停止采样主要通过禁止TIMER0的中断来停止AD采样, 并恢复TIMER0寄存器:

TCON=old_reg.regTCON;

2.3 中断处理程序的设计

S3C6410支持多达56个中断源, 这些中断源可来自内部功能模块, 也可来自外部引脚信号。这里选择定时器TIMER0作为内部中断源, TIMER0的中断函数中处理AD数据采集, 在中断函数中先选择AD通道, 然后设置AD的参数, 再读取采样数据。代码实现如下:

在多通道采样时, 必须在开始AD采样与读取数据之间添加延时处理, 因为AD转换需要时间。Linux内核提供了udelay这个延时函数, 可以在微秒级执行延时操作以实现硬件时序同步。

如果采用异步通信的方式读取数据, 需要在中断函数中调用kill_fasync函数向应用层的程序发送异步信号。

2.4 驱动程序的读取接口

Linux驱动的数据访问接口有几种常用的方式:阻塞I/O、I/O复用 (select/poll) 与信号驱动I/O (SIGIO) 。功能完善的驱动程序应该同时支持这3种读取方式。

阻塞I/O是指在执行设备操作时, 若不能获得资源则进程挂起直到满足可操作的条件时再进行操作, 被挂起的进程进入休眠状态。

I/O复用方式通过查询设备状态, 使用户程序获知是否能对设备进行非阻塞的访问, select和poll都需要设备驱动程序中poll接口的支持。

结合阻塞与非阻塞访问, poll函数可较好地解决设备读写, 但是信号驱动I/O方式更有利。信号驱动I/O的含义是:一旦设备就绪则主动通知应用程序。这样应用程序根本就不需要查询设备状态, 这一点非常类似于硬件上“中断”的概念, 该机制可克服阻塞操作带来的延迟与不便。

下面就各种读取方式给出驱动的代码实现。

2.4.1 阻塞I/O读取数据的实现

在Linux驱动程序中, 使用等待队列 (wait queue) 来实现阻塞操作。下面给出驱动的代码实现。

在模块加载函数中初始化等待队列:

以上代码实现了阻塞读取操作, 不过在驱动获得可读取数据之后必须把flag 的值设为1才能使应用程序解除休眠来读取数据, 在数据读取后则必须把flag设为0。

2.4.2 I/O复用读取数据的实现

为了使应用程序能够使用poll或select来查询设备的访问状态, 需要设备驱动程序有poll接口的支持。驱动poll接口中最主要的一个函数是poll_wait, 该函数所做的工作是把当前进程添加到等待列表中。下面是驱动程序的poll接口实现:

注意poll_wait函数并不阻塞, 真正的阻塞动作是由应用层的select或poll函数完成的。

2.4.3 信号驱动I/O读取的实现

信号驱动I/O读取的实现主要利用了异步队列数据结构、fasync_helper函数与kill_fasync函数。下面是驱动实现的代码。

首先实现fasync接口:

3 Linux下测试程序编写

在驱动程序编写完后, 需要编写应用程序对驱动程序进行测试。这里给出一个最简单的测试程序, 旨在说明应用程序调用驱动程序的一般方法。应用程序可以采用3种读取方式中的任意一种来读取数据, 具体采用什么方式取决于实际应用。在此只给出针对信号驱动I/O方式的部分代码。

在实际使用中, 采用该种方式读取数据系统开销很小, 同时可保证信号波形的连续性。

4结语

本文通过S3C6410片上AD与定时器来实现较为复杂的多路信号波形监控, 并结合实际需要讲述了3种I/O读写方式的实现方法, 最后给出了信号驱动I/O方式的相关测试代码, 同时利用信号驱动方式将数据传到应用层做波形图形显示, 如图1所示。

参考文献

[1] (美) W RICHARD STEVENS BILL FENNER.杨继张, 译.UNIX网络编程[M].北京:人民邮电出版社, 2009.

[2] (美) ALESSANDRO RUBINI, JONATHAN CORBET.魏永明, 译.LINUX设备驱动程序[M].北京:中国电力出版社, 2006.

S3C6410 篇7

1 AODV (Ad Hoc on demand distance vector) 协议简介

AODV[2]路由协议是一种按需路由协议, 它结合了DSDV的路由维护机制和DSR的路由发现机制, 是两者结合的产物[3]。它避免了无穷计数的问题, 实现了无环路由, 大量研究结果表明, AODV的性能在大多数场合中要强于其它已有的路由协议, 并且具有存储资源消耗小, 编程容易以及计算量小等优点, 适合资源有限的嵌入式系统[4]。

2 ADOV在嵌入式系统上的移植

2.1 嵌入式Linux系统的移植

在移植之前首先要建立交叉开发环境, 安装交叉编译工具[5]。Linux内核采用较新的Linux 2.6.28内核。Bootloader、Linux内核和文件系统共同构成了基本的、最小的嵌入式Linux系统。

相对于之前的版本, Linux 2.6内核的编译, 只要运行make命令就行。编译前要对内核代码进行一些修改, 主要有如下步骤:

(1) 修改顶层的Makefile文件。

(2) 修改内核MTD分区。必须保持内核MTD分区与vivi的分区相一致, vivi分区中的地址是引导程序、内核映像以及文件系统下载到NandFlash的真正地址。因为内核启动时, 内核并不是去读vivi分区中的地址, 而是去读内核MTD分区设定的地址。需要修改arch/arm/mach-s3c2410/common-smdk.c文件里的函数mtd_partition smdk_default_nand_part[]={}, 使其地址与vivi中的分区地址一致。

(3) 禁止Flash ECC校验。内核中的ECC码是由S3C6410中的Nand Flash控制器产生的, 所以要禁止内核ECC校验。修改s3c6410.c代码中chip->c.mode=NAND_ECC_NONE。

(4) 启动时挂载devfs。为了让内核支持devfs以及在启动/sbin/init运行之前能自动挂载/dev为devfs文件系统, 应在文件fs/Kconfig中找到menu Pseudofilesystem语句, 然后在其后添加:

(5) 匹配vivi和内核的machine ID。vivi传递给内核的machine ID必须与内核代码中的ID一致, 处理器的值定义在/arch/arm/tools/mach-types文件中。

(6) 内核配置在配置内核时, 对需要的功能进行配置和去除不需要的模块, 以此来减小内核体积。运行make menconfig进行配置, 在s3c6410_defconfig默认配置基础上进行裁减。需要加入MTD分区及NandFlash支持、文件系统ramdisk文件系统。对于AdHoc网络, 还需要加上无线网络、无线网卡驱动、USB驱动、模块可加载及NetFilter等支持。需要选择“IP Userspace queueing via NETLINK (OBSOLETE) ”项支持。

(7) 制作根文件系统。从Linux 2.6.18开始的新版本的udev是一个基于用户空间的设备管理系统。在内核启动时并不能自动创建设备节点, 需要手动在dev/目录下创建各种节点, 即设备文件。涉及系统启动过程的设备有/dev/mtdblock* (MTD块设备) , /dev/tty SAC* (串口) , /dev/console (控制终端) , /dev/null, 只有建立以上设备才能启动系统。

2.2 在嵌入式linux中移植AODV路由协议

目前多数已经发布的AODV实现都利用了Netfilter功能框架。Netfilter是Linux2.4内核实现报文过滤、报文处理、报文转发等的功能框架, 并在linux后续版本中得到延续[6]。本文采用的AODV协议是开源的aodv-uu-0.9.6。AODV路由协议移植即将aodv-uu-0.9.6移植到ARM Linux中, 主要有以下几个方面。

(1) 修改Makefile内核源码路径和编译器版本 (#代表注释内容)

(2) 在lnx/kaodv-debug.h程序中添加头文件#include。在lnx/kaodv-netlink.c中将static DECLARE_MUTEX (kaodvnl_sem) ;改为static

DEFINE_SEMAPHORE (kaodvnl_sem) ;

(3) 编译后, 将在当前目录下生成aodvd可执行文件, 在lnx目录中将生成kaodv.ko模块。

(4) 组建adhoc网络:

3 AODV实现分析

本课题选择通用操作系统Linux作为实现AODV路由协议的平台, 可以利用现有的、成熟的应用框架, 提高开发速度, 同时能保证协议正确实现。但是由于Linux操作系统源代码的开放性, 在实现AODV路由协议过程中, 必须要对操作系统内核架构熟悉。在Linux操作系统中提供了实现网络数据包过滤和控制的模块Netfilter, Netfilter提供了在操作系统内核网络协议堆栈中的多个钩子点 (hook) , 可以在钩子点上注册回调函数, 利用这些回调函数在协议栈不同运行状态下处理数据包, 实现在不修改操作系统源码的情况下添加协议算法。

AODV协议是作为用户层的后台程序实现的, 包括一个可装载的Linux内核模块 (kao_dv) , 采用守护进程的方式运行, 使用Netfilter来截获报文[7]。Netfilter通过返回NF_QUEUE来缓存用户层的所有报文, 同时对用户层报文进行排队, 将所有报文的目的地址与用户层路由缓存匹配, 在用户层缓存需要路由请求的报文, 并立刻返回己存在路由的报文。在AODV路由协议实现的过程中, 除了内核路由表外, 在用户层还需建立了AODV路由表, 用来记录各种路由信息, 路由表条目的建立或更新是基于所收到AODV控制报文信息的[8]。

4 系统测试

本系统在室外进行测试, 将3台具备视频和其他监控功能的终端安置于监控点, 各监控点之间的距离约为50米。以视频为主要参照特征, 在启动系统后, 首先发送“Hello”, 如图1所示, 通知其他节点有新节点加入, 并且取得其他节点的路由信息, 更新本地路由信息, 输出信息如图2所示。各个监控终端将采集到的视频流经H264编码压缩后通过无线网卡自主选择路由路径发送到控制端。远程监控主机对接收到的视频流进行数据实时解码处理并进行显示, 系统视频流畅、图像清晰、实时性强。当某一个通信节点退出通信的时候, 会在整个网络内产生通知, 清理网络内节点的路由, 输出信息如图3所示。其他节点会自动选择其他路由路径传输数据, 网络具备自愈合能力。

5 结论

本文详细论述了AODV路由协议在Linux平台下的实现原理和移植过程, Linux是开源的操作系统, 不但安全稳定、可裁减, 而且具备强大的网络功能。本系统不修改内核基本代码, 利用netfilter提供的HOOK实现AODV路由算法, 在保持Linux系统的路由转发功能不变的情况下, 实现AODV选路功能, 并解决了AODV进程与内核的交互问题。

参考文献

[1]郑少仁, 王海涛, 赵志峰, 等.Ad Hoc网络技术[M].北京:人民邮电出版社, 2005.

[2]C.Perkins, E.Royer.RFC 3561.Ad-hoc On-Demand Distane Vector (AODV) Routing[S].2003-07.

[3]Perkins CE.Royernad5 EM.Das.Ad Hoc on Demand Distance Vector (AODV) Routing.IETF RFC3561, July, 2003.

[4]谢世欢, 郭伟.实现Ad-hoc按需路由协议的关键技术[J].计算机应用, 2006, 26 (3) :517-518.

[5]宋凯, 严丽平, 甘岚, 等.ARM Linux在S3C2410上的移植[J].计算机工程与设计, 2008, 29 (16) :4138-4140.

[6]张纪坤.嵌入式Linux系统开发技术详解[M].人民邮电出版社.

[7]陈林星, 曹曦, 曹毅.移动Ad Hoc网络[M].电子工业出版社.

【S3C6410】推荐阅读:

上一篇:安全使用要求下一篇:改善民生工作

本站热搜

    相关推荐