1、在VS2005下建立一个Win32智能设备项目,取名为ShellExe,编译如下代码:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
WIN32_FIND_DATA fd;
HANDLE hd=INVALID_HANDLE_VALUE;
int iCount = 20;
while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
if(0==iCount) return 0;
FindClose(hd);
SHELLEXECUTEINFO ShExeInfo={0};
ShExeInfo.cbSize=sizeof(SHELLEXECUTEINFO);
ShExeInfo.fMask=SEE_MASK_NOCLOSEPROCESS;
ShExeInfo.hwnd=NULL;
ShExeInfo.lpVerb=NULL;
ShExeInfo.lpFile=lpCmdLine;
ShExeInfo.lpParameters=L"";
ShExeInfo.lpDirectory=NULL;
ShExeInfo.nShow=SW_SHOW;
ShExeInfo.hInstApp=NULL;
ShellExecuteEx(&ShExeInfo);
return 0;
}
生成ShellExe.exe的可执行文件,此段代码主要功能是查找指定的应用程序,然后执行;下面这段代码可以保证在SD卡文件系统正确加载后才去执行应用程序。
while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
文件的名称和路径由命令行参数指定:ShExeInfo.lpFile=lpCmdLine。
2、 新建一个快捷方式
新建一个文本文档,内容为:42#/Windows/ShellExe.exe /NandFlash/MyApp.exe,保存后,更改文件名为Autorun.lnk。其中/NandFlash/MyApp.exe应用程序的绝对路径。
3、将快捷方式Autorun.lnk添加到自启动目录
在AT91SAM9263EK_ARMV4I_Release下的 project.dat里加入如下内容:
Directory("/Windows/启动"):-File("Autorun.lnk","/Windows/Autorun.lnk")
4、选择Make Run-time Image生成映像XIP.nb0,然后将前两步得到的ShellExe.exe和Autorun.lnk拷贝到C:/WINCE600/OSDESIGNS/sam9263/sam9263/RelDir/AT91SAM9263EK_ARMV4I_Release目录下。
5、将MyApp.exe和Autorun.lnk添加到NK里,方法是在ce..bib文件的Files模块下加入如下内容:
ShellExe.exe C:/WINCE600/OSDESIGNS/sam9263/sam9263/RelDir/AT91SAM9263EK_ARMV4I_Release/ShellExe.exe NK S
Autorun.lnk C:/WINCE600/OSDESIGNS/sam9263/sam9263/RelDir/AT91SAM9263EK_ARMV4I_Release/Autorun.lnk NK S
注意:ShellExe.exe的属性S表示系统文件。
6、生成XIPKERNEL.nb0文件
修改ce.bib文件,在MEMORY处,把RAM的配置改成RAM 8039e000 03862000 RAM。
在vs2005下执行“生成”--》“Open Release Directory in Build Window”,在命令提示符下执行romimage ce.bib,可生成XIPKERNEL.bin。
在提示符下执行viewbin -r XIPKERNEL.bin,可显示该XIPKERNEL.bin文件的起始位置和长度。
在提示符下执行cvrtbin -a 0x起始位置 -l 0x长度 -w 32 -r XIPKERNEL.BIN,此步骤执行后生成XIPKERNEL.nb0。
烧写xip.nb0和xipkernel.nb0到板子,然后把应用程序放到NandFlash目录下,改名为MyApp.exe,然后重启就可看到应用程序自动运行了。
7、总结
这种方法用起来比较方便,ShellExe.exe不用每次都重新编译,只要根据应用程序路径修改Autorun.lnk即可,可以加载Flash、U盘、SD卡里的应用程序。调试及升级应用程序就不用重新烧写内核了。