S3C2416 开机运行SD卡程序

 本文主要参考 http://topic.csdn.net/u/20100626/10/67035D81-CF05-41A3-AB0A-A66BF79666D2.htmlhttp://blog.sina.com.cn/s/blog_4b5b79520100kp7c.html两篇文章。

首先需要学习如何将应用程序打包进nk.bin文件中。大概步骤如下

首先,假设你的应用程序为:Embest_Draw.exe。

方法一:主要思想:将应用程序及其快捷方式也添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行。

步骤:

1先保证原工程文件是可以编译成功的。假设编译好的nk.bin文件所在文件夹为xxx_Relase。

2创建快捷方式文件Embest_Draw.lnk,文件内容如下:

27#"\Windows\Embest_Draw.exe"(注意引号)

3在pb中修改project.bib文件,在FILES Section添加:

Embest_Draw.exe    $(_FLATRELEASEDIR)\Embest_Draw.exe NK H

Embest_Draw.lnk    $(_FLATRELEASEDIR)\Embest_Draw.lnk   NK H

(注:$(_FLATRELEASEDIR)表示xxx_Relase文件夹;NK后面的H表明加入到nk.bin中的文件为隐藏属性)

4 把快捷方式添加到StartUp目录下,具体为:

修改工程的project.dat文件,添加如下内容:

Directory("\Windows\Startup"):-File("Embest_Draw.lnk","\Windows\Embest_Draw.lnk")

5从道理上讲,如果这时把Embest_Draw.exe和Embest_Draw.lnk拷贝到xxx_Relase文件夹下,然后Build->MakeImag的话就会把你的应用程序添加到NK里,但实际情况并非如此,经我实验,先要把工程文件全部rebuild一下,我这儿是sysgen了一下,如果你设置了在编译完后MakeImage 的话,会有错误提示你未在你的磁盘上找到Embest_Draw.exe。不用管它。把Embest_Draw.exe和Embest_Draw.lnk文件拷贝到xxx_Relase文件夹下,然后MakeImage一下(记住此时千万不能再rebuild了,否则会前功尽弃),把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序Embest_Draw.exe自启动了

方法二:主要思想:将应用程序添加到映像里,然后用你的应用程序直接替换Wince的桌面程序。

步骤:

1. 像方法一一样把你的应用程序添加到映象里。

    提示:要查看添加映象是否成功,可以在操作系统启动后,看一下windows目录下是否有你的应用程序Embest_Draw.exe(先要设置为可以查看系统文件和隐藏文件)。

2.修改shell.reg(若在pb里找不到,可以到xxx_Relase文件夹下找):不是project.reg,也不是platform.reg,而是工程的保存路径下的xxx_Relase文件夹

[HKEY_LOCAL_MACHINE\init]

"Launch50"="explorer.exe"

"Depend50"=hex:14,00, 1e,00

把这个explorer.exe改成你的应用程序(比如:Embest_Draw.exe),依赖的文件根据自己的应用程序调整。

3. MakeImage一下(还是记住不能再build了),把生成的NK.bin烧写到flash里,这样就可以看到你的应用程序MyApp.exe自启动了.

这样做的好处是启动的时候wince的桌面程序都不会启动了,坏处是当你把应用程序关闭的时候由于原wince桌面程序的丢失而会使机器死机。

方法三:主要思想:将应用程序添加到映像里,然后修改注册表,让应用程序自启动。这回不替换wince的桌面程序,而是让wince像加载桌面一样加载你的应用程序,效果跟方法一是一样的。

在shell.reg文件中[HKEY_LOCAL_MACHINE\init]之下添加如下语句:

"Launch80"="Embest_Draw.exe"

"Depend80"=hex:1E,00

说明:"Depend80"=hex:1E,00用来设置启动顺序和依赖程序,若你的应用程序不依赖于其它程序,这句可以不加

以上方法都可行,但是都存在一个问题,就是应用程序是集成到NK里面的,也就是说每次升级应用程序都要重新编译下载内核,很麻烦,尤其在程序调试阶段,大家都希望把应用程序放在SD卡上,这样更新起来比较容易;据说通过第三种方法可以实现,即修改"Launch80"="MyApp.exe"为"Launch80"="\STDCard\MyApp.exe"( STDCard为SD卡目录),但是我试了一下没有成功,因为Launch80运行时SD卡的文件驱动还没有加载,找不到MyApp.exe文件。同样,采用快捷方式加载SD卡里的应用程序也不可行。

所以采用了另一种方法,自己编了一个小程序,比如叫autoRun.exe,将此程序加入到映像里,通过StartUp快捷方式调用autoRun.exe,autoRun.exe再去调用SD卡里的应用程序,具体实现步骤如下:

在VS2005中编译通过的,选择新建项目,选中Visual C++中的"智能设备(smart device)"中的"Win32 智能设备项目(win32 smart device project)”,然后输入工程名字autoRun和选择保存路径,点击OK,弹出对话框选择next,然后在选择对应的UT2416_SDK,并移除Pocket PC 2003 ,点击next,选择windows application 完成新项目的创建。
将项目中autoRun.cpp中的WinMain函数用下面的函数代替。

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
 PROCESS_INFORMATION processinfo;
 WIN32_FIND_DATA fd;
HANDLE hd=INVALID_HANDLE_VALUE;
  lpCmdLine =_T("\\Storage Card\\ARMV4\\KV_FTP_Server.exe");//根据相应要启动的程序修改此路径
int iCount = 20;//这个值要设得足够大,否则可能等不到SD卡的加载

//等待SD卡文件系统加载完成
while(iCount--)
{
hd=::FindFirstFile(lpCmdLine,&fd);
Sleep(500);
if(INVALID_HANDLE_VALUE!=hd) break;
}
if(0==iCount)
{
 CreateProcess(L"\\Windows\\explorer.exe",NULL,NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,NULL,&processinfo);
 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;
}

保存并编译文件,然后按照上面讲述的方法将autoRun.exe打包进NK文件中,让其开机运行,这样lpCmdLine =_T("\\Storage Card\\ARMV4\\KV_FTP_Server.exe");路径下指定的文件就会被运行了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值