嵌入式复习资料文档格式.docx

上传人:b****6 文档编号:21560987 上传时间:2023-01-31 格式:DOCX 页数:15 大小:145.15KB
下载 相关 举报
嵌入式复习资料文档格式.docx_第1页
第1页 / 共15页
嵌入式复习资料文档格式.docx_第2页
第2页 / 共15页
嵌入式复习资料文档格式.docx_第3页
第3页 / 共15页
嵌入式复习资料文档格式.docx_第4页
第4页 / 共15页
嵌入式复习资料文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

嵌入式复习资料文档格式.docx

《嵌入式复习资料文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式复习资料文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

嵌入式复习资料文档格式.docx

理论上包含文件系统,数据库,系统注册表。

GWES:

图形窗口系统负责操作系统中与图形界面相关的部分提供基本的绘图功能和窗口管理器。

所有的用户输入(键盘,触摸屏等)相关的驱动程序都由GWES.EXE来加载和管理。

设备管理:

DEVICE.EXE是windowsCE中的设备管理器。

它负责加载,卸载和管理所有不被GWES.EXE管理的驱动程序,也负责加载所有的总线驱动程序和电源管理DLL,同时向系统提供所有关于驱动的API的实现。

网络服务:

SERVICES.EXE是负责加载系统服务的进程。

它们提供一些后台的处理或者为应用程序提供高级的功能。

WindowsCE中,FTP,HTTP和TELNET都是以系统服务的形式实现。

WindowsCE提供单独的API来启动,停止和操作服务。

二、线程与进程的区别

WinCE是一个基于优先级的抢占式多任务操作系统,在WinCE中,每一个运行着的应用程序都是一个进程。

在一个进程中可以包含一个或多个线程。

进程是程序的一次动态执行实例。

进程与程序不同,当程序被WinCE加载到内存并开始执行后就变成了一个实例或者说进程。

在WinCE中进程本身不参加系统的调度,也没有优先级和上下文。

线程是WinCE中最小的可执行单元。

WinCE中真正参加调度的是线程,每个进程在创建的时候都会创建一个主线程作为该进程默认的执行体。

从某种意义上说,进程只是线程的容量。

线程除了占有内存外,还占有其他资源,例如处理器的寄存器和栈,每个线程都有自己独立的栈。

这些资源构成了线程的上下文。

进程总是先于线程创建而后与线程撤离,也只有在进程中才有可能创建线程。

同一进程中的多个线程共享该进程的地址空间,这些线程可以执行同一段代码、处理同一堆数据,还能共享内核对象的句柄。

知识拓展:

WinCE最多只支持32个进程同时运行。

每个进程占据32MB的虚拟内存空间。

由于操作系统本身也被分成多个进程,因此,用户实际可用的进程数只有不到三十个。

因此,在构建复杂的应用程序时,如果需要同时处理多个任务,那么应该选择多线程解决方案而不是采用多进程。

线程可以运行在核心态和用户态。

在核心态,线程可以访问操作系统所有的资源。

三、线程的调度

线程的调度是抢占式的,WinCE使用的是基于时间片轮转算法对线程进行调度的,也就是说,对于处于就绪状态列队的线程,先分给优先级更高的线程以时间片,当时间片用完后,无论线程是否执行完毕,都退回就绪状态列队中继续等待下一次时间片的分配。

WinCE的线程被分为256个优先级,从0~255,0的优先级最高。

通常,应用程序能使用的优先级为248~255这八个最低的优先级,0~247供驱动程序和内核使用,这样做的目的是为了保证系统的可靠性和安全性。

应用程序可使用CreateThread()函数创建一个新线程。

结束线程,可以从线程的执行体函数返回,也可以使用WinCE中的ExitThread()和TerminateThread()函数结束线程。

四、WinCE内核启动过程

在NBOOT引导EBOOT后,EBOOT加载并引导WinCE操作系统(NK)。

首先,eboot跳转到OAL.exe的startup函数中执行。

startup的作用是初始化CPU。

startup函数执行完后将跳转到Kernelstart函数中,这个函数的主要任务就是为WINCE操作系统设置页表并且启用MMU。

之后KernelStart函数就会调用ARMInit函数。

ARMIint函数有三个主要的任务:

⑴是调用KernelRelocate()函数进行内核全局变量重定位。

⑵全局变量重新定位之后,对内核启动所需要的KDataStruct结构体

⑶是调用函数FindKernelEntry通过TOC找到kernel.dll的入口点函数地址

调用函数ARMInit函数后返回到NKStartup函数。

NKstartup函数的主要工作如下:

⑴从NKLoader传递过来的KDataStruct结构体数据中获取到供自身启动所需

要的数据信息,

⑵定位对WINCE6.0特有的OEMGLOBAL结构体的初始化函数OEMInitGlobals地址,该结构体构建了内核和OAL层之间进行通信的桥梁。

⑶调用函数ARMSetup为操作系统内核进程填充虚拟内存0XA0000000~0XBFFFFFFF范围的uncachable静态映射区域

⑷如果系统启用了KITL调试功能,则加载KITL模块

⑸调用OAL函数执行对目标平台板级硬件的初始化动作。

NKStartup函数完成后跳转到第二个KernelStart函数,这里的KernelStart函数与前面的KernelStart函数的属于两个完全不同的函数。

这个函数的主要工作有两部分:

⑴调用KernelInit函数来初始化内核

⑵调用FirstSchedule。

FirstSchedule函数为WindowsCE操作系统启动过程中最后无条件跳转的一个函数,FirstSchedule调用HandleException函数来让系统进行重新调度,这样就选择了第一个就绪的线程来执行。

kernelStart函数完成之后就调用内核初始化KernelInit函数。

主要完

成在启动第一个线程前对内核进行初始化,主要包括API函数集初始化、堆的初始化、初始化内存池、进程初始化、线程初始化和文件映射初始化等操作。

之后跳转到操作系统的第一个启动的任务FirstSchedule函数。

FirstSchedule函数为WindowsCE操作系统启动过程中最后无条件跳转的一个函数,windowsCE进行第一个调度,实际为一个空闲线程,因为windowsCE系统还没有完成启动,只有当windowsCE完全启动并进入稳定状态,然后启动文件系统filesys.dll,设备管理device.dll,窗体图像子系统gews.dll和shell程序explore.exe。

五、WINCE流驱动接口函数参数详解

DWORDXXX_Init()

备注:

当驱动被系统加载时,调用此函数。

初始化必要的驱动资源,执行内存映射操作,初始化服务线程。

BOOLXXX_Deinit()

当驱动被系统卸载时,调用此函数。

释放初始化时分配的内存资源,停止服务线程。

(驱动卸载)

DWORDXXX_Open()

当应用程序调用CreatFile()函数时,调用此函数。

返回函数句柄为其他IO函数使用,为打开的资源分配必要的资源。

BOOLXXX_Close()

当应用程序调用CloseHandle()函数时,调用此函数。

释放打开设备时分配的一些内存资源。

DWORDXXX_Read()

当应用程序调用ReadFile()函数时,调用此函数。

从设备中读取数据

DWORDXXX_Write()

当应用程序调用WriteFile()函数时,调用此函数。

向设备中写入数据

DWORDXXX_Seek()

该函数移动设备的数据指针

DWORDXXX_IOControl()

当应用程序调用DeviceIOControl()函数时,调用此函数。

提供支持自定义驱动操作机制,大多数驱动系统采用该方法进行设备控制,每个IO口控制代号表示某种设备操作。

voidXXX_PowerDown(DWORDhDeviceContext);

当系统停止对设备供电,或在调用DeviceIOControl()函数时,I/O命令字为IOCTL_POWER_XXX时调用此函数。

允许驱动执行使驱动设备进入低功耗模式。

voidXXX_PowerUp(DWORDhDeviceContext);

当系统恢复对设备供电,或在调用DeviceIOControl()函数时,I/O命令字为IOCTL_POWER_XXX时调用此函数。

该函数恢复对设备供电

XXX_PreClose

通知设备管理器把它打开的句柄设置为无效,并唤醒任何正在休眠的线程

XXX_PreDeinit

释放设备,在设备被卸载时调用

六、汇编指令

1.数据处理指令MOVMVNADDADCSUBSBCRSBRSCANDORREORBICCMPCMNTSTTEQ

MOVMOVR1,R0;

将寄存器R0的值传送到寄存器R1

MOVR1,R0,LSL#3;

将寄存器R0的值左移3位后传送到R1LSL左移

MVNMVNR1,R2;

将R2取反,结果存到R1中

ADDADDR0,R1,R2;

R0=R1+R2

ADCADDSR0,R2,R4;

低32位加,S影响标志位

ADCR1,R3,R5;

高32位带进位加

SUBSUBR0,R1,#6;

R0=R1-6

SUBR0,R2,R3,LSL#1;

R0=R2-(R3左移一位)

SBCSBCR0,R1,R2;

R0=R1-R2-!

C,并根据结果设置CPSR的进位标志位,!

C表示C取反

RSB实例:

RSBR0,R1,R2;

R0=R2-R1;

RSC实例:

RSCR0,R1,R2;

R0=R2-R1-!

C

ANDANDR0,R0,#3;

该指令保持R0的0,1位,其余位清零——清零

ORRORRR0,R0,#3;

该指令设置R0的0和1位,其余位保持不变——置位

EOREORR0,R0,#3;

该指令反转R0的0和1位,其余位保持不变——保持

BICBICR0,R0,#%1011;

该指令清除RO的0和1位,其余位保持不变——位清

CMPCMPR1,R0;

将寄存器R1和R0相减,根据结果设置CPSR标志位

CMNCMNR1,R0;

将R1和R0相加,根据结果设置CPSR标志位

TSTTSTR1,0xffe;

R1和0xffe按位与,根据结果设置CPSR

TEQTEQR1,R2;

R1和R2按位异或,根据结果设置CPSR

2.乘法

MULMULR0,R1,R2;

R0=R1*R2

MLAMLAR0,R1,R2,R3;

R0=R1*R2+R3

SMULLSMULR0,R1,R2,R3;

R0=(R2*R3)低32位,R1=(R2*R3)高32位

SMLALSMLALR0,R1,R2,R3;

R0=(R2*R3)低32位+R0,R1=(R2*R3)高32位+R1

UMULLUMULLR0,R1,R2,R3;

和SMULL一样只不过操作数为无符号

UMLALUMLALR0,R1,R2,R3;

和SMLAL一样,操作数无符号

3.指令-数据加载与存储指令

LDRR1,[R2,#0x08];

[R2+0x08]→R1

LDRR1,[R2],#0x08;

[R2]→R1,R2+8→R1

STRR1,[R2,#8];

R1→[R2+8]

STRR1,[R2],#8;

R1→[R2],R2+8→R2

LDRBR0,[R1];

[R1]→R0,并将R0的高24位清零。

LDRBR0,[R1,#8];

[R1+8]→R0,并将R0的高24位清零。

STRBR0,[R1];

将寄存器R0中的字节数据写入以R1为地址的存储器中。

STRBR0,[R1,#8];

将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

LDRHR0,[R1];

将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零。

LDRHR0,[R1,#8];

将存储器地址为R1+8的半字数据读入寄存器R0,并将R0的高16位清零

LDRHR0,[R1,R2];

将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。

STRHR0,[R1];

将寄存器R0中的半字数据写入以R1为地址的存储器中。

LDRSBR0,[R1,#4];

将存储地址为R1+4的有符号字节数读入R0,R0中的高24位设置成该字节数据的符号

LDRSHR6,[R2],#2;

将存储地址为R2+2的有符号半字数据读入R6,R6中的高16位设置成该字节数据的符号位,R2=R2+2

4、多寄存器加载与存储指令

重要的寻址:

堆栈寻址57面

快复制寻址58面

重要的程序:

见书109面数据块复制程序

.LDM/STM批量数据加载/存储指

STMFDSP!

{R1-R7,LR}数据压栈,将{R1-R7,LR}中的数据FD压栈

LDMFDSP!

{R1-R7,LR}数据出栈,将FD堆栈中的数据送入{R1-R7,LR}

5.状态寄存器传送指令:

MRSMRSR0,CPSR;

CPSR→R0

MSRMSRCPSR,R0;

R0→CPSR

6.转移指令:

BBLBXBLX

BLabel;

程序无条件跳转到标号Label处执行

CMPR1,#0;

当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行

BEQLabel

BLLabel;

当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中

7.协处理器指令

CDPP3,2,C12,C10,C3,4;

该指令完成协处理器P3的初始化

LDCP5,C1,[R0];

将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P5的寄存器C1中。

STCP3,C4,[R0];

将协处理器P3的寄存器C4中的字数据传送到ARM处理器的寄存器R0所指向的存储器中。

MCRP5,5,R1,C1,C2,9;

将ARM处理器寄存器R1中的数据传送到协处理器P5

的寄存器C1和C2中,协处理器执行操作5和9。

MRCP3,3,R0,C4,C5,6;

协处理器P3执行操作3和6,操作数为C4、C5,

其操作的结果传送到ARM处理器寄存器R0中。

8.交换指令

SWPR0,R1,[R2];

[R2]→R0,R1→[R2]

SWPR0,R0,[R1];

将R1所指向的存储器中的字数据与R0中的字数据交换。

SWPBR0,R1,[R2];

将R2所指向的存储器中的字节数据加载到R0,R0的高24位清零,同时将R1中的低8位数据存储到R2所指向的存储单元。

SWPBR0,R0,[R1];

将R1所指向的存储器中的字节数据与R0中的低8位数据交换。

8.软件中断指令

SWI0x02;

该指令调用操作系统编号为02的系统例程

(1)把准备传递的参数通过寄存器进行传递

MOVR0,#0x8;

使用8号功能段

SWI0;

实现中断,不指明调用的功能号

(2)用SWI指令传递中断号

SWI8;

实现中断,指明调用的功能号

9.ARM伪指令

ADR小范围的地址读取伪指令

StartMOVR0,#10;

此指令执行完后,PC=start+8

ADRR1,start;

因为PC=当前指令地址值为+8,换成SUBR1,PC,0x0C

ADRL中等范围的地址读取伪指令

替换为:

ADDR4,#84和ADDR4,R4,#59904

LDR大范围的地址读取伪指令

LDRR1,=0xFFF;

编译LDRR1,[PC,OFFSER_TO_LPOOL]和

LPOOLDCD0xFFF两条指令DCD分配地址

NOP空操作伪指令

指令的可选后缀

S后缀:

指令中使用S后缀时,指令执行后程序状态寄存器的条件标志位将被刷新,不使用S后缀时,指令执行后程序状态寄存器的条件标志将不会发生变化。

假设R0=0x1,R3=0x3,指令执行之前CPSR=nzcvqIFt_SVC,分别执行如下指令CPSR的值有何变化?

SUBR1,R0,R3;

R0的值减去R3的值,结果存入R1

SUBSR1,R0,R3;

R0的值减去R3的值,结果存入R1影响标志位

分析:

执行第1条指令对于标志寄存器的值没有任何影响,因此CPSR的值不变。

执行第2条指令后CPSR=NzcvqIFt_SVC,因为R0的值减去R3值,结果变成负数,故而N被置位了。

!

后缀:

如果指令地址表达式中不含!

后缀,则基址寄存器中的地址值不会发生变化。

指令中的地址表达式中含有!

后缀时,指令执行后,基址寄存器中的地址值将发生变化,变化的结果如下:

例3.3分别执行下面两条指令有何区别?

LDRR3,[R0,#4]

LDRR3,[R0,#4]!

在上述指令中,第1条指令没有后缀!

,指令的结果是把R0加4作为地址指针,把这个指针所指向的地址单元所存储的数据读入R3,R0的值不变。

第2条指令除了实现以上操作外,还把R0+4的结果送到R0中。

指令的条件执行

程序要执行的指令,均保存在存储器中,当计算机需要执行一条指令时,首先产生这条指令的地址,并根据地址号打开相应的存储单元,取出指令代码,CPU根据指令代码的要求以及指令中的操作数,去执行相应的操作。

ADDR4,R3,#1

ADDEQR4,R3,#1

ADDSR4,R3,#1

条件后缀只是影响指令是否执行,不影响指令的内容,如上述ADDEQ指令,可选后缀EQ并不影响本指令的内容,它执行时仍然是一条加法指令

这上面的指令没有给出明确的定义只给出例子不懂得自己看下书

七、电平转换

逻辑标准

Vcc电平

输出高电平UOH

输出低电平UOL

输入高电平UIH

输入低电平UIL

传输带宽

TTL

5V

2.4

0.6

2.0

0.8

80MHZ

LVTTL

3.3V

0.4

133MHZ

2.5V

2.1

1.7

0.7

166MHZ

1.8V

1.4

1.1

266MHZ

CMOS

3.5

0.7UCC

0.2UCC

NA

 

LCOMS

2.6

1.9

UCC-0.4

1.5V

PCI

0.9UCC

0.1UCC

0.5UCC

0.3UCC

33,66,133MHZ

经常能考到的是TTL与CMOS的对接。

PCI电平可以不用看。

八、MMU工作过程

大多数使用虚拟存储器的系统都使用一种称为分页(paging)。

虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。

接下来配合图片我以一个例子说明页与页框之间在MMU的调度下是如何进行映射的:

在这个例子中我们有一台可以生成16位地址的机器,它的虚拟地址范围从0x0000~0xFFFF(64K),而这台机器只有32K的物理地址,因此他可以运行64K的程序,但该程序不能一次性调入内存运行。

这台机器必须有一个达到可以存放64K程序的外部存储器(例如磁盘或是FLASH)以保证程序片段在需要时可以被调用。

在这个例子中,页的大小为4K,页框大小与页相同(这点是必须保证的,内存和外围存储器之间的传输总是以页为单位的),对应64K的虚拟地址和32K的物理存储器,他们分别包含了16个页和8个页框。

我们先根据上图解释一下分页后要用到的几个术语,在上面我们已经接触了页和页框,上图中绿色部分是物理空间,其中每一格表示一个物理页框。

橘黄色部分是虚拟空间,每一格表示一个页,它由两部分组成,分别是FrameIndex(页框索引)和位p(present存在位),FrameIndex的意义很明显,它指出本页是往哪个物理页框进行映射的,位p的意义则是指出本页的映射是否有效,如上图,当某个页并没有被映射时(或称映射无效,FrameIndex部分为X),该位为0,映射有效则该位为1。

我们执行下面这些指令(本例子的指令不针对任何特定机型,都是伪指令)

例1:

MOVEREG,0//将0号地址的值传递进寄存器REG.

虚拟地址0将被送往MMU,MMU看到该虚地址落在页0范围内(页0范围是0到4095),从上图我们看到页0所对应(映射)的页框为2(页框2的地址范围是8192到12287),因

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1