// 日期:2008-5-29
end;
Function String_RePlace(Str,StrTobeRep,StrRep);
// False:字符串不以指定的字符串结尾
begin
// 注意事项:
// False:不包含指定的字符串
A5:MMU是用在多任务操作系统中,给每个任务提供独立的虚拟地址空间,其实现原理是:在主存中存贮页表等数据,通过MMU映射到CPU,然后CPU就可以使用虚拟地址调度任务,访问外设等,虚拟地址和物理地址映射是固定的,这样操作系统比较安全稳定,其转换地址的依据是根绝g_oalAddressTable这个数组来确认。其工作是在startup初始化完成时钟,并建立完成指针堆栈的时候将MMU打开;
// 日期:2008-5-29
Function String_Split(Str,Separator);
Result := StringArray;
1:是否替换所有。如果没有使用该值,则仅替换找到的第一个。
// 输入参数:
// 作者:陈能技
另外,也可以使用DelphiScript提供的Pos函数来判断是否出现指定的字符串,如果包含,则返回第一个出现的位置;如果不包含,则返回False值,如下代码所示:
Var StringArray,I : OleVariant;
StringArray := CreateVariantArray(0,0);
//.............................................................................
begin
(6)匹配结尾字符串
项目回顾>>>
//.............................................................................
begin
begin
Result := Index;
begin
// True:字符串以指定的字符串开头
//.............................................................................
//.............................................................................
Procedure Test_String_RePlace;
// 目的:判断字符串是否以指定的字符串开头
Procedure Test_String_SubString_2;
begin
// 日期:2008-5-29
Str := String_RePlace('D:/Code/FileSelctionDialog/FileSelctionDialog/bin/Debug','D:','桌面我的电脑本地磁盘 (D:)');
Function String_EndsWith(Str,SubStr);
// SubStr:被查找的字符串
查找字符串可以使用.NET的String对象的Contains函数,传奇sf网,用于确定是否包含指定的字符串:
// 目的:分割字符串
Var Str : OleVariant;
Log.Message(Utilities.StringReplace(Str,土城花屏补丁,'/','',1));
// 目的:读取字符串中的一部分
Log.Message(Copy(Str,-2,3));
end;
//.............................................................................
// EndIndex:结束读取的Index位置
// 日期:2008-5-29
Q1:bootloader是什么?
Procedure Test_String_RePlace_2;
// 作者:陈能技
Log.Message(String_SubString('1234567890',0,2));
Result := Str.Contains(SubStr);
// 返回结果:替换后的字符串
关于Bootloader,说过很多次了,我们就直接进入主题,在这段时间的面试中,bootloader做为问题的次数出现过两次,一般考官会先问一下你对wince的整体结构有什么认识,个人感觉这个问的有些太大了,特别是面试的时候来问,但是考官们会很喜欢问这个问题,所以不管个人感觉如何,能说多少是多少,具体的大家可以参考《Windows®Embedded CE 6.0 Fundamentals》中76页的图3-1来说,这里我做个简单的描述,具体如下:
// 日期:2008-5-29
end;
// 目的:查找字符串是否包含指定的字符串
做为一个完整的wince嵌入式设备系统,当然,有一套完整的硬件做为支撑,硬件包括CPU,RAM,ROM以及一系列的I/O Device.在此基础上,我们就可以构建我们的软件平台,最初一层的是kernel,也就是内核层,这一层的开发也就是针对嵌入式软件工程师 wince os方向开发的一个主要目标层,在这一个层次的开发中,我们会遇到一个bootloader的开发,这个功能部分主要起到引导系统工作的作用,通常在上电或者复位后马上进行,后面我们详细说一下,完成了bootloader,系统的镜像将会被加载,也就是内核层开始,内核层主要的接口有两个,一个是OAL,也就是OEM适配层,另外一个是Device Driver层,OAL层的硬件层对象是CPU,RAM和ROM,然后牵涉到一些基本通讯调试的I/O,例如串口,99听战歌网,Device Driver层主要面向的是触摸,SD卡接口,串口,音视频输入输出以及LAN等设备,在Kernel层中我们还需要处理到一些内核中设备的管理,文件系统的管理,GWES图形环境的处理,网络等(这里能说多少说多少,不能确定的不要说了。说不出来就等等过去),这一部分就基本上处理到整个系统内核成功建立,完成了这个部分就进入用户处理层,也就是USER PROCESSES这个层次上,这个层次主要是针对应用程序开发,也就是关于WINCE APP开发工程师需要进一步了解的东西,这里我们也需要对其进行了解,这个地方主要牵涉到一个wince api的接口,同时有系统界面的处理,进程线程服务控制处理,设备使用,在此基础上的一系列的应用开发。
// 返回结果:
Procedure Test_String_Contains_2;
A4:1.对cpu进行简单的初始化,类似于BIOS的功能;2.将自身bootloader加载到RAM中;
IF Index > 0 then
//.............................................................................
前序:
这里使用的是.NET类库中的StringBuilder对象的SubString函数,另外,也可以使用使用DelphiScript的Copy函数来读取字符串中的一部分:
Q2:一般来说,bootloader运行的第一句话是什么?整个bootloader过程中做了哪些事情?
end;
Var StringArray,Count ,I: OleVariant;
Procedure Test_String_StartsWith;
begin
VarArrayRedim(StringArray,Count);
// StrTobeRep:需要被替换掉的字符串
Count := BuiltIn.GetListCount(Str, Separator);
Procedure Test_String_Split;
完美国际私服:
以下的文章对这类的考察智力的题目不在做过多说明,只希望大家不要像我工作的技术知识基础不牢固,连智商都工作的低了很多,这样就很亏,下面只对关于wince os方向嵌入式工程师开发面试做一些个总结,今天做一个大概的分析和关于bootloader方面的总结,在接下来的两天再对OAL和驱动两块进行一个分析。临近春节,祝大家新年快乐,希望通过这个文章能给和我一样正在找工作的和在年后准备找工作的朋友一点帮助。
end;
Log.Message(Copy(Str,2,0));
Str := dotNET.System_Text.StringBuilder.zctor(Str).ToString;
(2)分割字符串
Q6:bootloader的大小如何确定?
Log.Message(String_Contains('01234567890','456'));
Procedure Test_String_EndsWith;
《软件自动化测试成功之道》节选11 - 常用脚本函数的封装
// Str:待查找的字符串
end;
2.《Windos CE 实用开发技术》by:张冬泉 等
// 日期:2008-5-29
Str := dotNET.System_Text.StringBuilder.zctor(Str);
//.............................................................................
Function String_Contains_2(Str,SubStr);
(1) 替换字符串
Q3:刚才你征途sf了要在bootloader中的startup关闭中断,这是为什么呢?
这里使用的是.NET类库中的StringBuilder对象,另外,也可以使用Utilities对象中的StringReplace来替换字符串:
A6:一般可以参考在对应boot代码路径下的boot.bib文件中有定义其大小;
end;
end;
2:是否大小写敏感。使用该值表示大小写不敏感地匹配,不使用该值则表示大小写敏感。
Log.Message(Copy(Str,2, 20));
//.............................................................................
正文:
//.............................................................................
Q4:startup的作用是什么?
1.《Windows CE 工程事件完全解析》 by:李大为
Str := dotNET.System_Text.StringBuilder.zctor(Str).ToString;
A7:bin为记录式镜像,nb0为原始镜像,前者是单位组织的镜像数据,后者是二进制数据的镜像快照,说通俗写bin是压缩后的nb0,使用nb0还是bin主要是根绝DownloadeImage函数中进行区分,一般来说,在此函数中会将image的起始7个字节与特征值进行比较,特征值有6个,分别代表bin,nb0,带数字签名的bin,带数字签名的nb0,MULTXIP,MANIFEST。一般采取如下方式进行区分
// False:字符串不以指定的字符串开头
// 作者:陈能技
if (!memcmp (hdr, "N000FF/x0A", BL_HDRSIG_SIZE)) 其中N000FF/x0A是特征值,hdr是获取到的头7个字节;
Str:='1234567890';
// True:字符串以指定的字符串结尾
Procedure Test_String_SubString;
For I:=0 to Count - 1 do
《软件自动化测试成功之道》节选11 - 常用脚本函数的封装
// 注意事项:
3.《Windows®Embedded CE 6.0 Fundamentals》
// StartIndex:开始读取的Index位置
SubStr := dotNET.System_Text.StringBuilder.zctor(SubStr).ToString;
end;
4. HJB的WinCE blog
// Str:待查找的字符串
Log.Message(String_RePlace(Str,'/',''));
做答完毕上面一个问题,我们来详细的看看bootloader,这个bootloader我们反复说过多次,可能是我个人实在太愚笨在加上考场上比较紧张,考官的口音有点跟不上(我承认是我魔兽世界sf话的却呒没学好,实在是听有些听唔懂,有机会得恶补魔兽世界sf话?),前段时间还写文章分析过,说起来还是丢三落四的,很无语,下面再来过一边,结合考过的例子,反复说多说几遍就熟悉了。呵呵,以下问题均基于wince来说。
A2:第一句话是startup()函数的运行,在startup中,主要做了如下工作:清空TLB和cache,关闭中断,配置PLL,配置内存控制器等;
// 输入参数:
begin
// 作者:陈能技
// SubStr:结尾的字符串
Q7:bootloader为什么有的是nb0,有的是bin文件?有什么区别,如何确定使用的是nb0还是bin文件?
// 使用DelphiScript的Copy函数来读取字符串中的一部分
Log.Message(String_EndsWith('01234567890','1230'));
begin
Q5:说说MMU是什么,大概描述下其工作的原理?MMU在什么时候开始工作?
// 作者:陈能技
// 目的:判断字符串是否以指定的字符串结尾
Result := Str.StartsWith(SubStr);
Procedure Test_String_Contains;
以下给出6个特征值做为本次总结的结束
end;
(5)匹配开头字符串
// 作者:陈能技
StringArray := String_Split('D:/Code/FileSelctionDialog/FileSelctionDialog/bin/Debug','/');
Result := Str;
Log.Message(StringArray[I]);
Result := False;
end;
begin
// Str:待替换的字符串
begin
// 作者:陈能技
var Str : OleVariant;
Index := Pos(SubStr,Str);
end;
2008-5-29
// 目的:查找字符串是否包含指定的字符串
Str := dotNET.System_Text.StringBuilder.zctor(Str).ToString;
//.............................................................................
end;
Result := Str.EndsWith(SubStr);
// Str:待读取的字符串
其中StringReplace的第三个参数是一个标志位,可以使用以下两个值:
// 输入参数:
Str := Utilities.StringReplace('D:/Code/FileSelctionDialog/FileSelctionDialog/bin/Debug','D:','桌面我的电脑本地磁盘 (D:)',1);
N000FF/x0A=BL_IMAGE_TYPE_MANIFEST
X000FF/x0A=BL_IMAGE_TYPE_MULTXIP
B000FF/x0A=BL_IMAGE_TYPE_BIN
S000FF/x0A=BL_IMAGE_TYPE_SIGNED_BIN
R000FF/x0A=BL_IMAGE_TYPE_SIGNED_NB0
None=BL_IMAGE_TYPE_UNKNOWN
begin
//.............................................................................
//.............................................................................
// 注意事项:
A1:bootloader是在wince内核程序启动前的一小段引导程序,用来引导系统内核的启动,bootloader的种类还是比较多的,有nboot eboot uboot等等,但目的都是用来引导系统从上电或者复位进入正常工作状态的一段小程序,一般建议存放在flash中;
//.............................................................................
Function String_StartsWith(Str,SubStr);
// Str:待查找的字符串
begin
A3:这个是wince系统设备的一个约定,关闭中断是把整个ARM设备开发简易化,所有的外设中断请求(IRQ)全部关闭,ARM就变成了一个相对不太复杂的单片机,开发起来难度会比原先降低很多,中断打开反倒会使得整个系统的开发复杂度上升;
end;
// 返回结果:
// Str:待替换的字符串
Log.Message(String_Contains_2('01234567890','456'));
Result := Str;
// SubStr:被查找的字符串
// 输入参数:
// 返回结果:分割后的字符串保存在数组并返回
Var Index :OleVariant;
// 注意事项:
// Separator:分割符
(3)读取部分字符串
今天发现很多地方需要使用到字符串的操作,而DelphiScipt的字符串操作函数不大好用,因此有必要把常用的一些字符串操作封装成函数,已备调用。
// 返回结果:读取到的部分字符串
// StrRep:替换的字符串
// SubStr:开头的字符串
// True:包含指定的字符串
// 输入参数:
// 输入参数:
// Str:待查找的字符串
end;
// 返回结果:
end;
For I := 0 to VarArrayHighBound(StringArray,1)-1 do
begin
begin
// 目的:替换字符串
Str := dotNET.System_Text.StringBuilder.zctor(Str).ToString;
// 返回结果:
Str := Str.RePlace_2(StrTobeRep,StrRep).ToString;
StringArray[I] := BuiltIn.GetListItem(Str , I , Separator);
Str := Str.SubString(StartIndex,EndIndex).ToString;
begin