嵌入式操作系统-Windows CE.ppt_第1页
嵌入式操作系统-Windows CE.ppt_第2页
嵌入式操作系统-Windows CE.ppt_第3页
嵌入式操作系统-Windows CE.ppt_第4页
嵌入式操作系统-Windows CE.ppt_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式操作系统 Windows CE,第八章 应用程序设计,独特的Windows CE Windows CE编程基础 Windows CE编程技术,内容概述,1 独特的Windows CE,微处理器多样化 CE不运行现有的程序 CE有严格的内存限制 CE硬件并不十分标准化 文件I/O的差别,1.1 微处理器多样化,其它Windows平台是Intel x86兼容的微处理器 CE设备支持的微处理器包括: ARM(包括Intel 的XScale) SHx MIPS x86,1.2 CE不运行现有的程序,现有Windows程序必须重新编译才能在Wince上运行 有些API被删除,有些被代替,还增加了一

2、些其它的API 字符集的区别,Windows 2000支持Unicode和ANSI, Windows 98只支持ANSI,WinCE使用Unicode 提供了新的针对特定平台的控件,如命令栏(提供的功能类似菜单和工具栏,以减少占用屏幕的空间),而某些标准控件却减少了其功能,1.3 CE有严格的内存限制,Wince只有4G的虚拟内存空间 2GB是为操作系统保留的 应用程序的2GB分成了33个slot(槽) 每个槽32MB 每个槽对应一个进程,1.4 CE硬件并不十分标准化,PC机组成:运算器、控制器、存储器、输入输出设备 各个CE设备的结构各不相同,而且通常没有鼠标、显示器(如果需要显示则大多使

3、用触摸屏),但是Windows CE编程仍然是Windows编程,有相同的消息循环、相同的窗口,大部分相同的资源和控件等,仍然是事件驱动的编程模型,2 Windows CE编程基础,Windows消息处理机制 创建Win32应用程序 Unicode 诊断输出APIs 文件I/O,2.1 Windows 消息处理机制,操作系统发送消息给应用程序,应用程序响应相应的消息,进行消息处理,Windows 消息处理机制代码示例,代码来源:Page101-108 Programming Microsoft Windowss CE.NET 3rd edition, Douglas Boling,Micros

4、oft Press KeyTrac.h #define dim(x) sizeof(x)/sizeof(x0) /定义一个结构体,来表示消息和对应的处理函数 struct decodeUINT UINT Code; /消息 /处理函数 LRESULT (*Fnx)(HWND,UINT,WPARAM,LPARAM); ;, /注册主窗口 int InitApp(HINSTANCE); /创建主窗口 HWND InitInstance(HINSTANCE,LPWSTR,int); /清理工作 int TermInstance(HINSTANCE,int); /窗口过程 LRESULT CALLBA

5、CK MainWndProc(HWND,UINT,WPARAM,LPARAM),/下面几个函数是相应的消息处理函数 LRESULT DoCreateMain(HWND,UINT,WPARAM,LPARAM); LRESULT DoPaintMain(HWND,UINT,WPARAM,LPARAM); LRESULT DoKeysMain(HWND,UINT,WPARAM,LPARAM); LRESULT DoDestroyMain(HWND,UINT,WPARAM,LPARAM);,KeyTrac.cpp #include #include KeyTrac.h #include /应用程序名(

6、使用的是Unicode/ANSI通用形式) const TCHAR szAppName =TEXT(“KeyTrac”); /程序句柄 HINSTANCE hInst; TCHAR szMsgTxt64;,/消息及其处理函数结构体数组 const struct decodeUINT MainMessages = WM_CREATE,DoCreateMain, WM_PAINT,DoPaintMain, WM_KEYUP,DoKeysMain, WM_KEYDOWN,DoKeysMain, WM_SYSKEYUP,DoKeysMain, WM_DESTROY,DoDestroyMain ;,/程

7、序的入口点是WinMain int WINAPI WinMain( HINSTANCE hInstance, /程序的句柄 HINSTANCE hPrevInstance, /为了兼容Win16程序而设置,总为0 LPTSTR lpCmdLine, /指向一个包含命令行文本的Unicode字符串 int nCmdShow) /*确定了该程序主窗口的初始状态 在Windows CE中,这个参数的值只允许有3种状态 正常(SW_SHOW) 隐藏/(SW_HIDE) 可见却不是活动窗口(SW_SHOWNOACTIVATE)*/, MSG msg; /消息 int rc=0; HWND hwndMai

8、n;/主窗口 rc=InitApp(hInstance); /注册主窗口 if(rc) return rc; hwndMain=InitInstance(hInstance,lpCmdLine,nCmdShow); /创建主窗口初始化 if(hwndMain=0) return 0 x10;,int InitApp(HINSTANCE hInstance) WNDCLASS wc; wc.cbClsExtra=0; wc.hInstance=hInstance; /句柄 wc.lpfnWndProc=MainWndProc; /指定窗口过程函数 wc.lpszClassName=szAppNa

9、me; /程序名 if(RegisterClass( , MSG msg; /消息 int rc=0; HWND hwndMain; /主窗口 rc=InitApp(hInstance); /注册主窗口 if(rc) return rc; hwndMain=InitInstance(hInstance,lpCmdLine,nCmdShow); /创建主窗口初始化 if(hwndMain=0) return 0 x10;,HWND InitInstance(HINSTANCE hInstance,LPWSTR lpCmdLine,int nShowCmd) HWND hWnd; hInst=hI

10、nstance; hWnd=CreateWindow(szAppName,TEXT(KeyTrac), WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL, hInstance,NULL);,if(!IsWindow(hWnd) return 0; ShowWindow(hWnd,nShowCmd); /*使窗口的属性 和主程序/指定的相同*/ UpdateWindow(hWnd); /*强制Windows发送WM_PAINT消/息给刚创建的窗口*/ return hWnd; / In

11、itInstance 结束, MSG msg; /消息 int rc=0; HWND hwndMain; /主窗口 rc=InitApp(hInstance); /注册主窗口 if(rc) return rc; hwndMain=InitInstance(hInstance,lpCmdLine,nCmdShow); /创建主窗口并初始化 if(hwndMain=0) return 0 x10;,while(GetMessage( /*清理工作,如释放内存等*/ ,/窗口过程,由操作系统调用 LRESULT CALLBACK MainWndProc(HWND hWnd, UINT wMsg,WP

12、ARAM wParam,LPARAM lParam) int i; for(i=0;idim(MainMessages);i+) /调用对应的消息处理函数 if(MainMessagesi.Code=wMsg) return (*MainMessagesi.Fnx)(hWnd,wMsg,wParam,lParam); return DefWindowProc(hWnd,wMsg,wParam,lParam); /调用系统的默认处理函数 ,int TermInstance(HINSTANCE hInstance,int nDefRC) return nDefRC; /*因为此程序比较简单,不需要

13、做额外的清理工作 ;以下是消息处理函数,省略细节*/ LRESULT DoCreateMain(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam) LRESULT DoPaintMain(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam) LRESULT DoKeysMain(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam) LRESULT DoDestroyMain(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lPa

14、ram) ,Windows消息处理机制 创建Win32应用程序 Unicode 诊断输出APIs 文件I/O,2 Windows CE编程基础,2.2 创建Win32应用程序(eVC),2.2 创建Win32应用程序(eVC),Windows CE应用程序的类型,空项目 已有源代码文件时选择,仅需要将这些文件放到一起进行编译链接构造应用程序 简单 Windows CE 应用程序 选择简单 Windows CE应用程序可得到程序入口点WinMain。用于没有开头的 Windows CE系统, 因为最后的选项(即典型Hello World应用程序)要求有窗口管理器 典型 Hello World应用

15、程序 当平台支持全部窗口和GWES的图形部分时选择典型 Hello World 应用程序,创建Win32应用程序,更改BIB文件 最好在PROJECT.BIB文件中修改 通过Platform Builder修改PROJECT.BIB文件 PROJECT.BIB文件内容 MODULES 通常是可执行程序,默认为XIP(就地执行) 此部分的文件通常是非压缩的 FILES 包含静态数据文件 此部分的文件为压缩的,Windows消息处理机制 创建Win32应用程序 Unicode 诊断输出APIs 文件I/O,2 Windows CE编程基础,2.3 Unicode,Unicode具备的功能 字符和字

16、符串的不同表示 编写Unicode源代码,使用Unicode进行应用程序开发可以满足产品国际化 可以很容易地在不同语言之间进行数据交换 使开发者能够分配支持所有语言的单个二进制.exe文件或DLL文件 提高应用程序的运行效率,Unicode具备的功能,字符和字符串的不同表示,ANSI 字符和字符串 H “Hello World” 存储为char(signed)或者明确指明为unsigned Unicode字符和字符串 LH L“Hello World” 存储为w_char(unsigned short) 双模式 TEXT(H) TEXT(“Hello World”),编写Unicode源代码,

17、C运行时库对Unicode的支持 Windows定义的Unicode数据类型 Windows中的Unicode函数和ANSI函数 Windows字符串函数 为适应Unicode,编写应用程序的一些原则 Unicode和ANSI之间的转换,C运行时库对Unicode的支持,标准的C头文件String.h中定义了一个wchar_t数据类型来表示一个Unicode字符: typedef unsigned short wchar_t; 但是标准的C运行时字符串函数只能对ANSI字符串进行操作。ANSI C补充了一组函数用于对Unicode字符串进行操作。,C运行时库字符串函数比较,C运行时库的转换函数

18、,从Unicode转换 转换成Unicode,编写ANSI/Unicode通用的源代码原则,应该包含Tchar.h文件而非String.h文件。这样如果在源代码中有定义_UNICODE,则调用相对应的Unicode函数,否则调用ANSI函数。 定义字符串时应使用TCHAR数据类型。 在源代码如果定义了_UNICODE,则TCHAR的声明如下:typedef wchar_t TCHAR, 否则TCHAR的声明如下:typedef char TCHAR 应使用_TEXT(“string”)-ANSI/Unicode这种方式,否则一旦用到不同的系统中就可能产生编译错误,Windows定义的Unico

19、de数据类型,WCHAR-Unicode字符 PWSTR-指向Unicode字符串的指针 PCWSTR-指向一个恒定的Unicode字符串的指针 PTCHAR-ANSI/Unicode通用字符串的指针 PCTSTR- ANSI/Unicode通用的一个恒定字符串的指针 对于PTCHAR和 PCTSTR的具体数据类型,要看源代码中是否定义了UNICODE宏(注意不是_UNICODE),Windows中的Unicode函数和ANSI函数,在Windows中很多函数都有两个版本,一个ANSI版本,一个Unicode版本。例如: HWND WINAPI CreateWindowExW(); /Unic

20、ode版本 HWND WINAPI CreateWindowExA(); /ANSI版本 但是代码中只需使用WINAPI CreateWindowEx就可以了,因为Windows的WinUser.h文件中有以下定义: #ifdef UNICODE #define CreateWindowEx CreateWindowExW #else #define CreateWindowEx CreateWindowExA #endif,Windows字符串函数,在程序中尽量使用Windows提供的字符串操作函数来代替使用C运行时字符串函数,这样可以提高应用程序的执行效率,因为这些函数常常因为大型应用程序

21、使用而已经装入了RAM中。这些函数名同时包含了大小写字母。例如:StrCat、StrChr、StrCmp、StrCpy等等。同其它很多Windows函数一样,它们也都有Unicode和ANSI两个版本。 另外,Windows还提供了另一组对Unicode字符串进行操作的函数:lstrcat、 lstrcmp、 lstrcmpi、 lstrcpy、 lstrlen、CharLower、CharUpper等。,为适应Unicode,编写应用程序的一些原则,将文本串视为字符数组,而不是chars数组和字节数组 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串 将显式数据类型(如BYTE

22、和PBYTE)用于字节、字节指针和数据缓存。 将TEXT宏用于原义字符和字符串 执行全局性替换(例如用PTSTR替换PSTR) 修改字符串运算。例如应该使用sizeof(szBuffer)/sizeof(TCHAR)而不应使用sizeof(szBuffer)来获得缓存的大小。,Windows 中Unicode和ANSI之间的转换,多字节字符串转换成Unicode字符串 int MultiByteToWideChar( UINT uCodePage,DWORD dwFlags, PCSTR pMultiByte,/要转换的字符串指针 int cchMultiByte,/*要转换的字符串长度(以字

23、节计算)*/ PWSTR pWideCharStr,/*转换后的Unicode字符串缓存指针*/ int cchWideChar);/*转换后的Unicode字符串缓存的最大值(以字符计算)*/,Windows 中Unicode和ANSI之间的转换,Unicode字符串转换成多字节字符串 WideCharToMultiByte(UINT uCodePage, DWORD dwFlags, PWSTR pWideCharStr,/*需转换的Unicode字符串缓存指针*/ int cchWideChar,/*要转换的字符串长度(以字符数计算)*/ PCSTR pMultiByte,/*转换后的字

24、符串指针*/ int cchMultiByte,/*转换后的字符串缓存区大小(以字节计算)*/ PCSTR pDefaultChar, /*无法转换时使用的默认字符*/ PBOOL pfUsedDefaultChar); /*是否使用默认字符*/,2 Windows CE编程基础,Windows消息处理机制 创建Win32应用程序 Unicode 诊断输出APIs 文件I/O,2.4 诊断输出APIs,MessageBox 显示信息窗口 必须在包含GWES模块的系统中才能使用 例如 NKDbgPrintfW 在调试器中设定格式和显示格式信息 可以在任何地方使用 例如,Windows消息处理机制

25、 创建Win32应用程序 Unicode 诊断输出APIs 文件I/O,2 Windows CE编程基础,2.5 文件I/O,WinCE没有当前目录的概念 所有的文件名都必须以“”开始 文件名需是Unicode 使用GetModuleFileName()函数得到应用程序路径 Memory-Mapped I/O 应用程序读写文件时使用,例如MapViewOfFile() 在Windows CE上使用时,比传统的文件读写操作速度快 需要较少的内存,3 Windows CE编程技术,Native application-使用Embedded Visual C Managed application-

26、使用Visaul Studio .NET,3.1 Managed application VS Native application,开发环境比较,Embedded Visual C+: 直接编译C/C+代码到CPU指令 可使用Win32API存取Windows CE 函数 可以使用MFC(Microsoft Foundation Classes)及ATL(Active Template Library)库函数 Visual Studio.NET: 编译成独立于CPU的中间语言代码 不直接使用Win32API,而使用.NET Compact Framework库来存取操作系统函数,3.2 Na

27、tive应用程序开发,从Platform Builder导出 SDK(Software Development Kit) 使用 eVC进行开发前要安装SDK 使用Platform Builder,导出SDK,关于SDK,SDK包含了一个特定平台的所有函数 导出的SDK是一个Windows安装程序(.msi文件) 在使用eVC进行开发前,必须安装特定平台的SDK,而且进行开发时必须了解特定平台支持的函数,SDK中不包括的函数不能使用 Micorosoft提供了一些SDK,如Standard SDK、Pocket PC2003、SmartPhone2003等等。开发人员可以使用这些SDK进行相应程

28、序开发,但是如果程序中使用的函数在这些SDK中不支持,则程序会失败。 SDK取决于包含在平台中的操作系统配置、运行时库、OAL(OEM Adaption Layer)、和设备驱动程序,关于SDK,只要工作站上有eVC,就可以安装SDK,而不必要安装Platform Builder. 安装完成后,在eVC的开发环境里,可以看到安装的SDK,在这里选择SDK,使用Platform Manager,Platform Manager管理桌面和目标设备的连接 用EVC下载应用程序到目标平台上 使用远程工具连接目标平台 有两个级别的连接 应用程序级 内核级 Platform Manager包含两部分 桌面

29、端部分和SDK有关 设备平台部分由Platform Builder创建,并包含在了WinCE的镜像里,Embedded Visual C+的主要组件,项目工作区文本编辑器 资源编辑器编译器 CE设备模拟器平台管理器 调试器应用程序向导 源码浏览器类向导 诊断工具 在线帮助,编辑窗口,输出窗口,工作区 窗口,菜单栏,工具栏,Embedded Visual C+开发环境界面,3.3 Managed 应用程序开发,Visual Studio. NET介绍 设备和桌面代码兼容,Visual Studio. NET介绍,Visual Studio. NET 智能设备扩展SDE .NET Compact

30、Framework 编程语言,Visual Studio.NET,同写桌面PC Managed应用程序相同 SDE允许直接写应用程序到Windows CE.NET设备或仿真器 SDE为嵌入式设备定制了Visual Studio.NET开发环境 属性浏览器仅列出了.NET Compact Framwork的Windows CE.NET的实现所支持的属性,智能设备扩展,是一个Visual Studio集成包,是Visual Studio.NET的插件 不能单独运行,而需安装Visual Studio.NET 包含了一系列预建的设备模型. 包含了设备开发包,.NET Compact Framewor

31、k,是.NET的运行时支持包 包含了执行引擎、Common Language Runtime和一些类库 高度优化了执行引擎以适应资源局限的设备 相对于桌面.NET Framwork,强调速度和简单性,编程语言,C# 语法类似C 为.NET运行时环境设计 Visual Basic .NET 是Visual Basic语言的革新 增加了新的关键字和语言结构 非常理想地移植已有的Visual Basic程序,Visual Studio. NET介绍 设备和桌面代码兼容,3.3 Managed 应用程序开发,设备和桌面代码兼容,性能调整和执行速度 底层操作系统函数 传统交互 硬件假设 屏幕尺寸,性能调

32、整和执行速度,桌面PC上的.NET执行引擎会使用高速缓存来使执行速度尽可能最快 由于存储空间的限制,嵌入式设备的.NET执行引擎兼顾速度的同时,更多考虑空间的迅速释放,底层操作系统函数,很多.NET Framework类是底层操作系统函数的封装 当某些底层函数在Windows CE. NET中不支持时,在Compact Framework中会删除相应的类或者取其子集,传统交互,为了减少尺寸大小和复杂性,.NET的Windows CE.NET实现减少了大部分与传统交互相关的代码 运行在Windows CE上的应用程序在表格中不能使用ActiveX控件 Internet Explorer和Embe

33、dded Visual Basic 3.0 不能像其桌面等价物一样使用公共.NET类,例如ActiveX控件 Managed应用程序不能调用需要callback函数的API,硬件假设,一些桌面应用程序对硬件做了假设,如果在嵌入式平台上没有这些硬件则这些程序就不能正常运行,屏幕大小,是硬件假设的一个重要方面 使用大屏幕的应用程序不适合小屏幕的嵌入式设备 Windows CE.NET的设备通常有不同的屏幕,.NET Compact Framework概述,WinForms 提供大部分图形用户界面 .NET应用程序使用它来显示窗口、菜单、按钮和其它控件 ADO.NET 提供数据库存取服务 XML and XML Web Services 提供存取XML文档处理类以及通过Internet连接与其它计算设备的应用程序的交互,WinForms,表格,控件,杂类,WinForms的使用,public class HelloWorld public static void Main() Form frm = new Form( ); Label lbl = new Label( ); lbl.Text = Hello world; frm.Controls.Add(lbl); Application.Run(frm); ,ADO .NET,一定拥有一个存取数据库的提供者 管理设备扩展为以下数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论