文档视界 最新最全的文档下载
当前位置:文档视界 › TCPMP代码分析

TCPMP代码分析

TCPMP代码分析
TCPMP代码分析

TCPMP源代码分析

播放器主要由核心框架模块(common工程)和解码器、分离器插件组成。TCPMP的插件非常多,其中主要的插件有:interface插件实现了TCPMP的界面,ffmpeg是系统主要的音视频解码模块,splitter是媒体文件分离器。

由于ffmpeg的解码效率不高,系统仅使用了ffmpeg的部分功能。并且未使用其中的libavformat模块,而使用splitter模块进行。其他插件暂时没有研究。本周主要分析的是common工程。

common工程是核心模块,是一个开放的集数据输入、转换、音/视频解码、信号输出等功能为一体的完整的多媒体播放框架。这个框架自身不包含任何的D ecode和Split功能,这些功能由插件实现,核心模块以一个树状结构管理所有的功能模块和插件模块,实现数据Render功能,对输入、转换、输出流程的控制,接受播放过程中的操作和对事件进行处理,同时也实现系统运行中经常使用的一些共用函数,比如解码过程中经常使用的逆离散余弦变换,内存操作,界面中需要使用的多语言字符处理等。

common工程的主目录下主要有:blit、dyncode、overlay、pcm、soft idct、win32、zlib等子目录。其中blit和overlay存放是视频信号渲染模块,pcm存放PCM音频信号转换模块,softidct存放逆离散余弦变换函数,win3 2存放内存操作等常用模块,dyncode这个目录的代码比较晦涩,存放的是程序运行时动态生成代码模块,针对不同的CPU指令集,PCM数据声道和采样率不同,视频渲染数据格式和色深等不同情况动态生成不同的优化代码,zlib则提供了内存中压缩和解压缩的函数,包括未压缩数据的完整性检查。

以下是common工程核心模块中几个重要的概念:

(1)上下文对象context

该对象在初始化函数bool_t Context_Init中创建了一个该对象实例(c ontext.h)。该对象实例记录管理各个功能模块,用户界面可以通过该对象和核心模块交互,管理控制播放过程。

(2)功能模块

功能模块包括定义对象nodedef和数据对象node,定义对象描述功能模块相互间的逻辑结构,数据对象记录模块属性和方法。所有的功能模块

结构按一个树状结构来组织,结构关系如下,NODE是整个结构的根结点,其下为子节点,节点按类型可分为实节点,全局节点,设置节点,抽象节点。

抽象节点没有对应的对象实例,类似C++的抽象基类,为了按照逻辑关系组织系统结构而存在,例如NODE就是抽象节点。全局节点只有一个对象的实例,如播放控制模块PLAYER_ID。设置节点表示和系统播放设置相关,比如声音均衡器模块EQUALIZER_ID,颜色控制模块COLOR_ID。实节点与抽象节点不同,指可以生成对象实例的节点,实节点没有特殊标识,一般以数据对象占用内存大小表示是否是一个实节点,创建节点时要根据该信息分配内存单元,实节点也可以有子节点,例如:MMS_ID的父节点是H TTP_ID。全局节点,设置节点和实节点可以相互组合,比如播放控制节点同时是全局节点,设置节点和实节点。

下面是主要的节点树状分布图:

NODE_CLASS (根节点)

├─FLOW_CLASS (流控制模块)(com Flow_Init )

│├─CODEC_CLASS (解码模块)(com Codec_Init)

││├─AMRNB_ID

││├─AMRWB_ID

││├─EQUALIZER_ID (声音均衡器模块)(com Equalizer_Init)

││├─VBUFFER_ID (视频缓冲模块)

││├─DMO_CLASS (DirectX Media Object)(com dmo_init)

│││├─WMV_ID

│││├─WMS_ID

│││├─WMVA_ID

│││├─WMA_ID

│││└─WMAV_ID

││├─FFMPEG_VIDEO_CLASS (FFMpeg 解码模块)(ffmpeg FFMPEG_Init)││└─LIBMAD_ID (Libmad Mp3解码模块)(libmad LibMad_Init)

│├─OUT_CLASS (信号渲染模块)(com Flow_Init)

││├─AOUT_CLASS (音频信号渲染)(com Audio_Init)

│││├─NULLAUDIO_ID

│││└─WAVEOUT_ID

││└─VOUT_CLASS (视频信号渲染)(com Video_Init)

││├─NULLVIDEO_ID

││└─OVERLAY_CLASS(com Overlay_Init)

││├─AHI_ID (ati3200 ATI3200_Init)

││├─DDRAW_ID

││├─DIRECT_ID

││├─DDRAW_ID

││├─FLYTV_ID

││├─GAPI_ID

││├─GDI_ID

││└─RAW_ID

│├─IDCT_CLASS (离散余弦解码模块)(com IDCT_Init)

││└─SOFTIDCT_ID

│└─CODECIDCT_CLASS(离散余弦解码模块,函数比IDCT要少)(com IDCT_Init)│├─MJPEG_ID (camera MJPEG_Init)

│├─MPEG1_ID (mpeg1 MPEG1_Init)

│├─MSMPEG4_ID (mpeg4 msmpeg4_init)

│├─MPEG4_ID (mpeg4 mpeg4_done)

│└─H263_ID (mpeg4 mpeg4_done)

│└─I263_ID

├─MEDIA_CLASS (媒体文件格式编码解析模块)(com Format_Init)

│├─FORMAT_CLASS (格式解析模块)(com Format_Init)

││└─FORMATBASE_CLASS (com FormatBase_Init)

││├─RAWAUDIO_CLASS(com RawAudio_Init)

│││├─MP3_ID (libmad LibMad_Init)

│││├─AAC_ID(aac FAAD_Init)

│││├─AA3_ID

│││├─AMRNB_FILE_ID (mar AMRNB_Init)

│││└─AMRWB_FILE_ID

││├─RAWIMAGE_CLASS(com RawImage_Init)

│││├─JPEG_ID (camera MJPEG_Init)

│││├─PNG_FILE_ID

│││└─TIFF_FILE_ID

││├─ASAP_ID(asap )

││├─ASF_ID(splitter ASF_Init)

││├─AVI_ID (splitter AVI_Init)

││├─FLV_ID (splitter FLV_Init)

││├─MP4_ID(splitter MP4_Init)

││├─MPG_ID(splitter MPG_Init)

││├─NSV_ID

││├─WEB_MJPEG_ID(camera MJPEG_Init)

││└─WAV_ID

│├─PLAYLIST (播放列表模块)

││├─ASX_ID

││├─M3U_ID

││└─PLS_ID

│└─STREAMPROCESS_CLASS (数据流处理模块)

├─STREAM_CLASS (数据输入模块)

│├─MEMSTREAM_ID (内存数据流模块)

│├─FILE_ID (文件IO模块)

│└─HTTP_ID (网络数据获取模块)

├─TIMER_CLASS (定时器模块)

│└─SYSTIMER_ID

├─ASSOCIATION_ID (文件扩展名自动关联模块)

├─ADVANCED_ID (高级设置模块)

├─COLOR_ID (颜色控制模块)

├─PLATFORM_ID (平台信息模块)

├─XSCALEDRIVER_ID

├─PLAYER_ID (播放控制模块)

└─PLAYER_BUFFER_ID (播放缓冲模块)

以下是common工程核心模块的几个重要数据结构:(1)context 上下文对象

typedef struct context

{

int Version;//版本信息

uint32_t ProgramId;//应用程序句柄

const tchar_t* ProgramName;//应用程序名称

const tchar_t* ProgramVersion;//程序版本号,字符串

const tchar_t* CmdLine;//程序命令行信息

void* Wnd;//视频渲染窗口句柄

void* NodeLock;//功能模块访问临界区互斥变量

array Node; //功能模块数据对象数组

array NodeClass; // ordered by id功能模块定义对象数组,按照系统逻辑关系组织

array NodeClassPri; // ordered by priority|id功能模块定义对象数组,按照系统逻辑关系和优先级排列

array NodeModule;//外部插件模块数组

int LoadModuleNo;//当前正在加载的外部插件序号

void* LoadModule;//当前正在加载的外部插件

array StrTable[2];//字符串资源数组,字符串分为:给底层使用的标准字符串资源、给界面使用的显示字符串资源,两个资源用两个数组表示array StrBuffer;

array StrModule;//未使用

void* StrLock;//字符串数组访问临界区互斥变量

uint32_t Lang;//当前使用语言标志

int CodePage;//当前使用代码页标志

struct pcm_soft* PCM;//PCM音频信号转换模块

struct blitpack* Blit;//视频信号渲染模块

struct node* Platform;//得到平台相关信息

struct node* Advanced;//得到播放模块高级信息

struct node* Player;//播放控制模块

notify Error;//信息错误回调函数

int (*HwOrientation)(void*);

void *HwOrientationContext;

bool_t TryDynamic;//未使用

int SettingsPage;//未使用

size_t StartUpMemory;//可以使用的有效内存数

bool_t InHibernate;//是否进入休眠状态

bool_t WaitDisable;//未使用

int FtrId;//未使用

bool_t LowMemory;//可以使用的有效内存数是否小于系统要求的最低要求

//动态代码生成中间状态及数据

bool_t CodeFailed;

bool_t CodeMoveBack;

bool_t CodeDelaySlot;

void* CodeLock;

void* CodeInstBegin;

void* CodeInstEnd;

int NextCond;

bool_t NextSet;

bool_t NextByte;

bool_t NextHalf;

bool_t NextSign;

uint32_t* FlushCache;//未使用

void* CharConvertUTF8;//未使用

void* CharConvertCustom;//未使用

int CustomCodePage;//未使用

void* CharConvertAscii;//未使用

void* Application;

void* Logger;//未使用

bool_t KeepDisplay;//是否保持背光长亮

int DisableOutOfMemory;//未使用

} context;

(2)nodedef 功能模块定义对象

功能模块树状结构通常由若干个静态定义对象(nodedef)实例实现,

typedef struct nodedef

{

int Flags;//功能模块节点的类型:抽象、实节点、全局、设置。

int Class;//功能模块节点的标识,如MEDIA_CLASS或ASF_ID等等。

int ParentClass;//功能模块父节点的标识,如SYSTIMER_ID对象的父节点是TIMER_CLASS。

int Priority;//表示功能模块节点优先级。

nodecreate Create;//创建功能模块定义对象的函数指针

nodedelete Delete;//销毁功能模块定义对象的函数指针

} nodedef;//功能模块定义对象

如解码器功能模块静态定义对象:

static const nodedef Codec =

{

sizeof(codec)|CF_ABSTRACT,

CODEC_CLASS,

FLOW_CLASS,

PRI_DEFAULT,

(nodecreate)Create,

(nodedelete)Delete,

};

(3)nodeclass 功能模块定义对象链表结构

用链表的方式实现了功能模块树状结构,每个链表代表树状结构的一个分支。typedef struct nodeclass

{

nodedef Def;//功能模块定义对象

bool_t Registered;//是否注册

int ModuleNo;//模块标识

struct nodeclass* Parent;//功能模块定义对象的父对象

} nodeclass;//功能模块定义节点对象链表结构

(4)node 功能模块数据对象

typedef struct node

{

int Class;//功能模块节点的类型,如MEDIA_CLASS等等,与nodedef相同。

nodeenum Enum;//枚举节点属性函数指针

nodeget Get;//获取节点属性的函数指针

nodeset Set;//设置节点属性的函数指针

} node;//功能模块数据对象

上述几个数据对象的相互关系:

在系统上下文对象context中有两个元素记录功能模块信息array Node 和array NodeClass,array是数组数据类型(在buffer.h/c中定义和实现),Node是功能模块数据对象的数组,NodeClass功能模块定义对象的数组,按照系统逻辑关系组织。

创建功能模块时传入nodedef对象到功能模块创建函数,函数会根据nodedef信息生成对应nodeclass对象添加到NodeClass数组,同时根据nodedef信息分配数据对象的内存空间。在该节点的Create函数里面再初始化该功能模块的数据对象node。

(5)datadef 功能模块属性

typedef struct datadef

{

int No;//属性的标识,如播放控制模块的#define PLAYER_PLAY 0x32 就表示控制播放器播放或暂停。

int Type;//属性的数据类型,在node.h中定义,如TYPE_BOOL

int Flags;//属性数据的标志,是属性数据的标志,表示该数据是不是只读数据,是否有最大最小值等等,node.h中定义,如DF_RDONLY int Format1;

int Format2;

const tchar_t* Name;

int Class;

int Size;

} datadef;//属性对象定义

其中Format1和Format2是可选标志与Flags配合使用,比如如果Flags表示该属性存在最大最小值,Format1就是最大值,Format2则是最小值;

另外,如果(!(Flags & DF_NOSAVE) && !(Flags & DF_RDONLY))即属性标识为保存且可读写,则会被记录到注册表中,下次启动时用注册表的数据初始化该属性表。

(6)datatable 功能模块属性列表

typedef struct datatable

{

int No;

int Type;

int Flags;

int Format1;

int Format2;

} datatable;//功能模块属性列表

各功能模块的属性通常以数组的形式定义和存储,如格式解析模块属性列表static const datatable Params[] =

{

{ FORMAT_INPUT, TYPE_NODE, DF_INPUT|DF_HIDDEN, STREAM_CLASS },

{ FORMAT_OUTPUT, TYPE_NODE, DF_HIDDEN, STREAM_CLASS },

{ FORMAT_DURATION, TYPE_TICK },

{ FORMAT_FILEPOS, TYPE_INT, DF_HIDDEN },

{ FORMAT_FILESIZE, TYPE_INT, DF_KBYTE },

{ FORMAT_AUTO_READSIZE, TYPE_BOOL, DF_HIDDEN },

{ FORMAT_GLOBAL_COMMENT,TYPE_COMMENT, DF_OUTPUT }, { FORMAT_FIND_SUBTITLES,TYPE_BOOL, DF_HIDDEN },

{ FORMAT_STREAM_COUNT, TYPE_INT, DF_HIDDEN },

DATATABLE_END(FORMAT_CLASS)

};

(7)nodemodule 外部插件功能模块

typedef struct nodemodule

{

int Id;//插件标识

int ObjectCount;//该插件的实例个数(引用计数)

bool_t Tmp;//是否是临时节点

int64_t Date;//设置时间

int KeepAlive;//保持时间

void* Module;//外部插件模块

void* Db;

void* Func;

uint8_t* Min;

uint8_t* Max;

} nodemodule;//外部插件模块节点

核心模块的初始化流程及相应代码对应关系(参考context.c 中的Context_Init函数)

Mem_Init();

//内存等资源初始化(Win32\mem_win32.c)

DynCode_Init();

//程序运行动态生成代码模块,优化PCM,视频渲染模块等(DynCode\DynCode.c) String_Init();

//系统使用字符串初始化(str.c,Win32\str_win32.c)

PCM_Init();

//音频信号转换模块初始化(PCM\pcm_soft.c)

Blit_Init();

//视频信号渲染模块初始化(Blit\blit_soft.c)

Node_Init();

//根节点模块初始化(node.c,Win32\node_win32.c)

Platform_Init();

//平台信息模块初始化(platform.c,Win32\platform_win32.c)

Stream_Init();

//输入数据流模块初始化(streams.c)

Advanced_Init();

//高级设置模块初始化(advance.c)

Flow_Init();

//流控制模块初始化(flow.c)

Codec_Init();

//解码模块初始化(codec.c)

Audio_Init();

//音频信号处理模块初始化(audio.c)

Video_Init();

//视频信号处理模块初始化(video.c)

Format_Init();

//格式解析模块初始化(format.c)

Playlist_Init();

//播放列表模块初始化(playlist.c)

FormatBase_Init();

//基本格式解析模块初始化(format_base.c,format_subtitle.c)

NullOutput_Init();

//无输出设备模块初始化(nulloutput.c)

RawAudio_Init();

//RawAudio模块初始化(rawaudio.c)

RawImage_Init();

//RawImage模块初始化(rawimage.c)

Timer_Init();

//定时器模块初始化(timer.c)

IDCT_Init();

//离散余弦解码模块初始化(idct.c)

Overlay_Init();

//视频叠加模块初始化(overlay.c)

M3U_Init();

//M3U格式播放列表模块初始化(PlayList\m3u.c)

PLS_Init();

//PLS格式播放列表模块初始化(PlayList\pls.c)

ASX_Init();

//ASX格式播放列表模块初始化(PlayList\asx.c)

WaveOut_Init();

//波形输出模块初始化(waveout.c,Win32\waveout_win32.c)

SoftIDCT_Init();

//soft离散余弦解码模块初始化(SoftIDCT\softidct.c)

Plugins_Init();

//外部插件模块初始化(Win32\node_win32.c)

另外还有文件扩展名自动关联模块Association_Init (参考文件Win32\ association_win32.c);颜色控制模块Color_Init(参考color.c);声音均衡器模块Equalizer_Init(参考equalizer.c);播放控制模块初始化(参考player.c )。向系统中载入外部插件模块(参考node.c以及node_win32.c)

node.c中的LoadModule函数,可以在系统中载入外部插件模块,

static NOINLINE nodemodule* LoadModule(context* p,int No),

第一个参数是上下文对象,

第二个参数是外部插件模块标识

node_win32.c定义了dll的载入与卸载函数以及相应的注册表操作,如

在功能模块节点载入外部插件模块,通过每个dll导出的DllRegister函数,该函数内包含了所有解码、播放等模块的初始化过程,通常为***_Init()。void* NodeLoadModule(const tchar_t* Path,int* Id,void** AnyFunc,void** Db)

与界面相交互的播放控制模块(player.c)

在所有功能模块中和界面加交互的主要就是播放控制模块struct node* P layer;使用方法如下:

context* p = Context();

player* myplayer = NULL;

if(p) myplayer = (player*)(p->Player);

控制播放使用

Set(void* This,int No,const void* Data,int Size)

第一个参数是播放模块指针,

第二个参数是控制代码,即要进行什么操作,

第三个参数是需要赋值给控制代码的数值,

最后一个参数是所赋数值的占用内存的大小。

myplayer->Set(myplayer,PLAYER_PLAY,1,sizeof(int));

PLAYER_PLAY为控制代码,表示当前控制的是播放暂停功能,数值为1表示播放为0表示暂停。

得到某一控制属性使用Get(void* This,int No,void* Data,int Size);函数,参数含义和Set函数相同。

控制代码是一组宏,定义在player.h文件中。比较重要的控制参数有播放控制模块所有可用参数见static const datatable PlayerParams[]结构。

添加一个媒体文件到播放模块使用

int PlayerAdd(player* Player,int Index, const tchar_t* Path, const tchar_t* Title);

第一个参数为播放模块指针,

第二个参数是添加到播放模块文件队列的序号,如果是使文件成为第一个文件该参数设为0,

第三个参数是媒体文件的目录和名称,

第四个参数为媒体文件标题,该参数可以忽略。

Android源代码结构分析

目录 一、源代码结构 (2) 第一层次目录 (2) bionic目录 (3) bootloader目录 (5) build目录 (7) dalvik目录 (9) development目录 (9) external目录 (13) frameworks目录 (19) Hardware (20) Out (22) Kernel (22) packages目录 (22) prebuilt目录 (27) SDK (28) system目录 (28) Vendor (32)

一、源代码结构 第一层次目录 Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示: . |-- Makefile (全局的Makefile) |-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码) |-- bootloader (引导加载器),我们的是bootable, |-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |-- dalvik (JAVA虚拟机) |-- development (程序开发所需要的模板和工具) |-- external (目标机器使用的一些库) |-- frameworks (应用程序的框架层) |-- hardware (与硬件相关的库) |-- kernel (Linux2.6的源代码) |-- packages (Android的各种应用程序) |-- prebuilt (Android在各种平台下编译的预置脚本) |-- recovery (与目标的恢复功能相关) `-- system (Android的底层的一些库)

层次分析法实现代码(MATLAB)

%% AHP weight calculation %%data input clc clear all A =[1 3 5 7 9 5;1/3 1 3 9 3 3;1/5 1/3 1 3 3 1/3;1/7 1/9 1/3 1 5 1/3;1/9 1/3 1/3 1/5 1 1/3;1/5 1/3 1 3 3 1]; %%Consistency calculation and weight vector calculation [n,n] = size(A); [v,d] = eig(A); r = d(1,1); CI = (r-n)/(n-1); RI = [0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.52 1.54 1.56 1.58 1.59]; CR = CI/RI(n); if CR<0.10 CR_Result = 'pass'; else CR_Result = 'no pass'; end % % Weight vector calculation w = v(:,1)/sum(v(:,1));

w = w'; % % output disp('The judgment matrix weight vector calculation report:'); disp('coincidence indicator:');disp(num2str(CI)); disp('Consistency ratio:');disp(num2str(CR)); disp(' Consistency test results:');disp(CR_Result); disp('eigenvalue:');disp(num2str(r)); disp('weight vector:');disp(num2str(w));

yaffs2文件系统制作

交叉编译器ARM-Linux-gcc4.1.2 开发板TX2440A Busybox-1.15.1.tar.bz2(在Linux中被称为瑞士军刀) mkyaffs2image工具 首先创建一个名字为root_2.6.31的文件夹,在其中创建如下文件夹 etc bin var dev home lib mnt proc root sbin sys tmp usr opt共14个文件夹 解压Busybox tar xjvf busybox 进入源目录,修改Makefile 第164行,CROSS_COMPILE=arm-linux- 第190行,ARCH=arm 执行#make men onfig进行配置 配置选项大部分都是保持默认的,只需要注意选择以下这几个选项,其他的选项都不用动:Busybox Setting---> Build Options---> [*]Build Busybox as a static binary(no shared libs) [*]Build with Large File Support(for accessing files>2GB) Installation Options--->

(./_install)Busybox installation prefix 进入这个选项,输入busybox的安装路径,如:../rootfs Busybox Library Tuning---> [*]vi-style line editing commands [*]Fancy shell prompts 要选择这个选项:“Fancy shell prompts”,否则挂载文件系统后,无法正常显示命令提示符:“[\u@\h\W]#” 配置完成以后 执行#make #make install 然后就会在上一级目录下生成rootfs文件夹,里面包含几个文件夹/bin/sbin/usr linuxrc 把这些文件全部复制到刚建好的root_2.6.31目录下, #cp–rf*../root_2.6.31 在dev目录下,创建两个设备节点: #mknod console c51 #mknod null c13 然后进入自己建立的etc目录 拷贝Busybox-1.15.2/examples/bootfloopy/etc/*到当前目录下。 #cp-r../../busybox-1.15.2/examples/bootfloopy/etc/*./ 包括文件:fstab init.d inittab profile

linux-2.6.18移植

Linux-2.6.18移植 有了我们的交叉编译环境和我们先前学的内核基础知识,下面我们就开始我们的内核移植了,我们所用的是博创的 S3C2410 。 关于 linux-2.6.18.tar.bz2 的下载网站先前我们说过,我们要先到该官方网站上去下载一个全新的内核。 [root@Binnary ~ ]# tar –jxvf linux-2.6.18.tar.bz2 [root@Binnary ~ ]# make mrproper 如果你是新下载的内核,那这一步就不用了。但如果你用的是别人移植好的内核,那最好在编译内核之前先清除一下中间文件,因为你们用来编译内核的交叉编译工具可能不同。 第一步:修改Makefile文件 将 改为 第二步:修改分区设置信息 我们要先在BootLoader中查看相应的分区信息 vivi>help 然后修改内核源码中的分区信息。分区信息文件在 a rch/arm/mach-s3c2410/common-smdk.c 将其中的

改为如下内容:

第三步:内核通过 BootLoader把数据写入NAND Flash,而vivi的ECC效验算法和内核的不同,内核的效验码是由NAND Flash控制器产生的,所以在此必须禁用NAND Flash ECC。所以我们就要修改 drivers/mtd/nand/s3c2410.c 这个文件。将 中的 chip->ecc.mode = NAND_ECC_SOFT ,改为如下 chip->ecc.mode = NAND_ECC_NONE。

只此一处。 第四步:下面是devfs的问题,因为2.6.12内核以后取消了devfs的配置选项,缺少了它内核会找不到mtdblock设备。所以我们需要修改 fs/Kconfig 文件,或者是从2.6.12的fs/Kconfig中拷贝下面几项到2.6.18的fs/Kconfig中去,我们采用修改的方法来完成。 修改 fs/Kconfig支持devfs 。 在Pseudo filesystems 主菜单的最后添加我们所要的内容。 第五步:文件系统的支持 Yaffs 文件系统 YAFFS文件系统简介 YAFFS,Yet Another Flash File System,是一种类似于JFFS/JFFS2的专门为Flash设计 的嵌入式文件系统。与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。 YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作。它们的不同之处在于: (1)、JFFS是一种日志文件系统,通过日志机制保证文件系统的稳定性。YAFFS仅仅 借鉴了日志系统的思想,不提供日志机能,所以稳定性不如JAFFS,但是资源占用少。 (2)、JFFS中使用多级链表管理需要回收的脏块,并且使用系统生成伪随机变量决定 要回收的块,通过这种方法能提供较好的写均衡,在YAFFS中是从头到尾对块搜索, 所以在垃圾收集上JFFS的速度慢,但是能延长NAND的寿命。 (3)、JFFS支持文件压缩,适合存储容量较小的系统;YAFFS不支持压缩,更适合存 储容量大的系统。 YAFFS还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用 户可以不使用Linux中的MTD和VFS,直接对文件进行操作。NAND Flash大多采用 MTD+YAFFS的模式。MTD( Memory Technology Devices,内存技术设备)是对Flash 操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开。 Yaffs 文件系统内核没有集成,可以对其主页下载: https://www.docsj.com/doc/9c7299030.html,/cgi-bin/viewcvs.cgi/#dirlist

基于Matlab的层次分析法及其运用浅析

基于Matlab的层次分析法及其运用浅析 本文通过使用Matlab软件进行编程,在满足同一层次中各指标对所有的下级指标均产生影响的假定条件下,实现了层次分析法的分析运算。本程序允许用户自由设定指标层次结构内的层次数以及各层次内的指标数,通过程序的循环,用户只需输入判断矩阵的部分数据,程序可依据层次分析法的计算流程进行计算并作出判断。本程序可以方便地处理层次分析法下较大的运算量,解决层次分析法的效率问题,提高计算机辅助决策的时效性。 标签:Matlab层次分析法判断矩阵决策 在当前信息化、全球化的大背景下,传统的手工计算已不能满足人们高效率、高准确度的决策需求。因此计算机辅助决策当仁不让地成为了管理决策的新工具、新方法。基于此,本文在充分发挥计算机强大运算功能的基础上,选用美国MathWorks公司的集成数学建模環境Matlab R2009a作为开发平台,使用M语言进行编程,对计算机辅助决策在层次分析法中的运用进行讨论。试图通过程序实现层次分析法在计算机系统上的运用,为管理决策探索出新的道路。 1 层次分析法的计算流程 根据层次分析法的相关理论,层次分析法的基本思想是将复杂的决策问题进行分解,得到若干个下层指标,再对下层指标进行分解,得到若干个再下层指标,如此建立层次结构模型,然后根据结构模型构造判断矩阵,进行单排序,最后,求出各指标对应的权重系数,进行层次总排序。 1.1 构造层次结构模型在进行层次分析法的分析时,最主要的步骤是建立指标的层次结构模型,根据结构模型构造判断矩阵,只有判断矩阵通过了一致性检验后,方可进行分析和计算。其中,结构模型可以设计成三个层次,最高层为目标层,是决策的目的和要解决的问题,中间层为决策需考虑的因素,是决策的准则,最低层则是决策时的备选方案。一般来讲,准则层中各个指标的下级指标数没有限制,但在本文中设计的程序尚且只能在各指标具有相同数量的下级指标的假定下,完成层次分析法的分析,故本文后文选取的案例也满足这一假定。 1.2 建立判断矩阵判断矩阵是表示本层所有因素针对上一层某一个因素的相对重要性的比较给判断矩阵的要素赋值时,常采用九级标度法(即用数字1到9及其倒数表示指标间的相对重要程度),具体标度方法如表1所示。 1.3 检验判断矩阵的一致性由于多阶判断的复杂性,往往使得判断矩阵中某些数值具有前后矛盾的可能性,即各判断矩阵并不能保证完全协调一致。当判断矩阵不能保证具有完全一致性时,相应判断矩阵的特征根也将发生变化,于是就可以用判断矩阵特征根的变化来检验判断的一致性程度。在层次分析法中,令判断矩阵最大的特征值为λmax,阶数为n,则判断矩阵的一致性检验的指标记为:

Yaffs2文件系统中对NAND Flash磨损均衡的改进

Yaffs2文件系统中对NAND Flash磨损均衡的改进 摘要:针对以NAND Flash为存储介质时Yaffs2文件系统存在磨损均衡的缺陷,通过改进回收块选择机制,并在数据更新中引入冷热数据分离策略,从而改善NAND Flash的磨损均衡性能。实验借助Qemu软件建立Linux嵌入式仿真平台,从总擦除次数、最大最小擦除次数差值和块擦除次数标准差等方面进行对比。实验结果表明,在改进后的Yaffs2文件系统下NAND Flash的磨损均衡效果有明显提升,这有益于延长NAND Flash的使用寿命。 关键词: Yaffs2文件系统;NAND Flash;垃圾回收;冷热数据 0 引言 NAND Flash存储设备与传统机械磁盘相比,具有体积小、存储密度高、随机存储和读写能力强、抗震抗摔、功耗低等特点[1]。它被广泛用于智能手机、车载智能中心、平板电脑等智能终端中。近年来,以NAND Flash为存储介质的固态硬盘也得到越来越多的应用。目前Yaffs2文件系统(Yet Another Flash File System Two,Yaffs2)[1]是使用最多、可移植性最好的专用文件系统,在安卓、阿里云OS、Linux等嵌入式系统中都有使用。在Yaffs2文件系统下以NAND Flash为存储介质时存在磨损均衡的缺陷,可通过对回收块选择机制作改进和引入冷热数据分离策略来提高磨损均衡的效果。 1 Yaffs2和Nand Flash关系 这里以使用最多的Linux操作系统为实践,将Yaffs2文件系统移植到Linux操作系统中。Linux系统通常可以分为3层:应用层、内核层和设备层,其中支持NAND Flash设备的Yaffs2文件系统属于内核层,。 最上层用户应用程序通过VFS(Virtual File System)提供的统一接口,将数据更新等文件操作传递给Yaffs2。VFS代表虚拟文件系统,它为上层应用提供统一的接口。有了这些接口,应用程序只用遵循抽象后的访问规则,而不必理会底层文件系统和物理构成上的差异。然后Yaffs2通过MTD(Memory Technology Device)提供的统一访问接口对NAND Flash进行读、写和擦除操作,从而完成数据的更新或者存储操作。MTD代表内存技术设备,它为存储设备提供统一访问的接口。最终,在NAND Flash上以怎样的格式组织和存储数据由Yaffs2文件系统决定。 NAND Flash由若干块(block)组成,每个块又是由若干页(page)组成,页中含有数据区和附加区。NAND Flash的页根据状态不同,可以分为有效页、脏页、空闲页。有效页中存放有效数据,脏页中存放无效数据,空闲页是经过擦除后可以直接用于写入数据的页。NAND Flash在写入数据前需要执行擦除操作,因此数据不能直接在相同的位置更新。当一个页中数据需要更新时,必须将该页中有效数据拷贝到其他空闲页上再更新,并将原来页上的数据置为无效。随着时间的推移,许多无效页累积在存储器中使得空闲页逐渐减少。当存储器中的空闲空间不足时,启动垃圾回收操作,利用回收块选择机制从待回收块中选取满足要求的块来擦除,从而得到足够的空闲空间。NAND Flash中块的擦除次数有限,通常为10 000次~100 000次[2]。当某个块的擦除次数超过使用寿命时,该块将无法正常用于数据存储。因此,垃圾回收应利用合理的回收块选择机制,从待回收块中找到回收后能产生良好磨损均衡效果且付出较少额外代价的块来回收,从而获得足够的空闲空间用于数据更新操作。 2 Yaffs2在磨损均衡方面的缺陷 Yaffs2中回收块的选择机制[3]是从待回收块中找到有效数据最少的块来回收。回收过程中,Yaffs2能够减少有效数据的额外读和写操作。当数据更新处于均匀分布的情况下,Yaffs2表现出较好的磨损均衡效果。 但是,通常情况下数据的更新频率不同,有些数据经常更新,而有些数据很少更新。经

Matlab求解层次分析法程序代码【求解步骤+代码】

层次分析法 1)建立层次结构模型: (2)构造判断矩阵 判断矩阵() ij A a =应为正互反矩阵,而且ij a 的判断如下(1~9尺度法): (3)单层排序及一致性检验 1、单层排序 求解判断矩阵A 的最大特征值max λ,再由最大特征值求出对应的特征向量

ω()max A ωλω=,并将ω标准化,即为同一层相对于上一层某一因素的权重,根据此 权重的大小,便可确定该层因素的排序。

2、一致性检验 取一致性指标max 1 n CI n λ-= -,(n 为A 的阶数) 令CR RI = ,若0.1CR <,则认为A 具有一致性。 否则,需要对A 进行调整,直到具有满意的一致性为止。 (4)层次总排序及一致性检验 假定准则层12,,,n C C C 排序完成,其权重分别为12,, ,n a a a ,方案层P 包含m 个方 案:12,, ,m P P P 。其相对于上一层的()1,2, ,j C j n =对方案层P 中的m 个方案进行单层排序,其排序权重记为12,,,j j mj b b b ()1,2, ,j n =,则方案层P 中第i 个方案Pi 的总 排序权重为 1 n j ij j a b =∑,见下表: 从而确定层的排序。 例: 纯文本文件txt3.txt 中的数据格式如下: 1 1 1 4 1 1/ 2 1 1 2 4 1 1/2 1 1/2 1 5 3 1/2 1/ 4 1/4 1/ 5 1 1/3 1/3 1 1 1/3 3 1 1 2 2 2 3 3 1 1 1/4 1/2

4 1 3 2 1/ 3 1 1 1/4 1/5 4 1 1/2 5 2 1 1 3 1/3 1/3 1 1/7 3 7 1 1 1/3 5 3 1 7 1/5 1/7 1 1 1 7 1 1 7 1/7 1/7 1 1 7 9 1/7 1 1 1/9 1 1 matlab程序: >> fid=fopen('txt3.txt','r'); n1=6;n2=3; a=[]; for i=1:n1 tmp=str2num(fgetl(fid)); a=[a;tmp]; %读准则层判断矩阵 end for i=1:n1 str1=char(['b',int2str(i),'=[];']); str2=char(['b',int2str(i),'=[b',int2str(i),';tmp];']); eval(str1); for j=1:n2 tmp=str2num(fgetl(fid)); eval(str2); %读方案层的判断矩阵 end end ri=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]; %一致性指标[x,y]=eig(a); lamda=max(diag(y)); num=find(diag(y)==lamda); w0=x(:,num)/sum(x(:,num)); cr0=(lamda-n1)/(n1-1)/ri(n1) for i=1:n1 [x,y]=eig(eval(char(['b',int2str(i)]))); lamda=max(diag(y)); num=find(diag(y)==lamda);

2-Linux

Linux-2.6.32.2内核在mini2440上的移植(二)---yaffs2文件系统移植 移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 2.1, yaffs2文件系统移植 【1】获取yaffs2 源代码 现在大部分开发板都可以支持yaffs2 文件系统,它是专门针对嵌入式设备,特别是使用nand flash 作为存储器的嵌入式设备而创建的一种文件系统,早先的yaffs 仅支持小页(512byte/page)的nand flash,现在的开发板大都配备了更大容量的nand flash,它们一般是大页模式的(2K/page),使用yaffs2 就可以支持大页的nand flash,下面是yaffs2 的移植详细步骤。 在https://www.docsj.com/doc/9c7299030.html,/node/346可以下载到最新的yaffs2 源代码,需要使用git工具( 安装方法见Git版本控制软件安装与使用),在命令行输入: [root@localhost ~]# cd ./linux-test [root@localhost linux-test]# git clone git://https://www.docsj.com/doc/9c7299030.html,/ya ffs2 Cloning into yaffs2... remote: Counting objects: 6592, done. remote: Compressing objects: 100% (3881/3881), done. remote: Total 6592 (delta 5237), reused 3396 (delta 2642) Receiving objects: 100% (6592/6592), 3.34 MiB | 166 KiB/s, d one. Resolving deltas: 100% (5237/5237), done.

AHP层次分析法详细讲解

AHP层次分析法详细讲解 。它是一种定性和定量相结合的、系统化、层次化的分析方法。由于它在处理复杂的决策问题上的实用性和有效性很快在世界范围得到重视。它的应用已遍及经济计划和管理、能源政策和分配、行为科学、军事指挥、运输、农业、教育、人才、医疗和环境等领域。 层次分析法的基本思路与人对一个复杂的决策问题的思维、判断过程大体上是一样的。不妨用假期旅游为例假如有3个旅游胜地A、B、C供你选择你会根据诸如景色、费用和居住、饮食、旅途等一些准则去反复比较这3个候选地点首先你会确定这些准则在你的心目中各占多大比重如果你经济宽绰、醉心旅游自然分别看重景色而平素俭朴或手头拮据的人则会优先考虑费用中老年旅游者还会对居住、饮食等寄以较大关注。其次你会就每一个准则将3个地点进行对比譬如A 景色最好B次之B费用最低C次之C居住等较好等等。最后你要将这两个层次的比较判断进行综合在A、B、C中确定哪个作为最佳地点。 层次分析法的基本步骤 1、建立层次结构模型。在深入分析实际问题的基础上将有关的各个因素按照不同属性自上而下 2 / 8 AHP指南-层次分析法详解地分解成若干层次同一层的诸因素从属于上一层的因素或对上层因素有影响同时又支配下一层的因素或受到下层因素的作用。最上层为目标层通常只有1个因素最下层通常为方案或对象层中间可以有一个或几个层次通常为准则或指标层。当准则过多时譬如多于9个应进一步分解出子准则层。 2、构造成对比较阵。从层次结构模型的第2层开始对于从属于或影响上一层每个因素的同一层诸因素用成对比较法和1—9比较尺度构追成对比较阵直到最下层。 3、计算权向量并做一致性检验。对于每一个成对比较阵计算最大特征根及对应特征向量利用一致性指标、随机一致性指标和一致性比率做一致性检验。若检验通过特征向量归一化后即为权向量若不通过需重新构追成对比较阵。 4、计算组合权向量并做组合一致性检验。计算最下层对目标的组合权向量并根据公式做组合一致性检验若检验通过则可按照组合权向量表示的结果进行决策否则需要重新考虑模型或重新构造那些一致性比率较大的成对比较阵。 层次分析法的优点运用层次分析法有很多优点其中最重要的一点就是简单明了。层次分析法不仅适用于存在不确定性和主观信息的情况还允许以合乎逻辑的方式运用经验、洞察力和直觉。也许层次分析法最大的优点是提出了层次本身它使得买方能够认真地考虑和衡量指标的相对重要性。 建立层次结构模型将问题包含的因素分层最高层解决问题的目的中间层实现总目标而采取的各种措施、必须考虑的准则等。也可称策略层、约束层、准则层等最低层用于解决问题的各种措施、方案等。把各种所要考虑的因素放在适当的层次内。用层次结构图清晰地表达这些因素的关系。 〔例1〕购物模型某一个顾客选购电视机时对市场正在出售的四种电视机考虑了八项准则作为评估依据建立层次分析模型如下 3 / 8 AHP指南-层次分析法详解〔例2〕选拔干部模型对三个干部候选人y1、y2 、y3按选拔干部的五个标准品德、才能、资历、年龄和群众关系构成如下层次分析模型假设有三个干部候选人y1、y2 、y3按选拔干部的五个标准品德才能资历年龄和群众关系构成如下层次分析模型构造成对比较矩阵比较第 i 个元素与第 j 个元素相对上一层某个因素的重要性时使用数量化的相对权重aij来描述。设共有 n 个元素参与比较则称为成对比较矩阵。

使用yaffs2img工具制作Android刷机包教程

制作刷机包 打开‘yaffs2img浏览器’,点击左上角的‘选取yaffs2文件’选择你刚刚复制出来的 files文件夹里的system.img 先来认识一下这个软件 1.定制软件的提取(此部和制作刷机包没关系,可以不做,想用官方软件的同学可以 看看) 选择app,右键你想要提取软件,提取就可以了,我是把整个app文件夹提取出来了,不用 的软件直接删掉好了 2.定制软件的精简 在你不想要用的软件上直接右键,删除,就好了,你也可以右键添加你想要用的软件,得把

软件改成比较简短的英文名,否则有可能不能用 秀一下我精简后的列表,大家可以参照着精简 https://www.docsj.com/doc/9c7299030.html,uncher文件的替换 下载好你想要用的桌面软件,改名为‘Launcher’,删掉app中的‘Launcher2’,添加进去你改好名字的‘Launcher’就好了,我比较喜欢ADW,所以我把ADW的文件名改为 Launcher,替换掉原来的Launcher2就好了 4.破音问题的解决 在左边导航点选‘etc’,右键添加文件,把附件中的声音配置文件解压出来 ‘AudioFilter.csv’添加进去就好了 AudioFilter.rar (355 Bytes)

5.字体的更改 下载字体文件,中文字体库一律把名字改名为‘DroidSans Fallback.ttf’,英文字体改为‘DroidSans.ttf ’,加粗的英文字体改为‘DroidSans-Bold.ttf ’然后再左边导航栏点选‘fonts’,把之前自带的字体删除,然后把你改好名字的字体添加进去就好了把国产机皇的字体也分享给大家,中文+英文+英文加粗 6.开机音乐和照相机音乐的删除 在导航栏点选‘media’,在audio/ui文件夹下,删除‘Bootsound.mp3’(开机音乐)和

层次分析法matlab程序举例

层次分析法程序举例: A=[1 1/7 1/5 2 4 1/3;7 1 3 5 5 3;5 1/3 1 5 5 3;1/2 1/3 1/5 1 2 1/3;1/4 1/5 1/5 1/2 1 1/5;3 1/3 1/3 3 5 1]; [v,d]=eig(A); eigenvalue=diag(d); lamda=max(eigenvalue); cil=(lamda-6)/5; crl=cil/1.26; w1=v(:,1)/sum(v(:,1)) 挑选合适的工作。经双方恳谈,已有三个单位表示愿意录用某毕业生。该生根据已有信息建立了一个层次结构模型,如下图所示。 程序: A=[1 1/7 1/5 2 4 1/3;7 1 3 5 5 3;5 1/3 1 5 5 3;1/2 1/3 1/5 1 2 1/3;1/4 1/5 1/5 1/2 1 1/5;3 1/3 1/3 3 5 1]; [v,d]=eig(A); eigenvalue=diag(d); lamda=max(eigenvalue); ci=(lamda-6)/5

cr=ci/1.26 w1=v(:,1)/sum(v(:,1)) B1=[1 1/4 1/2;4 1 3;2 1/3 1]; [v,d]=eig(B1); eigenvalue=diag(d); lamda=max(eigenvalue); cil1=(lamda-3)/2 cr1=cil1/0.52 b1w=v(:,1)/sum(v(:,1)) B2=[1 1/4 1/5;4 1 1/2;5 2 1]; [v,d]=eig(B2); eigenvalue=diag(d); lamda=max(eigenvalue); cil2=(lamda-3)/2 cr2=cil2/0.52 b2w=v(:,1)/sum(v(:,1)) B3=[1 1/2 2; 2 1 3;1/2 1/3 1]; [v,d]=eig(B3); eigenvalue=diag(d);

第2天 linux系统的编译及镜像文件的制作

第2天linux系统的编译及镜像文件的制作 一般来说,linux系统分为几个映像。 一:bootload :一般常用的是 U-boot 二:内核映像:主要是linux内核编译成的映像比如TQ210开发板使用的zImage.bin 三:文件系统:有很多格式,比如 下面根据TQ210说明书进行讲解,大部分参考官方手册。以后自己修改源码可以在此基础上进行修改,修改完以后按照此步骤进行编译,编译完成后进行下载到开发板进行运行 1编译bootloader 1.1光盘中的 u-boot 源码的解压 先将光盘中的 u-boot 源码 ( 在光盘的“ TQ210_CD\bootloader\ ” 目录下 , 名为 uboot_TQ210_1.3.4_V1.1.tar.bz2)拷贝到 PC 的linux系统的根目录(这里说的根目录是本手册编写者的操 作和截图所拷贝的地方, 实际操作可以拷贝到任意目录下) 下, 然后使用命令#tar xvfjuboot_TQ210_1.3.4_V1.1.tar.bz2 -C /,解压源码,如下图所示 源码解压后,会在“/opt/EmbedSky/TQ210/uboot_TQ210_1.3.4/”目录下得到刚刚解压的源码。 1.2 光盘中的u-boot源码的编译 解压完成后,使用命令#make TQ210_config,配置u-boot,如下图所示:

使用命令#make,编译u-boot。编译结束后,在/opt/EmbedSky/TQ210/uboot_TQ210_1.3.4/目录下会得 到一个名字u-boot.bin的镜像,将其拷贝到Windows 或者拷贝到TFTP 服务器发送文件指定的目录中,就 可以烧写到开发板上面进行测试了(或者制作成SD 启动卡也可以测试)。如下两图所示:

S3C2440的Linux内核移植和yaffs2文件系统制作

L i n u x内核移植和根文件系统制作 第一章移植内核 (2) 1.1 Linux内核基础知识 (2) 1.1.1 Linux版本 (2) 1.1.2 什么是标准内核 (2) 1.1.3 Linux操作系统的分类 (3) 1.1.4 linux内核的选择 (4) 1.2 Linux内核启动过程概述 (5) 1.2.1 Bootloader启动过程 (5) 1.2.2 Linux启动过程 (7) 1.3 Linux内核移植 (10) 1.3.1 移植内核和根文件系统准备工作 (10) 1.3.2 修改Linux源码中参数 (11) 1.3.3 配置Linux内核 (15) 1.3.4、编译内核 (17) 第二章制作根文件系统 (19) 2.1 根文件系统预备知识 (19) 2.2、构建根文件按系统 (19) 2.2.1、建立根文件系统目录 (19) 2.2.2、建立动态链接库 (21) 2.2.3 交叉编译Bosybox (21) 2.2.4 建立etc目录下的配置文件 (24) 2.2.5 制作根文件系统映像文件 (26) 第三章启动系统 (27) 第四章总结 (34)

第一章移植内核 1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。 1.1.1 Linux版本 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中: VERSION = 2 PA TCHLEVEL = 6 SUBLEVEL = 29 EXTRA VERSION = .1 其中的“VERSION”和“PA TCHLEVEL”组成主版本号,比如 2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。“EXTRA VERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。 1.1.2 什么是标准内核 按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在https://www.docsj.com/doc/9c7299030.html,/维护和获取的内核,实际上它也有平台属性的。这些linux 内核并不总是适用于所有linux支持的体系结构。实际上,这些内核版本很多时候并不是为一些流行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux 系统上,这个站点上的内核首先确保的是在Intel X86体系结构上可以正常运行,它是基于X86处理器的内核,如对linux-2.4.18.tar.bz2的配置make menuconfig 时就可以看到,Processor type and features--->中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III/Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III 、Athlon/Duron/K7 、Elan 、Crusoe、Winchip-C6 、Winchip-2 、

(课程总结)

《嵌入式系统案例分析与设计》 课程实验报告 班级: 学号: 姓名: 指导老师: 成绩:

嵌入式系统案例分析与设计课程实验报告 一、开发环境的构建 1. 交叉工具链arm-linux-gcc安装与设置 (1)首先在家目录下创建一个文件夹,然后继续在该文件夹目录下创建一个test文件夹,如下图所示: (2)将交叉编译工具链Linux4.6.1拷到test目录下并解压 解压: tar -xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz (3)添加环境变量 PATH 决定了shell将到哪些目录中寻找命令或程序 配置编译环境路径在控制台下输入vim /etc/profile 在文件最后一行添加下面语句:export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin (4)保存关闭后,重启,用root账号重新登录系统,刚刚添加的环境变量生效,在控制台输入:arm-linux-gcc -v 如果安装成功将会输出arm-linux-gcc的版本号。如下图所示,显示gcc version 4.5.1 ,表示交叉编译工具链安装成功。

2. 设置TFTP服务器 (1)运行下面的命令,安装TFTP服务器和客户端# apt-get install tftpd-hpa tftp-hpa (2)运行下面的命令,重启TFTP服务器 # service tftpd-hpa restart

(3)新建一个文件,并将其移动到TFTP服务器的默认上传下载目录 (4)从服务器上下载test.txt文件,并退出tftp程序 (5)运行如下命令,确认下载的文件内容正确 3. 设置NFS服务器 (1)安装NFS服务器 # apt-get install nfs-kernel-server (2)运行下面的命令,创建一个目录,并在该目录下创建一个文件mkdir /nfs chown root /nfs chgrp root /nfs mkdir /nfs/rootfs echo "nfs test" > /nfs/rootfs/test.txt (3)编辑/ect/exports配置文件。 gedit /etc/exports

yaffs2制作教程

Yaffs2根文件系统制作 环境: 交叉编译环境:4.3.3 (天嵌科技提供,存放路径/opt/EmbedSky/4.3.3)开发平台:TQ2440 1,编译busybox 获取busybox源码 busybox-1.17.2.tar (https://www.docsj.com/doc/9c7299030.html,/downloads/)置于目录/opt/embed下 #tar jxvf busybox-1.17.2.tar.bz2 #cd busybox-1.17.2 #vim Makefile 将164行改为CROSS_COMPILE = arm-linux- 将190行改为ARCH = arm 保存推出进入配置菜单 #make menuconfig 采用默认配置保存推出 #make #make install 在busybox-1.17.2的根目录下出现了一个_install目录在该目录下又有三个目录文件bin sbin usr 和一个链接文件 linuxrc 。 2,创建根文件系统必要的目录 回到/opt/embed目录下创建根文件系统必要的目录 #mkdir root_fs #cd root_fs 将刚才生成的三个目录bin sbin usr和一个链接文件linuxrc考到目录root_fs下

#cp -rf ../busybox-1.17.2/_install/* ./ #mkdir dev etc home lib mnt opt proc root sys tmp var 创建几个必要的二级目录 #mkdir usr/lib usr/share #mkdir etc/rc.d #mkdir var/lib var/lock var/run var/tmp 3,创建必要文件 (1), 获取库文件 (我的交叉编译工具链放在目录 /opt/EmbedSky/下的) #cp -rf /opt/EmbedSky/4.3.3/arm-none-linux-gn?i/libc/armv4t/lib/* so* lib -a (2),将主机 etc 目录下的passwd、group、shadow文件拷贝到 root_fs/etc 目录下 #cp -f /etc/passwd /etc/group /etc/shadow etc 将目录/opt/embed/busybox-1.17.2/examples/bootfloppy/etc下的所有文件拷贝到 root_fs/etc下。在这个目录下有三个文件fstab, inittab, profile和一个目录init.d, 在目录init.d中有一个文件rcS。 #cp -rf ../busybox-1.17.2/examples/bootfloppy/etc/* etc 在目录etc下创建文件mdev.conf。mdev是?v的一个简化版本,我们可以通过文件mdev.conf自定义一些设备节点的名称或链接来满足特定的需要,但在此处让它为空。 #touch etc/mdev.conf (3)创建两个设备文件dev/console dev/null。 在linux内核源码文件init/main.c中有打开设备文件dev/console 的操作如下:

层次分析法示例

中国计量学院 本科毕业设计(论文) “90后”员工工作满意度研究 ——基于杭州的实证 A Research on Job Satisfaction of the Post-90s Staffs —Based on the Empirical Study of Hangzhou 学生姓名学号 学生专业工商管理班级 1 二级学院经济与管理学院指导教师 中国计量学院 2014年5月

郑重声明 本人呈交的毕业设计论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的知识产权归属于培养单位。 学生签名:日期: 2014年5月20日

分类号:F272.9 密级:公开 UDC:33 学校代码:10356 中国计量学院 本科毕业设计(论文) “90后”员工工作满意度研究 ——基于杭州的实证 A Research on Job Satisfaction of the Post-90s Staffs —Based on the Empirical Study of Hangzhou 作者学号 申请学位管理学学士指导教师 学科专业工商管理培养单位中国计量学院 答辩委员会主席评阅人 2014 年 5 月

致谢

“90后”员工工作满意度实证研究 ——基于杭州的实证 摘要:在全球经济一体化日渐形成和中国特色市场经济体制不断完善的背景下,国内各行各业的企事单业员工都承受着远超以往的工作压力。作为国家的希望,当“90后”这批新时代的生力军开始踏上职场之后,他们的工作满意度如何,影响他们工作满意度的因素有哪些,如何帮助他们更好地适应职场,便成了人们关心的问题,这即是本文研究的主要内容。 本次调查采用问卷调查的形式,对杭州市123位企事业单位“90后”员工工作满意度现状进行实证研究,研究结果如下: (1)“90后”企事单业员工工工作满意度现状总体水平处于正常水平,但有较大的提升空间; (2)“90后”企事单业员工对“同事关系”的满意度最高,而对“工作强度”的满意度最低; (3)除性别以外,不同教育程度、单位性质和收入状况对于“90后”企事单业员工的工作满意度的多数影响因素都有显著的影响。 关键词:“90后”员工;工作满意度;层次分析法 中图分类号:F272.9

Android 2.1 源码结构分析

Android 2.1 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等基础开发包配置) |-- cts (Android兼容性测试套件标准) |-- dalvik (dalvik JAVA虚拟机) |-- development (应用程序开发相关) |-- external (android使用的一些开源的模组) |-- frameworks (核心框架——java及C++语言) |-- hardware (主要保护硬解适配层HAL代码) |-- out (编译完成后的代码输出与此目录) |-- packages (应用程序包) |-- prebuilt (x86和arm架构下预编译的一些资源) |-- sdk (sdk及模拟器) |-- system (文件系统库、应用及组件——C语言) `-- vendor (厂商定制代码) bionic 目录 |-- libc (C库) | |-- arch-arm (ARM架构,包含系统调用汇编实现) | |-- arch-x86 (x86架构,包含系统调用汇编实现) | |-- bionic (由C实现的功能,架构无关) | |-- docs (文档) | |-- include (头文件) | |-- inet (?inet相关,具体作用不明) | |-- kernel (Linux内核中的一些头文件) | |-- netbsd (?nesbsd系统相关,具体作用不明) | |-- private (?一些私有的头文件) | |-- stdio (stdio实现) | |-- stdlib (stdlib实现) | |-- string (string函数实现) | |-- tools (几个工具) | |-- tzcode (时区相关代码) | |-- unistd (unistd实现) | `-- zoneinfo (时区信息) |-- libdl (libdl实现,dl是动态链接,提供访问动态链接库的功能)|-- libm (libm数学库的实现,) | |-- alpha (apaha架构) | |-- amd64 (amd64架构) | |-- arm (arm架构) | |-- bsdsrc (?bsd的源码) | |-- i386 (i386架构) | |-- i387 (i387架构?)

相关文档
相关文档 最新文档