BIOS之——增加wince自动启动功能

BIOS原理是这样的,打印一些串口信息,并且从PC发送一些命令过来执行一些动作。

BIOS的关键代码如下

 

  1. Uart_Printf("/r/nPlease select function : /r/n");
  2.         //菜单打印              
  3.         for(i=0; CmdTip[i].fun!=0; i++)
  4.             printf("%d : %s/n", i, CmdTip[i].tip);
  5.         Uart_Printf("/n");                          
  6.         Uart_Printf("==============================================");
  7.         Uart_Printf("/n");
  8.         
  9.         //-----------changed for autorun wince by wogo at 08-11-08
  10.         //if(autorun_trig)
  11.         //  NandLoadRun();  //run it in svc mode
  12.         //等待按键
  13.         idx = Uart_Getch();//如果没有发送数据过来会造成无限等待
  14.         //if(autorun_trig)
  15.             //NandLoadRun();    //run it in svc mode
  16.         //Uart_Printf("============Test run where?====================");
  17.         if(idx!=0)
  18.         {
  19.             autorun_ds =1;//如果有按键按下,就禁止wince自动运行。
  20.             idx -= '0'//ASCII码转换为数字
  21.             if(idx<i) 
  22.             {
  23.                 //执行操作
  24.                 (*CmdTip[idx].fun)();
  25.             }       
  26.         }
  27.         autorun_ds = 1;//---------这个貌似很关键---

 

这里最要注意的是串口了,串口放在死循环里面,如果没有发送数据过来。就会造成无限等待。这是我后来最难解决的地方了。

刚开始我把启动wince函数放在定时器中断函数里面,相当郁闷,当拷贝完NK以后,就不动了。后来分析原来拷贝完刚好跳出定时器中断,返回中断入口——即是串口等待处,而此时内存的东西已经改变,即是输入东西,串口也没有反映,这样就造成程序死了,——机器也死了。

后来我把串口函数改成如下——在串口等待处做文章,终于可以启动起来了。

 

 

  1. //=====================================================================
  2. char Uart_Getch(void)
  3. {   
  4.     Uart_Printf("RunFlag=%d/n", RunFlag);
  5.     //----下个if不起作用 
  6.     if(RunFlag)
  7.     {
  8.         Uart_Printf("RunFlag=%d/n", RunFlag);
  9.         NandLoadRun();
  10.     }   
  11.         
  12.     if(whichUart==0)
  13.     {  
  14.         while(!(rUTRSTAT0 & 0x1)); //Receive data ready
  15.         return RdURXH0();
  16.     }
  17.     else if(whichUart==1)
  18.     {  
  19.            
  20.         //while(!(rUTRSTAT1 & 0x1));//Receive data ready 
  21.         while(!(rUTRSTAT1 & 0x1))
  22.         {
  23.             if(RunFlag)//关键所在,在串口等待处启动wince,非常合适
  24.             {
  25.                 Uart_Printf("RunFlag=%d/n", RunFlag);
  26.                 NandLoadRun();
  27.             }   
  28.         }   
  29.         return RdURXH1();
  30.     }
  31.     else if(whichUart==2)
  32.     {
  33.         while(!(rUTRSTAT2 & 0x1)); //Receive data ready
  34.         return RdURXH2();
  35.     }
  36.     
  37. #ifdef USE_EXCOM_16652
  38.     else if(whichUart==3)
  39.     {
  40.         return (ser16652_waitchar(EXCOM_A)); //Receive data ready        
  41.     }
  42.     
  43.     else if(whichUart==4)
  44.     {
  45.         return (ser16652_waitchar(EXCOM_B)); //Receive data ready       
  46.     }
  47.         
  48. #endif 
  49. }

问题解决

后来我想每次都要使用DNW以及串口才能启动wince,这样设计明显不合理的,后来我想了一些办法:就是使用定时器,定时三秒,如果没有发送命令来,就自动启动wince,否则执行相关命令。

哈哈,测试一下怎么上传读片的,以前都不会用CSDN的功能。

https://p-blog.csdn.net/images/p_blog_csdn_net/gooogleman/EntryImages/20081110/触摸屏校正数据.jpg

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值