Lịch sử phát triển của Windows Mobile đã trình bày trong phần trước. Do đó ở đây chỉ đưa ra mô hình phát triển của họ Windows CE để làm nổi bật quan hệ giữa các hệ điều hành họ Windows CE và quan hệ giữa chúng. Mô hình tiến hóa của họ Windows CE được chỉ ra một cách tổng quan trong Hình A.1 [31] sau:
Hình A.1. Lịch sử Windows CE
Lịch sử phát triển của Windows Mobile được chỉ ra trong Hình A.2 [31]:
nhúng cho các thiết bị di động
Đến năm 2007, Windows Mobile 6.0 ra đời dựa trên Windows Mobile 5.0. Các tính năng chính của Windows Mobile phiên bản 5.0, 6.0 và tương lai chỉ ra trong Hình A.3 [31]:
Hình A.3. Tính năng của một số phiên bản Windows Mobile
Từ lịch sử phát triển hệ điều hành họ Windows CE có thể thấy Windows Mobile được phát triển dựa trên Windows CE và hỗ trợ thêm các tính năng mới. Quan hệ giữa hai hệ điều hành này được chỉ rõ trong Hình A.4 [31] sau:
Hình A.4. Quan hệ giữa Windows CE và Windows Mobile
Theo quan hệ của các hệ điều hành họ Windows CE đã trình bày ở trên ta thấy Windows Mobile có mức trừu tượng cao hơn, dễ dàng phát triển ứng dụng hơn nhưng mức độ can thiệp phần cứng của Windows Embedded CE 6.0 lại sâu hơn vì thế Windows Embedded sẽ thích hợp hơn cho các hệ thống nhúng dụng hệ điều hành họ Windows CE. Trong phần sau sẽ trình bày chi tiết về hệ điều hành Windows Embedded CE 6.0.
nhúng cho các thiết bị di động A.2. Windows Embedded CE 6.0
A.2.1. Tính năng của Windows Embedded CE 6.0
Ngoài các tính năng được hỗ trợ bởi Windows CE 5.0, hệ điều hành nhúng Windows Embedded CE 6.0 có các tính năng nổi bật [31] sau:
- Khả chuyển, tương thích và hỗ trợ nền tảng: là hệ điều hành có nhân đa nhiệm ưu tiên, hỗ trợ kiến trúc bộ nhớ ảo và xử lý đa luồng.
- Quản lý tiến trình theo chế độ người dùng (user mode) và chế độ nhân (kernel mode).
- Độc lập kiến trúc phần cứng.
- Hỗ trợ nhiều vi xử lý: ARM, MIPS, SH4, x86. - Có thể chọn nhiều thiết bị lưu trữ.
- Là hệ điều hành thời gian thực cho các thiết bị vừa.
A.2.2. Kiến trúc Windows Embedded CE 6.0
Đăc điểm của Windows Embedded CE 6.0 so với Windows CE 5.0 là kiến trúc dựa trên bộ nhớ ảo. Nghĩa là không gian địa chỉ logic của tiến trình tách biệt với không gian địa chỉ vật lý nhờ đó mà không gian nhớ dùng cho nhân được bảo vệ tốt hơn. Với vi xử lý 32 bits, không gian bộ nhớ ảo là 232 (4GB) trong đó sử dụng 2GB cho không gian địa chỉ nhân và 2GB cho không gian địa chỉ tiến trình người dùng. Kiến trúc mô hình bộ nhớ ảo như Hình A.5 [31] sau:
Hình A.5. Mô hình bộ nhớ ảo trong Windows Embedded CE 6.0
nhúng cho các thiết bị di động
Việc ánh xạ không gian địa chỉ logic vào không gian địa chỉ vật lý thực hiện như Hình A.6:
Hình A.6. Không gian địa chỉ logic và không gian địa chỉ vật lý
Dựa trên mô hình bộ nhớ ảo, Windows Embedded CE 6.0 được xây dựng với kiến trúc như trong Hình A.7:
nhúng cho các thiết bị di động
A.2.3. Lập trình ứng dụng trên Windows Embedded CE 6.0
Với kiến trúc đã đề cập trong phần trước, việc xây dựng ứng dụng trên Windows Embedded CE 6.0 cũng như trên Windows CE tuân theo mô hình trong Hình A.8 [31]:
Hình A.8. Mô hình lời gọi hệ thống trong Windows Embedded CE 6.0 Môi trường lập trình ứng dụng trên Windows Embedded CE 6.0 hỗ trợ các ngôn ngữ C/C++, C#, VB.net. Với kiến trúc đã đề cập trước, việc thay đổi nhân không ảnh hưởng đến các ứng dụng mức trên vì tiến trình người dùng làm việc với nhân thông qua các giao diện chính là các lời gọi hệ thống. Đồng thời nhân Windows Embedded CE 6.0 có tính mô-đun cao, làm việc với nhiều trình điều khiển thiết bị và có khả năng làm việc với các trình điều khiển mới thông qua các giao diện cổng và tuân theo chuẩn của các dịch vụ hệ thống. Do vậy một tính năng chắc chắn sẽ làm cho Windows Embedded CE 6.0 trở lên phổ biến chính là khả năng biên dịch lại và đóng gói ứng dụng tùy biến theo thiết bị. Ý tưởng này cũng giống như việc biên dịch nhân trong Linux hoặc Linux nhúng (Embedded Linux – là nhân Linux được dịch cho một thiết bị nhúng). Thuật ngữ OS Design có ý nghĩa tổng quan nói lên việc biên dịch Windows Embedded CE 6.0 cho một thiết bị cụ thể dựa trên các gói công cụ đưa thêm vào IDE Visual Studio.NET 2005 hoặc mới hơn.
Việc xây dựng ứng dụng trên Visual Studio.NET 2005 có cài thêm các công cụ hỗ trợ Windows Embedded CE 6.0 được thực hiện tương đối trực quan như đã đề cập trong phần môi trường .NET Compact Framework cho Windows Mobile. Dưới đây là ví dụ về mã nguồn đọc/ghi file cho ứng dụng dòng lệnh trên Windows Embedded CE 6.0:
// FileIO.cpp : Defines the entry point for the console application. // FileIO demo program
// Shows how to create, write, and read a file using CE file APIs // Remember CE uses 16-bit Unicode for character strings!
nhúng cho các thiết bị di động // _T("....") generates a Unicode string
// TCHAR is a Unicode string type #include "stdafx.h"
int _tmain(int argc, TCHAR *argv[], TCHAR *envp[]){ HANDLE hFile;
DWORD cBytes;
char cBuffer[] = "Hello File World\n"; printf("\nCreating CE_Demo.txt file\n"); // Open File for Write
hFile = CreateFile(_T("\\Temp\\CE_Demo.TXT"), GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Check for file open errors
if (hFile == INVALID_HANDLE_VALUE){ printf("file write open errors\n"); Sleep(1000);
return 0; }
if (!WriteFile(hFile, cBuffer, strlen(cBuffer), &cBytes, NULL)){ printf("file write errors\n");
Sleep(1000); return 0; }
// Close File
CloseHandle(hFile); // Open File again for read
hFile = CreateFile(TEXT("\\Temp\\CE_Demo.TXT "), GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Check for file open errors
if (hFile == INVALID_HANDLE_VALUE){ printf("file read open errors\n"); Sleep(1000);
return 0; }
// Read back data just written to new file
if (!ReadFile(hFile, cBuffer, 79, &cBytes, NULL)){ printf("file read errors\n");
Sleep(1000); return 0; }
// Display Data read back and delay 4 seconds before exiting printf("%s\n",cBuffer,cBytes);
printf("the file data was written and read back OK\n"); Sleep(4000); // Close File CloseHandle(hFile); return 1; }
nhúng cho các thiết bị di động
PHỤ LỤC B. Mã nguồn các lớp gói Mobile
B.1. Lớp giao diện gói Mobile: frmMainApp using System; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.IO; using MobileDevNOMRegconition1._0.AppClasses; namespace MobileDevNOMRegconition1._ {
public partial class Form1 : Form {
#region Cac thuoc tinh /// <summary>
/// Anh chua cac ky tu can nhan dang /// </summary>
public static Bitmap InputImage; public Form1()
{
InitializeComponent(); }
/// <summary>
/// Ham nap mang ngu nghia /// </summary>
/// <param name="sender"></param> /// <param name="e"></param>
private void btnSemanticFile_Click(object sender, EventArgs e) {
openImgFile.ShowDialog();
StreamReader objSR = new StreamReader(openImgFile.FileName); LookupSemantic objL = new LookupSemantic();
objL.LoadDictionary(objSR); objSR.Close();
nhúng cho các thiết bị di động /// <summary>
/// Ham nap mang trong so /// </summary>
/// <param name="sender"></param> /// <param name="e"></param>
private void btnSaveFile_Click(object sender, EventArgs e) {
openImgFile.ShowDialog();
StreamReader objSR = new StreamReader(openImgFile.FileName); RecognitionProcess objReg = new RecognitionProcess();
objReg.LoadNetwork(objSR); objSR.Close(); } /// <summary> /// Nap anh ky tu /// </summary> /// <param name="sender"></param> /// <param name="e"></param>
private void btnLoadImg_Click(object sender, EventArgs e) {
LoadImage(); }
/// <summary>
/// Ham su kien tren nut nhan dang btnReg /// </summary>
/// <param name="sender"></param> /// <param name="e"></param>
private void btnReg_Click(object sender, EventArgs e) {
//1. Goi ham xu ly dau vao
MobileInputProcess objMIProcess = new MobileInputProcess(); objMIProcess.CreateSetMatrixPixelOfCharacter(); //2. Goi cac ham nhan dang
RecognitionProcess objReg = new RecognitionProcess(); objReg.CreateOutputForAllInput();
//3. Goi cac ham tra nghia tu
nhúng cho các thiết bị di động objLook.LookupMeanning();
//4. Hien thi xau ket qua: String strResult = "Ket qua: ";
for (int i = 0; i < MobileInputResult.NumOfCharacters; i++) {
strResult += Convert.ToString(SemanticMap.arResultMeanning[i]) + " "; }
txtResult.Text = strResult; }
#region Cac Ham Xu Ly tren form giao dien /// <summary>
/// Ham nap anh ky tu: /// </summary>
public void LoadImage() {
openImgFile.Filter = "Bitmap Image (*.bmp)|*.bmp"; if (openImgFile.ShowDialog() == DialogResult.OK) {
InputImage = new Bitmap(openImgFile.FileName); imgRegChars.Image = InputImage;
//Co kich thuoc bang khung anh
imgRegChars.SizeMode = PictureBoxSizeMode.StretchImage; }
else {
MessageBox.Show("Chua chon anh"); }
}
nhúng cho các thiết bị di động B.2. Lớp lưu kết quả đầu vào đã xử lý: MobileInputResult
/// <summary>
/// Lop luu du lieu vao:
/// - chua tap cac ma tran diem anh cua so ky tu /// - chua so ky tu phan tich duoc
/// </summary>
class MobileInputResult {
/// <summary>
/// So ky tu thuc te chua trong anh vao /// </summary>
public static int NumOfCharacters = 0; /// <summary>
/// So ky tu toi da trong mot anh vao /// </summary>
public static int MaxOfCharacterNum = 100; /// <summary>
/// Do rong chuan cua anh mot ky tu /// </summary>
public static int NumOfWidthPixels = 16; /// <summary>
/// Chieu cao chuan cua anh mot ky tu /// </summary>
public static int NumOfHeightPixels = 16; /// <summary>
/// Mang cac matran diem anh cua tung ky tu vao /// </summary>
public static int [, ,] arPixelMatrixInputSet = new int [MaxOfCharacterNum, NumOfWidthPixels, NumOfWidthPixels] ;
/// <summary>
/// Tap cac mau vao: So nut vao , So phan tu toi da trong tap /// </summary>
public static float[,] input_set = new float[NetworkConfig.NumOfInputNodes, MaxOfCharacterNum];
nhúng cho các thiết bị di động B.3. Lớp xử lý đầu vào: MobileInputProcess
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using MobileDevNOMRegconition1._; using MobileDevNOMRegconition1._0.Utils; namespace MobileDevNOMRegconition1._0.AppClasses { /// <summary>
/// Lop chua cac phuong thuc xu ly dau vao /// - Tu mot anh vao, chua cac mau can nhan dang
/// - Output: mang cac ma tran diem anh cua tung mau (3 chieu)
/// + output duoc chua trong mang inputSet cua lop MobileInputResult /// </summary>
class MobileInputProcess {
#region Attribute /// <summary>
/// So ky tu trong anh vao /// </summary>
public static int NumOfInputSets = 0; /// <summary>
/// Toa do X bat dau tren anh. Su dung trong qua trinh phan tich /// </summary>
int ImageStartPixelX = 0; /// <summary>
/// Toa do Y bat dau tren anh. Su dung trong qua trinh phan tich /// </summary>
int ImageStartPixelY = 0; /// <summary>
/// Mang chua cac pixel cua anh ky tu. De tao dau vao cho mang /// </summary>
Color[,] ann_input_pixel = new Color[MobileInputResult.NumOfWidthPixels, MobileInputResult.NumOfHeightPixels];
/// <summary>
/// Mang chua gia tri nhi phan da duoc chuyen tu pixel /// </summary>
int[,] ann_input_value = new int[MobileInputResult.NumOfWidthPixels, MobileInputResult.NumOfHeightPixels];
/// <summary>
/// Mang mau anh diem cua anh ky tu goc /// </summary>
Color[,] character_image_pixel = new Color[200, 200]; /// <summary>
/// Mang toa do TOP cua dong ky tu /// </summary>
int[] line_top = new int[30000]; /// <summary>
/// Mang toa do BOTTOM cua dong ky tu /// </summary>
nhúng cho các thiết bị di động int[] line_bottom = new int[30000];
/// <summary>
/// Chi so dong hien tai /// </summary> int current_line = 0; /// <summary> /// Tong so dong ky tu /// </summary> int number_of_lines = 0; /// <summary>
/// Cho biet co dong ky tu hien tai khong /// </summary>
bool line_present = true; /// <summary>
/// Chieu cao cua anh chua cac ky tu /// </summary>
int input_image_height; /// <summary>
/// Chieu rong cua anh chua cac ky tu /// </summary>
int input_image_width; /// <summary>
/// Cac khai bao bien chu: top, botton, left, right /// </summary>
int top, bottom, left, right; /// <summary>
/// Mep phai cua ky tu dung truoc /// </summary> int prev_right = 20; /// <summary> /// Chieu cao ky tu /// </summary> int character_height; /// <summary> /// Chieu rong ky tu /// </summary> int character_width; /// <summary>
/// Bien nho, kiem tra con ky tu hien tai khong /// </summary>
bool character_present = true; /// <summary>
/// Anh mot ky tu /// </summary>
private Bitmap CharacterImage; #endregion
/// <summary> /// Ham xac dinh:
nhúng cho các thiết bị di động /// - So dong: num_of_lines
/// - Toa do cac dong: luu vao mang line_top, line_bottom /// </summary>
public void IdentifyLines() { int y = ImageStartPixelY; int x = ImageStartPixelX; bool no_black_pixel; int line_number = 0; line_present = true;
//Xac dinh so dong va toa do top, bottom cua dong while (line_present) { x = ImageStartPixelX; while (GraphicProcess.CompareColorWithWhite(Form1.InputImage.GetPixel(x, y))==0) { x++; if (x == input_image_width) { x = ImageStartPixelX; y++; } if (y >= input_image_height) { line_present = false; break; } }
//xac dinh cac top va bottom cua dong hien tai if (line_present)
{
//Toa do tren cua dong line_top[line_number] = y;
//Tim toa do duoi cua dong: lap cho den khi co 1 dong diem anh trang toan bo no_black_pixel = false;
while (no_black_pixel == false) {
y++;
no_black_pixel = true;
for (x = ImageStartPixelX; x < input_image_width; x++) { if(GraphicProcess.CompareColorWithWhite(Form1.InputImage.GetPixel(x , y))==1) { no_black_pixel = false; break; } } }
//Toa do duoi cua dong
line_bottom[line_number] = y - 1; line_number++;
nhúng cho các thiết bị di động } } number_of_lines = line_number; } /// <summary> /// Tao anh ky tu:
/// - Tu anh ky tu khac voi kich thuoc chuan /// - Dua ve kich thuoc chuan
/// </summary>
public void CreateCharacterImage() {
CharacterImage = new System.Drawing.Bitmap(character_width, character_height);
for (int j = 0; j < character_height; j++) {
for (int i = 0; i < character_width; i++) { CharacterImage.SetPixel(i, j, character_image_pixel[i, j]); } } } /// <summary>
/// Ham anh xa ma tran kich thuoc anh chuan thanh vector bit dau vao /// </summary>
public void MapAnnInputMatrix() {
//Tao anh bitmap voi anh goc va kich thuoc moi Bitmap objCharacterPic = new
System.Drawing.Bitmap(MobileInputResult.NumOfWidthPixels, MobileInputResult.NumOfHeightPixels);
//anh goc
Bitmap objBmpOrigin = new Bitmap(CharacterImage);
//doi tuong graphic de phong to
Graphics objG = Graphics.FromImage(objCharacterPic);
//phong to anh ky tu goc, fill vao anh voi kich thuoc chuan 32x32 objG.DrawImage(objBmpOrigin, new Rectangle(0, 0,
MobileInputResult.NumOfWidthPixels, MobileInputResult.NumOfHeightPixels), new Rectangle(0, 0, objBmpOrigin.Width, objBmpOrigin.Height),
GraphicsUnit.Pixel);
//Tao ma tran diem anh cho moi anh ky tu
for (int j = 0; j < MobileInputResult.NumOfHeightPixels; j++) {
for (int i = 0; i < MobileInputResult.NumOfWidthPixels; i++) { ann_input_value[i, j] = GraphicProcess.CompareColorWithWhite(objCharacterPic.GetPixel(i, j)); } } } } }
nhúng cho các thiết bị di động B.4. Lớp cấu hình mạng: NetworkConfig using System; using System.Collections.Generic; using System.Text; namespace MobileDevNOMRegconition1._0.AppClasses { /// <summary>
/// Lop chua thong tin cau hinh mang /// </summary> class NetworkConfig { /// <summary> /// So tang mang /// </summary>
public static int NumOfLayer = 3;
/// <summary>
/// So node tren tang vao /// </summary>
public static int NumOfInputNodes = 256;
/// <summary>
/// So node tren tang an /// </summary>
public static int NumOfHidenNodes = 256;
/// <summary> /// So node tang ra /// </summary>
public static int NumOfOutNodes = 16;
/// <summary>
/// Mang luu tru so noron tren moi tang /// </summary>
nhúng cho các thiết bị di động