OpenCV移植到ARM全过程

OpenCV移植到ARM全过程
OpenCV移植到ARM全过程

OpenCV移植到ARM全过程

Host:VMware + Ubuntu 10.04

Target:Real6410 with Linux 2.6.28.6

Crossing Compiler:arm-none-linux-gnueabi-4.3.2 with EABI

一交叉编译链的安装

1 解压,即可得到arm-none-linux-gnueabi 目录

# tar –xjvf arm-none-linux-gnueabi-4.3.2.tar.bz2

2 为了使用方便,

还可以编辑/etc/bash.bashrc 文件添加把编译器路径到环境变量PATH 中,

只要在这个文件中添加下面这2 个语句即可:

PATH=/root/ arm-none-linux-gnueabi-4.1.0/bin:$PATH

export PATH

3 编辑完毕后使用source /etc/bash.bashrc 命令执行以下这个文件,让设置生效,之后再输入:

# arm-none-linux-gnueabi-gcc -v

如果输出下面的信息则表面设置成功:

Using built-in specs.

Target: arm-none-linux-gnueabi

Configured with: /scratch/julian/lite-respin/linux/src/gcc-4.3/configure --build=i686-pc-linux-

gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2008q3-72' --with-

bugurl=https://https://www.360docs.net/doc/e816088616.html,/GNUToolchain/ --disable-nls

--prefix=/opt/codesourcery

--with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-

sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/libc --with-

gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnueabi-

i686-pc-

linux-gnu/usr --with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-

linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-

build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/ bin --with-build-

time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin

Thread model: posix

gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)

至此交叉编译链安装完成。

二交叉编译libjpeg

为了使OpenCV能处理jpeg图像,我们必须事先交叉编译好libjpeg

这里使用的版本是jpegsrc.v6b

1 下载libjpeg源码:ftp://https://www.360docs.net/doc/e816088616.html,/graphics/jpeg/jpegsrc.v6b.tar.gz

2 解压进入目录

3 配置

#./configure --prefix=/root/libjpeg-arm --exec-prefix=/root/libjpeg-arm --enable-shared

--enable-static

下面分别介绍这几个参数的作用:

--prefix=/root/libjpeg-arm : 执行make install 后,会将与体系无关的文件拷贝到此目录下,具体如下:

/root/libjpeg-arm.....................................

|

+---include........................................

|

---jconfig.h

|

---jerror.h

|

---jmorecfg.h

|

---jpeglib.h

+---man............................................

|

+---man1.......................................

|

---cjeg.1

|

---djpeg.1

|

---jpegtran.1

|

---rdjpgcom.1

|

---wrjpgcom.1

--exec-prefix=/root/libjpeg-arm : 执行make install 后,会将与体系无关的文件拷贝到此目录下,即将一些可执行程序、动态链接库和静态链接库拷贝到此目录的相应目录下,具体如下:

/root/libjpeg-arm........................................

|

+---bin............................................

|

---cjeg

|

---djpeg

|

---jpegtran

|

---rdjpgcom

|

---wrjpgcom

+---lib...........................................

|

https://www.360docs.net/doc/e816088616.html,

|

---libjpeg.so

|

---libjpeg.so.62

|

---libjpeg.so.62.0.0

--enable-shared : 用GNU libtool编译成动态链接库。

4 修改生成的Makefile文件:

# The name of your C compiler:

CC= gcc 该成CC= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc (根据你自己交叉编译器的位置修改)

# library (.a) file creation command

AR= ar rc 该成AR= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ar rc (同上)

# second step in .a creation (use "touch" if not needed)

AR2= ranlib 该成AR2= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ranlib (同上)

5 在/root/libjpeg-arm目录下建立man/man1,include,lib,bin四个目录

6 # make

# make install

7 将/root/libjpeg-arm/include/中(jconfig.h, jerror.h, jmorecfg.h, jpeglib.h)四个头文件拷贝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include中。

将/root/libjpeg-arm/lib中(https://www.360docs.net/doc/e816088616.html,, libjpeg.so, libjpeg.so.62, libjpeg.so.62.0.0)四个库文件拷贝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib中

注意:执行以下命令检查生成的libjpeg.so是否为ARM版:

# file libjpeg.so

以下为正确输出,否则检查交叉编译器路径以及Makefile并重新编译。

注意:执行完以上操作后执行以下命令检查库文件是否已正确安装:

# arm-linux-gcc -print-file-name=libjpeg.so

如果输出为"libjpeg.so"则说明没有正确安装,重复7步骤。

如果输出为"DIR/libjpeg.so"则说明安装正确。

至此libjpeg交叉编译完成。

三交叉编译x264,xvid,ffmpeg

为了使OpenCV能处理视频,我们要事先交叉编译ffmpeg,而ffmpeg又是依赖x264和xvid的。

1 下载yasm:

到https://www.360docs.net/doc/e816088616.html,/projects/yasm/wiki/Download 下载yasm0.7.2(x264需要用到的汇编编译器)

# ./configure --enable-shared --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --host=arm-linux

# make

# make install

2 交叉编译x264

到ftp://https://www.360docs.net/doc/e816088616.html,/pub/videolan/x264/snapshots/ 下载x264-snapshot-20060805-2245.tar.bz2,解压进入目录

(1).配置

# ./configure --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --enable-shared

(2).修改配置参数

修改config.mak:

prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/

exec_prefix=${prefix}

bindir=${exec_prefix}/bin

libdir=${exec_prefix}/lib

includedir=${prefix}/include

# 这里改为ARM

ARCH=ARM

SYS=LINUX

# 这里改为arm-linux-gcc

CC=arm-linux-gcc

# 这里去掉-DHAVE_MMXEXT -DHAVE_SSE2 -DARCH_X86

CFLAGS=-Wall -I. -O4 -ffast-math -D__X264__ -DHAVE_MALLOC_H -DSYS_LINUX

-DHAVE_PTHREAD -s -fomit-frame-pointer

LDFLAGS= -lm -lpthread -s

AS=nasm

ASFLAGS=-O2 -f elf

VFW=no

GTK=no

EXE=

VIS=no

HAVE_GETOPT_LONG=1

DEVNULL=/dev/null

CONFIGURE_ARGS= '--enable-shared' '--prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/'

SONAME=libx264.so.49

default: $(SONAME)

修改Makefile,将66~68行的ar和ranlib改为arm下的:

libx264.a: .depend $(OBJS) $(OBJASM)

arm-linux-ar rc libx264.a $(OBJS) $(OBJASM)

arm-linux-ranlib libx264.a

(3).编译安装

# make

# make install

这里可以在交叉编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的lib下生成libx264.so

3 交叉编译xvid

到https://www.360docs.net/doc/e816088616.html,/downloads/xvidcore-1.1.3.tar.gz 下载xvid

下载xvid解压并进入build/generic

配置

# ./configure --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --disable-assembly

[解释]--disable-assembly :因为xvid没有针对ARM的汇编优化,所以编译时必须关掉汇编

修改Makefile引用的platform.inc文件,将CC=gcc改为CC=arm-linux-gcc

# make

# make install

成功后进入example文件夹

测试,输入

arm-linux-gcc -o xvid_encraw xvid_encraw.c -lc -lm -I../src/ -L../build/generic/=build

-lxvidcore

即可生成xvid_encraw

这里可以在交叉编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的include,lib下生成相应的头文件和库文件

4 交叉编译ffmpeg

到https://www.360docs.net/doc/e816088616.html,/download.php?id=5532&ResourceID=2990在这个网址上下载ffmpeg-0.4.9-p2*******.tar.bz2,然后解压。

修改configure文件,要修改的如下

由于cc、ar、ranlib、strip都是交叉编译环境中的执行文件,可以这样配置

prefix="/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/"

cross_prefix="root/arm-none-linux-gnueabi/bin/arm-linux-"

cpu="arm"

配置

# ./configure --cpu=arm --cc=arm-linux-gcc --enable-shared --disable-ffserver --enable-xvid --enable-x264 --enable-gpl --enable-pthreads --disable-strip

# make

# make install

这里可以在交叉编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的include,lib下生成相应的头文件和库文件

至此,OpenCV所依赖的库都交叉编译完成,并在交叉编译链中的include,bin,share,lib下有相应的文件

四交叉编译OpenCV

下载OpenCV-1.0.0源码https://www.360docs.net/doc/e816088616.html,/download/opencv-1.0.0.tar.gz

解压进入目录配置

# ./configure --host=arm-none-linux-gnueabi --without-gtk --without-carbon --without-quicktime --without-1394libs --with-ffmpeg --without-python --without-swig --enable-static --enable-shared --disable-apps CXX=arm-none-linux-gnueabi-g++ CPPFLAGS=-

I/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include LDFLAGS=-L/root/arm-

none-linux-gnueabi/arm-none-linux-gnueabi/lib --with-v4l --prefix=/root/opencv-arm

--libdir=/root/opencv-arm/lib --includedir=/root/opencv-arm/include

说明:

--host=arm-none-linux-gnueabi :指出交叉编译arm平台

--without-gtk:忽略gtk+2.0 windows

--without-carbon: 不使用Mac OS上的X库

--without-quicktime

--without-1394libs

--without-ffmpeg

--without-python

--without-swig

--enable-static :生成静态库

--enable-shared :生成动态库

CXX=arm-none-linux-gnueabi-g++ :指定编译工具

CPPFLAGS=-I/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include :OpenCV会用到一些dev的包,如png.h,jpeglib.h,大部分头文件在/usr/include下

--prefix=/root/opencv-arm :指定安装目录

-libdir=/root/opencv-arm/lib: 指定库文件安装位置

--includedir=/root/opencv-arm/include:指定包含文件安装位置

如果配置正确,会有下面信息

General configuration ================================================ Compiler: arm-none-linux-gnueabi-g++

CXXFLAGS: -Wall -fno-rtti -pipe -O3 -fomit-frame-pointer

Install path: /root/opencv-arm

HighGUI configuration ================================================

Windowing system --------------

Use Carbon / Mac OS X: no

Use gtk+ 2.x: no

Use gthread: no

Image I/O ---------------------

Use libjpeg: yes

Use zlib: yes

Use libpng: yes

Use libtiff: no

Use libjasper: no

Use libIlmImf: no

Video I/O ---------------------

Use QuickTime / Mac OS X: no

Use xine: no

Use ffmpeg: yes

Use dc1394 & raw1394: no

Use v4l: yes

Use v4l2: yes

Wrappers for other languages ========================================= SWIG

Python no

Additional build settings ============================================ Build demo apps no

Now run make ...

=================================================================== ===

# make

# make install

arm上运行OpenCV所需库:

1 将/root/opencv-arm/lib下生成的库文件

libcvaux.so.1.0.0

libcv.so.1.0.0

libcxcore.so.1.0.0

libhighgui.so.1.0.0

libml.so.1.0.0

拷出来全部重命名

*.so.1

2 加上之前的库文件,将/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib下的libjpeg,xvid,x264,ffmpeg库都拷出来放去板子的/usr/lib或者/lib下,也可以复制到板子上一个文件夹,然后#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR/lib/DIR

3 OpenCV所需库总表:

编译源文件方法

arm-none-linux-gnueabi-g++ demo.c -o demo -I/root/opencv-arm/include/opencv

-L/root/opencv-arm/lib -lcv -lcxcore -lpthread -lrt -lcvaux -lm -lpng -ljpeg -lz -lml -lhighgui -ldl

最后,将生成的二进制文件拷到板子上就可运行

OpenCV 2.4.4安装与配置

OpenCV 2.4.4 安装与配置 步骤一:安装OpenCV https://www.360docs.net/doc/e816088616.html,/projects/opencvlibrary/files/opencv-win/2.4.4/ 1.从以上地址下载OpenCV 2.4.4,执行exe文件,将文件安装到所需目录。 2.建立环境变量并添加到系统路径(以将文件安装在D:\opencv为例): i) 右键点击桌面的计算机图标,选择“属性”,跳出如下窗口:

ii) 点击“高级系统设置”,跳出如下窗口:

iii) 点击“高级”选项卡下的“环境变量”,跳出如下窗口:

iv) 点击“系统变量”下的“新建”,“变量名”输入OPENCV_BUILD,“变量值”输入D:\opencv\build(如果OpenCV解压在别的目录,请输入该目录路径。比如,如果在C盘ProgramFiles文件夹建立了名为OpenCV的文件夹,并在其中解压,那么输入的目录就为 C:\ProgramFiles\OpenCV\opencv\build,总之目录一直到build文件夹),点击“确定”。 v) 双击“用户变量”中的PATH,在跳出的窗口中输入变量值为%OPENCV_BUILD%\x86\vc10\bin (如果电脑是64位系统的,请把“x86”改为“x64”;并请确保使用的是VS 2010,因为vc10 文件夹针对的是VS 2010)。

步骤二:在VS2010中配置OpenCV 1. 打开VS 2010,新建一个项目(Win32控制台或MFC 都可以)。 2. 建立Debug 属性表。 i) 点击“视图”菜单中的“属性管理器”。

ARM7(sc44b0)外部中断笔记

ARM7(sc44b0)外部中断笔记 对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0和int1,P3.3和P3.4),分别是Port G八个管脚。而对于外部中断4 \5\6\7很多都是共用寄存器,他们是通过或逻辑公用一个中断请求线。。下面就具体来说说使用外部中断的一些必要的配置。 一,对管脚的配置,因为Port G有三种功能用法,要通过对rPCONG(端口G 配置寄存器)的配置来选用Port G 的外部中断的功能。其配置表如下 所以应该将其配置为11(设置为中断功能状态); 二,中断模式的选择,中断模式有两种,FIQ(快速中断模式)和 IRQ(中断模式)两种,一般没有特殊要求都用IRQ模式即可。可以通过对中断模式寄存器rINTMOD配置获得。如表下 三,是否允许中断,即中断使能位。通过对中断控制寄存器INTCON的配置即可,如表下通过对中断控制寄存器的配置即可,

可以看出只要让intcon的【1】位置零即可使中断使能。 四,外部中断方式的选择,低电平或上升沿触发呢,还是别的,这就要对外部中断方式寄存器(EXTINT)的配置,其表如下

由上表可知,如果要用下降沿触发,就可将EXTINT 的值给0x22222222; 将所有的外部中断都设置为下降沿触发。 五,当中断捕抓到以后,要引起什么变化呢?或者说用什么来捕抓呢?在sc44b0中用了两个寄存器来捕抓,一个中断挂起寄存器(INTPND),和外部中断挂起寄存器(EXINTPND),一开始不明白挂起是什么意思,后来才懂,差不多就相当与51单片机的标志位一样,当中断发生后,就将挂起寄存器的对应的某一位置一或置零,外部中断挂起寄存器如表下 中断挂起寄存器:当中断产生后,是将INTPND的【21】位置一的; 所以,判断有无外部中断,就可以通过读取挂起寄存器对应的为,即可知道是否有无中断。 六,当中断发生后,挂起寄存器的对应位(即中断标志位)也发生了置位,那如果要检测下一个中断,就得将挂起寄存器的对应为复原,那怎么复原呢?在51单片机中是将中断标志位软件置零就可,在44b0中也是同样的道理,它是通过将对应的中断挂起寄存器的位置一就行了,对于EXTINTPND,他是直接将对应的位置一,对于EXTINTPND是通过将rI_ISPC的对应位置一(EXTINTPND和I_ISP的位数是一样的,两个是相互对应的) 附上程序; #define EXTINT4 0 #define EXTINT5 1 #define EXTINT6 2 #define EXTINT7 3 #define EXTINT4567 21

arm-linux下usb转串口移植手册

arm-linux下usb转串口移植手册: 讲述在嵌入式平台上,移植usb转串口的步骤: 1、配置Kernel 2、文件系统配置等。 Kernel:在配置内核时:加入usb转串口的支持、加入usb转串口器件的支持。 不同厂家的usb转串口工具需要的驱动可能不一样。 Device Drivers ---> USB support ---> --- USB port drivers USB Serial Converter support ---> <*> USB Serial Converter support [*] USB Serial Console device support [*] USB Generic Serial drivert < > USB AIRcable Bluetooth Dongle Driver (EXPERIMENTAL) <*> USB FTDI Single Port Serial Driver (EXPERIMENTAL) 本次实验才用的是FTDI的usb转串口工具 在配置Kernel时,还可以加入对其他厂家的驱动支持。 文件系统: 1、在/dev目录下建立设备文件/dev/ttyUSB0 mknod /dev/ttyUSB0 c 188 0 2、在运行/sbin/getty登陆命令之前要先设置好:usb转串口对应端口的波特率、停止位等。int usb_to_serial_init(viod) { iUSBTORS232 = open( "/dev/ttyUSB0", O_RDWR); if (iUSBTORS232 iRS232 < 0) { printf("Can't open device dev/ttyUSB00"); return -1; } set_speed(iUSBTORS232 iRS232,BAUDRA TE); set_Parity(iUSBTORS232 iRS232,8,1,'n'); close(iRS232); } 3、在/etc/inittab 加入如下命令。同时用consel和usb转串口工具登陆。 # Example of how to put a getty on a serial line (for a terminal) ::respawn:/sbin/getty -L ttyS0 115200 vt100 ::respawn:/sbin/getty -L ttyUSB0 115200 vt100

OPENCV 2.4.10安装

一、VS2020安装opencv2.4.10 1.1首先安装vs2010 安装这个就不用多谈了 1.2下载opencv- 2.4.10.exe,并解压到 最后会在 1.3添加系统变量 在系统变量path后添加:C:\opencv\opencv\build\x86\vc10\bin 1.4新建vc++控制台工程项目,配置 1.4.1项目属性->配置属性->VC++目录->包含目录 添加 C:\opencv\opencv\build\include C:\opencv\opencv\build\include\opencv C:\opencv\opencv\build\include\opencv2

1.4.2项目属性->配置属性->VC++目录->引用目录 添加 C:\opencv\opencv\build\x86\vc10\lib 1.4.3项目属性->链接器->输入->附加依赖项 在debug模式下添加 配置方案为Debug的配置,添加:(2410代表我的opencv版本是2.4.10,需要对应更改) opencv_calib3d2410d.lib opencv_contrib2410d.lib opencv_core2410d.lib opencv_features2d2410d.lib

opencv_flann2410d.lib opencv_gpu2410d.lib opencv_highgui2410d.lib opencv_imgproc2410d.lib opencv_legacy2410d.lib opencv_ml2410d.lib opencv_nonfree2410d.lib opencv_objdetect2410d.lib opencv_ocl2410d.lib opencv_photo2410d.lib opencv_stitching2410d.lib opencv_superres2410d.lib opencv_ts2410d.lib opencv_video2410d.lib opencv_videostab2410d.lib 配置方案为Release的配置,添加: opencv_calib3d2410.lib opencv_contrib2410.lib opencv_core2410.lib opencv_features2d2410.lib opencv_flann2410.lib opencv_gpu2410.lib opencv_highgui2410.lib opencv_imgproc2410.lib opencv_legacy2410.lib opencv_ml2410.lib opencv_nonfree2410.lib opencv_objdetect2410.lib opencv_ocl2410.lib opencv_photo2410.lib opencv_stitching2410.lib opencv_superres2410.lib opencv_ts2410.lib opencv_video2410.lib opencv_videostab2410.lib

ARM中的中断要点

一、S5PV210中中断的特点 1、特点 ? Supports 93 vectored IRQ interrupts ? Fixed hardware interrupts priority levels ? Programmable interrupt priority levels ? Supports Hardware interrupt priority level masking ? Programmable interrupt priority level masking ? Generates IRQ and FIQ ? Generates Software interrupt 2、FIQ与IRQ的区别 1)FIQ和IRQ并不是中断源,而是中断的类型,我们可以将一个中断源设置成FIQ也可以设置成IRQ。2)FIQ是快速中断,IRQ是一般中断,FIQ的响应时间比IRQ短。 3)FIQ的优先级高于IRQ。 4)FIQ的分组寄存器(R8~R14)比IRQ(R13~R14)多。当在FIQ产生的时候,R8~R14不需要保存,响应的速度会快。 3、S5PV210的中断源

二、原理图分析

三、如何以中断的方式来检测按键:GPH2_2(EINT18) 、GPH2_3(EINT19) 按键的检测:轮询:将GPIO配置成输入……. 中断:将GPIO配置成外部中断……. 1、GPIO的配置,将一个GPIO配置成外部中断 2、外部中断的触发方式 (高电平、低电平、上升沿、下降沿)

3、外部中断的开关寄存器 0 = Enables Interrupt 打开中断 1 = Masked 关闭中断 4、外部中断判断寄存器 0 = Not occur 外部中断没有发生 1 = Occur interrupt 触发了中断

成功移植OpenSSH到ARM Linux开发板

成功移植OpenSSH到ARM Linux开发板 概述 如果是用到一些没有SSH的开发板,对于部分的应用开发来说,会受到影响,比如使用ARM DS-5进行RSE远程管理操作时,就会出现错误。下面就具体如何进行OPENSSH移植进行详细介绍。 步骤 1.下载源码包如下,下载 openssh、openssl 和 zlib 三个包。 openssh ?本地下载:openssh-6.6p1.tar.gz(1.22 MB, 下载次数: 2470) ?官网下载:https://www.360docs.net/doc/e816088616.html,/portable.html openssl ?本地下载:openssl-1.0.1h.tar.gz(4.27 MB, 下载次数: 2647) ?官方下载:https://www.360docs.net/doc/e816088616.html,/source zlib ?本地下载:zlib-1.2.8.tar.gz(557.71 KB, 下载次数: 3499) ?官方下载:https://www.360docs.net/doc/e816088616.html,/ 2.部署工作目录创建用户主目录下创建工作目录: 3.解压并编译

注意:openssh不需要make install 4.操作目标板 b)从PC机上将以下文件拷贝到目标板Linux系统中 PC机 /home/gary/work/openssh-6.6p1/ 目录下的 ?scp sftp ssh sshd ssh-add ssh-agent ssh-keygen ssh-keyscan 共8个文件拷

贝到目标板 /usr/local/bin ? moduli ssh_config sshd_config 共3个文件拷贝到目标板 /usr/local/etc ? sftp-server ssh-keysign 共2个文件拷贝到目标板 /usr/libexec c )生成Key 文件 将生成的 ssh_host_*_key 这4个文件copy 到目标板的 /usr/local/etc/ 目录下。其中 ssh_host_ed25519_key 是SSH 第二版协议用到的key ,放到开发板之后,要 d )修改目标板passwd 文件。 5.测试 如果开发板的 root 用户还没有密码,键入以下命令然输入两次密码来修改,否可以用 ps 命令查看sshd 是否在工作 如果运行的过程中有提示缺少动态连接库,可以在主机上搜索相应文件,拷贝到目标板/lib/目录下面,注意创建软连接! OK !不出意外的话可以成功,

Open_CV的安装及使用说明

Open CV的安装及使用说明 ******************************************************************************* 如果不需要安装OpenCV中的(CalibFilter、ProxyTrans、SyncFilter), 则步骤为以下方式 (1)安装Open CV(这里的OpenCV版本为OpenCV_1.0); (2)点击”我的电脑”右键属性的系统环境变量,在path中添加\bin路径,例如: D:\OpenCV\bin; (3)打开\_make\opencv.dsw,选择菜单Build->Batch Build->Build; ******************************************************************************* 如果需要安装OpenCV中的(CalibFilter、ProxyTrans、SyncFilter),则 步骤为以下方式 (1)安装SDK(注意:2004年下半年及2005以后的版本都不包括directshow), 安装目录为:D:\ DXSDK; (2)安装Open CV(这里的OpenCV版本为OpenCV_1.0); (3)点击”我的电脑”右键属性的系统环境变量,在path中添加\bin路径,例如: D:\OpenCV\bin; (4)编译D:\DXSDK\Samples\C++\DirectShow\BaseClasses,编译建立Release和Debug版本, 将产生的库strmbase.lib和strmbasd.lib拷贝到目录\lib下,在Developer Studio的Tools->Options->Directories->Include files中添加如下路径:\include \samples\C++\DirectShow\BaseClasses 另外在Tools->Options->Directories->Library files中添加如下路径: \lib; (5)打开\_make\opencv.dsw,选择菜单Build->Batch Build->Build,又打开 \_make\opencv_directshow.dsw,选择菜单Build->Batch Build->Build; ******************************************************************************* 注意:在编译opencv.dsw有错误 错误的地方是"foreground_regions"问题。打开"Edit"->"Find In Files"->"In folder"选择"D:\OpenCV",找foreground_regions。在"Find in Files"底下我们点击"CvSeq* foreground_regions /*foreground object contours*/",找到 CvMemStorage* storage; /*storage for 揻oreground_regions?/ CvSeq* foreground_regions /*foreground object contours*/ 问题就出在 CvMemStorage* storage; /*storage for 揻oreground_regions?/, 改为 "CvMemStorage* storage; /*storage for 揻oreground_regions*/" 即可。 *******************************************************************************

vs2010下配置OpenCV

以下配置方法仅属于个人见解;若有什么不对的地方请指教啊。 在完成每一步骤后,记住点击?确定?,以确保你的设置成功。 在某些步骤中注意要在Debug 和Release 分别进行配置。 1.首先是下载VS2010并安装,这里不作赘述;(安装目录: D:\\Program Files\Microsoft Visual Studio 10.0) 2.下载并安装OpenCV,我的版本是2.1(安装目录为D:\Program Files\OpenCV2.1)注意将路径添加至Path中 3.下载并安装CMake,下载版本为Windows(Win32 Installer),安装目录为D:\Program Files\CMake 2.8 4.运行cmake-gui(D:\Program Files\CMake 2.8\bin),设置路径为OpenCV安装路径(本文档假定安装位置为:D:\Program Files\OpenCV2.1),并创建子目录D:\Program Files\OpenCV2.1\vs2010,用于存放编译结果。将数据填入指定文本框中

5.点击?Configure?,在弹出对话框中选中Visual Studio 10.0;单选框中选项选择程序默认的;然后点击Fnish;程序会自动完成 ?Configure Done?; 6.然后点击?configure?,接着点击?Generate?。程序完成?Generate Done?。 7.完成以上步骤后,将在D:\Program Files\OpenCV2.1|vs2010目录下生成OpenCV.sln的VC Solution File,接着请用vs2010打开OpenCV.sln,完成以下操作:

ARMLinux移植基本概念

ARM的嵌入式Linux移植体验之基本概念 日前,笔者作为某嵌入式ARM(硬件)/Linux(软件)系统的项目负责人,带领项目组成员进行了下述工作: (1)基于ARM920T内核S3C2410A CPU的电路板设计; (2)ARM处理下底层软件平台搭建: a.Bootloader的移植; b.嵌入式Linux操作系统内核的移植; c.嵌入式Linux操作系统根文件系统的创建; d.电路板上外设Linux驱动程序的编写。 本文将真实地再现本项目开发过程中作者的心得,以便与广大读者共勉。第一章将简单地介绍本ARM开发板的硬件设计,第二章分析Bootloader的移植方法,第三章叙述嵌入式mizi Linux的移植及文件系统的构建方法,第四章讲解外设的驱动程序设计,第五章给出一个已构建好的软硬件平台上应用开发的实例。 如果您有嵌入式系统的开发基础,您将非常容易领会本文讲解地内容。即便是您从来没有嵌入式系统的开发经历,本文读起来也不会生涩。您可以通过如下email与作者联系:21cnbao@https://www.360docs.net/doc/e816088616.html,。 2.ARM体系结构 作为一种RISC体系结构的微处理器,ARM微处理器具有RISC体系结构的典型特征。还具有如下增强特点:

(l)在每条数据处理指令当中,都控制算术逻辑单元(ALU)和移位器,以使ALU和移位器获得最大的利用率; (2)自动递增和自动递减的寻址模式,以优化程序中的循环; (3)同时Load和Store多条指令,以增加数据吞吐量; (4)所有指令都条件执行,以增大执行吞吐量。 ARM体系结构的字长为32位,它们都支持Byte(8位)、Halfword(16位)和Word(32位)3种数据类型。 ARM处理器支持7种处理器模式,如下表: 大部分应用程序都在User模式下运行。当处理器处于User模式下时,执行的程序无法访问一些被保护的系统资源,也不能改变模式,否则就会导致一次异常。对系统资源的使用由操作系统来控制。 User模式之外的其它几种模式也称为特权模式,它们可以完全访问系统资源,可以自由地改变模式。其中的FIQ、IRQ、supervisor、Abort和undefined 5种模式也被称为异常模

opencv配置

VS2010 + OpenCV2.3配置 ; 在VS2010下安装配置OpenCV2.3 ; 全程截图,绝对能配置好,不能的留言! 操作系统:Windows 7 x86 中文旗舰版; 编译环境:Visual Studio 2010 中文旗舰版; OpenCV版本:OpenCV-2.3.0-win、OpenCV-2.3.1-win; 备注: a、不需要Cmake编译!! b、如果是最新的2.3.1版本,则将下面第5步中的(5)和(6)中的名为230的lib 修改成231即可,否则会出现找不到lib的情况。 c、不分x86和x64版本,一律按照这个方案配置就可以使用。 d、C#开发环境下的配置方法: https://www.360docs.net/doc/e816088616.html,/mvp_xuan/blog/item/7e6f6d8c4d34be09b31bb aa9.html?timeStamp=1316746687080 e、第5步属于“项目属性配置”,意思是:“每次新建或新打开一个项目,都需要重新配置”。1-4步是系统配置,一次性工程。 1、下载OpenCV(必须要superpack.exe) https://www.360docs.net/doc/e816088616.html,/download/OpenCV-2.3.0-win-superpack.exe 2、安装 解压到D盘根目录下。(位置随便,不过下面的path需要根据实际情况自行修改了。) 3、设置系统环境变量 在用户变量处,新建PATH和OPENCV两个项: ———————————————————— PATH (只需添加下面中的一行,根据系统情况自行选择) D:\OpenCV2.3\build\x86\vc10\bin ———————————————————— OPENCV D:\OpenCV2.3\build ————————————————————

Linux C语言 socket编程 聊天室 可移植到arm开发板

sockets聊天室 1.1介绍 包括一个客户端和一个服务器。可实现多人聊天和两人一对一单独聊天。 1.2开发环境和工具 Linux gcc 1.3程序设计 服务器: 1. 声明一个client结构体,包含用户自己的socket描述符mid,自己的用户名name以及 与自己聊天对象的Socket描述符fid(默认是-1,即公共聊天室)。并定义一个结构体数组。 2. 服务器新建一个socket设置默认的ip为自动获取,调用bind()函数绑定服务器socket 与ip。 3. 开启listen()监听客户端的连接请求。 4. 在while循环里,用accept()等待连接,连接成功后,把accept()返回的socket描述 符存入client结构体数组中。 5. 每成功新建一个连接,就创建一个对应的子线程,接收并转发消息。 6. 定义void rec_snd(int n)这个函数,用于接收和转发消息。可选择公共聊天室和私聊, 私聊需要正确输入对方的名字。连接建立以后就可以发送消息。当接收的消息为bye 时,断开当前连接,如果是一对一私聊,一方断开另一方自动转入公共聊天室。 客户端: 1.新建一个socket,并与ip,端口进行绑定。 2.调用connect连接服务器。连接成功后新建一个线程用于发送消息, 主线程在while中调用read()接收服务器消息。 3.Snd()函数用于向服务器发送消息。 4._select()函数用于选择功能。 1.4应用演示 服务器端成功开启等待连接:

当有客户端连接时,会显示ip端口,socket标识符信息。客户端成功连接上服务器时会收到提示输入用户名: 输入姓名后会提示选择功能:

OPENCV下载与安装

OpenCV下载与安装 可以在https://www.360docs.net/doc/e816088616.html,/downloads.html上下载各种版本的OpenCV的源码,Windows、Linux/Mac、iOS、Android都有相应的版本,所以OpenCV可以满足在各种操作系统下的开发,一般来说现有的无人驾驶智能车视觉信息认知计算研究团队都是在Windows和Linux平台下开发。目前OpenCV最新发布的是OpenCV3.0BETA版本(这是一个公测版本),本书所有的视觉算法是基于OpenCV2.4.3版本实现的。 OpenCV下载后安装极其简单,下面是一个以OpenCV2.4.3版本为例的具体安装过程。 OpenCV下载后是一个可执行文件(.exe文件),如OpenCV-2.4.3.exe,安装的时候只需要直接运行这个可执行文件,运行后或得到图1-4的安装路径的选择界面,安装过程实质就是一个解压过程。 图1-4OpenCV安装的路径选择 如1-4所示是将OpenCV解压在计算机的C盘,安装(解压)完成后,可以在C盘中找到一个名称为opencv的文件夹,若能找到,

说明OpenCV安装完毕。不建议将OpenCV安装在C盘中(C盘一般是系统盘),因为OpenCV解压后的文件比较大。 1.2.3环境配置 OpenCV安装完之后还需要进行环境配置才能使用,本书是以Windows7+Microsoft Visual Studio2010下OpenCV2.4.3的环境配置为案例介绍。 (1)设置OpenCV环境变量 OpenCV库函数需要通过用户环境变量调用所需要的库文件。点击:开始->计算机(右击)->属性->高级系统设置->高级->环境变量,在用户变量里新建一项: 变量名:path 变量值:C:\opencv\build\x86\vc10\bin 图1-5设置环境变量

Visual Studio2012环境下配置OpenCV_v2.4.10的步骤

Visual Studio2012环境下配置OpenCV的步骤 2014/12/16 本文将针对Visual Studio2012环境下如何配置OpenCV做出说明,具体如下。 1.下载和安装OpenCV SDK 1.1资源下载 在OpenCV官网https://www.360docs.net/doc/e816088616.html, SDK安装包。对应自己的操作系统,可以下载Windows,Linux/Mac和ios版本。目前官网已经给出OpenCV v3.0bata版本。本文中以OpenCV v2.4.10版本为例进行安装。(各个版本安装过程大体相同,后面将针对不同之处给出说明) 1.2资源安装 下载的OpenCV SDK的后缀名为exe,是一个解压安装程序。双击后会提示设置解压路径,推荐路径D:\Program Files。(因为OpenCV项目文件打包的时候,根目录就是opencv,所以我们不需要额外的新建一个名为opencv的文件夹然后再解压,那是多此一举的事情)然后点击Extract按钮,进行安装。 2.环境变量和路径设置 打开计算机→属性→高级系统设置,在高级目录下单击环境变量按钮,打开环境变量设置对话框。

2.1用户变量设置 在用户变量(此处为lbs的用户变量中)添加两个变量。 新建opencv变量,变量值设置为D:\Program Files\opencv\build。 新建path变量,变量值设置为D:\Program Files\opencv\build\x86\vc11\bin。此处如果已存在path变量,仅需对其变量值修改就行,在后面加上上述路径,但需要用分号和前面的路径隔开(英文半角下的分号) 2.2系统变量设置 在原有的path变量中对变量值修改,在变量值的最后加上D:\Program Files\opencv\build\x86\vc11\bin路径,注意要使用英文半角下的分号和前面的路径隔开。 ※说明 (1)不论电脑是32位还是64位,上述路径中均以x86路径输入,因为创建的程序中默认是在使用win32编译器进行编译。 (2)路径修改后需要重启电脑才能生效。 3.工程项目属性设置 工程项目属性配置主要是指对Debug和Release环境下的工程属性进行修改(通过修改https://www.360docs.net/doc/e816088616.html,er文件进行)。查阅相关资料,发现Visual Studio 2012中已经不再区分Debug和Release的https://www.360docs.net/doc/e816088616.html,er文件,所以配置了Debug或Release中的任

ARM接口编程笔记

ARM接口编程笔记 一、ARM编程模式 1.ARM的含义 ●ARM是一家公司的名字 ●ARM代表的是一种RISC技术 ●ARM是一种CPU体系结构的名称,同x86、PPC、MIPS等并列 2.ARM体系结构中对字节、半字、字、双字的定义 ●字节:8 bit ●半字:16 bit ●字:32 bit ●双字:64 bit 3.ARM指令集 ●ARM指令集,32 bit,功能最全 ●Thumb指令集,16 bit,是ARM指令集的子集,完成部分功能 ●Thumb‐2指令集,16 bit和32 bit混合 ●Thumb‐EE指令集,16 bit和32 bit混合 ●Java指令集,直接执行绝大部分的Java字节流,但需要授权 4.ARM处理器的权限 ●非特权级:部分指令不能执行,是一种硬件的保护机制,通常用户应用 程序运行在该权限级别 ●特权级:能执行所有指令,通常操作系统运行在该权限级别 5.ARM的工作模式,处理对应模式下的特定事务,使得这些特定事务能够在硬 件资源的使用上部分地独立开来,这是通过各种模式下有对应的私有硬件资源来实现的。 ●User:应用程序一般运行在该模式下 ●Supervisor:操作系统一般运行在该模式下 ●IRQ:中断处理程序一般运行在该模式下 ●FIQ:快速中断处理程序一般运行在该模式下 ●Abort:发生存取异常后会进入该模式 ●Undef:执行未定义的指令会进入该模式 ●System:为解决中断不可重入而设计的一种特殊模式 ●Monitor:Cortex‐A特有的模式,执行监控代码 ●除User模式外,其他7种模式都是特权模式 6.ARM寄存器 寄存器最靠近CPU中的ALU,存取速度最快,没有地址,只有编号。部分寄存器有别名,在汇编程序中本名和别名可以混用。

linux arm 移植手册(分享)

Linux系统移植 目 录 第一部分 前言 (8) 1 硬件环境 (8) 1.1主机硬件环境 (8) 1.2 目标板硬件环境 (8) 1.3工具介绍 (8) 2软件环境 (8) 2.1主机软件环境 (8) 2.1.1 Windows 操作系统 (8) 2.1.2 Linux操作系统 (8) 2.1.3 目标板最后运行的环境 (9) 2.2 Linux下工作用户及环境 (9) 2.2.1 交叉工具的安装 (9) 2.2.2 u-boot移植工作目录 (9) 2.2.3 内核及应用程序移植工作 (9) 2.3 配置系统服务 (10) 2.3.1 tftp服务器的配置 (10) 2.4 工具使用 (12) 2.4.1 minicom的使用 (12) 3 作者介绍 (13) 3.1 策划, 组织, 指导, 发布者 (13) 3.2 ADS bootloader部分 (13) 3.3 交叉工具部分 (13) 3.4 uboot部分 (13) 3.5 内核部分 (13) 3.6 应用程序部分 (13) 3.7 网卡驱动部分 (13) 3.8 Nand Flash 驱动部分 (13) 第二部分 系统启动bootloader的编写(ADS) (14) 1 工具介绍 (14) 1.1 ADS 命令行命令介绍 (14) 1.1.1 armasm (14) 1.1.2 armcc, armcpp (14) 1.1.3 armlink (14) 2 基本原理 (15) 2.1 可执行文件组成及内存映射 (15) 2.1.1 可执行文件的组成 (15)

2.1.3 启动过程的汇编部分 (17) 2.1.4 启动过程的C部分 (17) 3 AXD的使用以及源代码说明 (18) 3.1 源代码说明 (18) 3.1.1 汇编源代码说明 (18) 3.1.2 C语言源代码说明 (23) 3.1.3 源代码下载 (23) 3.2 AXD的使用 (23) 3.2.1 配置仿真器 (23) 3.2.2 启动AXD 配置开发板 (23) 第三部分 GNU交叉工具链 (25) 1 设置环境变量,准备源码及相关补丁 (25) 1.1 设置环境变量 (25) 1. 2 准备源码包 (25) 1.2.1 binuils (25) 1.2.2 gcc (25) 1.2.3 glibc (25) 1.2.4 linux kernel (26) 1.3 准备补丁 (26) 1.3.1 ioperm.c.diff (26) 1.3.2 flow.c.diff (26) 1.3.3 t-linux.diff (26) 1.4 编译 GNU binutils (26) 1.5 准备内核头文件 (26) 1.5.1 使用当前平台的gcc编译内核头文件 (26) 1.5.2 复制内核头文件 (27) 1.6 译编glibc头文件 (27) 1.7 编译gcc第一阶段 (27) 1.8 编译完整的glibc (27) 1.9 编译完整的gcc (28) 2 GNU交叉工具链的下载 (28) 2.1 ARM官方网站 (28) 2.2 本文档提供的下载 (28) 3 GNU交叉工具链的介绍与使用 (29) 3.1 常用工具介绍 (29) 3.2.1 arm-linux-gcc的使用 (29) 3.2.2 arm-linux-ar 和 arm-linux-ranlib的使用 (30) 3.2.3 arm-linux-objdump的使用 (30) 3.2.4 arm-linux-readelf的使用 (31) 3.2.6 arm-linux-copydump的使用 (32) 4 ARM GNU常用汇编语言介绍 (32)

ARM的中断原理

ARM的中断原理(转) 1.中断概述 CPU与外设的数据传输方式通常有以下3种方式:查询方式、中断方式、DMA方式。 所谓查询方式是指,CPU不到查询外设的状态,如果外设准备就绪则开始进行数据传输;如果外设还没有准备好,CPU将进入循环等待状态。很显然这样浪费了大量的CPU时间,降低了CPU的利用率。 所谓中断方式是指,当外设准备好与CPU进行数据传输时,外设首先向CPU发出中断请求,CPU 接收到中断请求并在一定条件下,暂时停止原来的程序并执行中断服务处理程序,执行完毕以后再返回原来的程序继续执行。由此可见,采用中断方式避免了CPU把大量的时间花费在查询外设状态的操作上,从而大大提高了CPU的执行效率。 1.中断概述 CPU与外设的数据传输方式通常有以下3种方式:查询方式、中断方式、DMA方式。 所谓查询方式是指,CPU不到查询外设的状态,如果外设准备就绪则开始进行数据传输;如果外设还没有准备好,CPU将进入循环等待状态。很显然这样浪费了大量的CPU时间,降低了CPU的利用率。 所谓中断方式是指,当外设准备好与CPU进行数据传输时,外设首先向CPU发出中断请求,CPU 接收到中断请求并在一定条件下,暂时停止原来的程序并执行中断服务处理程序,执行完毕以后再返回原来的程序继续执行。由此可见,采用中断方式避免了CPU把大量的时间花费在查询外设状态的操作上,从而大大提高了CPU的执行效率。 ARM系统包括两类中断:一类是IRQ中断,另一类是FIQ中断。IRQ是普通中断,FIQ是快速中断,在进行大批量的复制、数据传输等工作时,常使用FIQ中断。FIQ的优先级高于IRQ。 在ARM系统中,支持7类异常,包括:复位、未定义指令、软中断、预取中止、数据中止、IRQ和FIQ,每种异常对应于不同的处理器模式。一旦发生异常,首先要进行模式切换,然后程序将转到该异常对应的固定存储地址执行。这个固定的地址称为异常向量。异常向量中保存的通常为异常处理程序的地址。ARM的异常向量如下: 异常模式正常地址高向量地址 复位管理 0x00000000 0xFFFF0000 未定义指令未定义 0x00000004 0xFFFF 0004 软中断管理 0x00000008 0xFFFF 0008 预取指中止中止0x0000000C 0xFFFF 000C 数据中止中止0x00000010 0xFFFF0010 IRQ IRQ 0x00000018 0xFFFF0018

OpenCV环境搭建

OpenCV环境搭建 日期:2015/9/21姓名:俞豪敏 1.Eclipse下搭建安卓开发环境 注意事项:不推荐使用ADT-bundler,这个为安卓开发是很方便,但是对我们的ndk搭建会很麻烦。 1.1.JDK的安装配置 JDK版本:jdk1.7.0_67 下载并安装JDK,并在环境变量中设置JDK路径 1.2.下载并安装Eclipse Eclipse版本:Mars javaEE 64位系统 直接按步骤安装即可。 1.3.下载并安装SDK SDK的安装是一个很复杂的过程,因为google网页限制,所以下载速度及其慢,建议到网页上搜索SDK,打开SDK manager安装你想要安装的版本API(我安装了4.4W,5.0,6.0等普遍系列) 1.4.为Eclipse安装ADT插件 版本号:23.0.6。版本需要注意的是,如果你的JDK版本过高而IDE不够的话是无法显示xml 的可视化编写的。 前面我们已经配置好了java的开发环境,安装了开发Android的IDE,下载安装了Android SDK,但是Eclipse还没有和Android SDK进行关联,也就是它们现在是互相独立的。为了使得Android应用的创建,运行和调试更加方便快捷,Android的开发团队专门针对Eclipse IDE定制了一个插件:Android Development Tools(ADT)。 ADT的安装有两种:1.在线,2.离线。建议离线安装,还是因为谷歌原因,连接非常慢,所以离线下载资源并安装。 1.在线安装ADT的方法: 启动Eclipse,点击Help菜单-> Install New Software… ?,点击弹出对话框中的Add… 按钮。

opencv编译与安装

2012/3/6, 16:55:01 在fedora15的环境下编译与安装opencv,并测试人脸检测程序 第一步:由于opencv是在cmake工具下建立的工程,所以我们先要下载cmake,下载地址随便一搜都有,不多说。下载到home的主目录下,这里我们是/home/lg。看下面的命令: #cd /home/lg #tar xzvf CMake2.4.7.tar.gz . #cd CMake2.4.7 #./boostrap #gmake #make install 这样cmake工具安装好了,并且可以直接使用cmake命令 根据cmake的编译规律,我们选择外部编译。 下载Opencv2.3.0到/home/lg 解压后进入Opencv2.3.0的目录下(这里的opencv与以前版本1.0的不一样,没有configure文件,所以我们执行不了./configure命令): #mkdir build #cd build #cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON ..(这条命令解析可以参考cmake教程,但是记住这里的第二个选项,我们将opencv安装在/usr/local目录下的) #make #make install 到这opencv编译完成,接下去是是opencv这个工具能正常使用。 记住这里的做法前一种对fedora有用,也就是说在fedora的环境下只能使用这种做法,但是ubuntu却可以使用两种方法。顺便说一下,经常遇见apt-get命令,这是在ubuntu下使用获取软件包的命令,fedora使用的是yum,记住了,否则经常出现使用apt-get却获取不了软件包的情况。 方法1:在/etc/ld.so.conf.d下新建一个文件opencv.conf,里面输入/usr/local/lib 方法2:在/etc/ld.so.conf文件中加入/usr/local/lib这一行 然后执行 #ldconfig(root权限下) #cp /usr/local/lib/pkconfig/opencv.pc /usr/lib/pkgconfig (或者是输入这个命令 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH)(pkconfig的用法见以前的博文) 至此opencv安装完成 我们可以找个例子来做实验 #cd /home/lg/Opencv2.3.0 #cd samples/cpp #g++ `pkconfig --cflags --libs opencv` drawing.cpp -o drawing(记住前面的两个引号是通过ESC下面的那个波浪符键获得 页次: 1

相关文档
最新文档