发新帖我要提问
123
返回列表
打印

51基于实时系统的编程

[复制链接]
楼主: zhouwenbin1989
手机看帖
扫描二维码
随时随地手机跟帖
41
zhouwenbin1989|  楼主 | 2011-4-2 13:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
36# 刘前辈


我的问题搞定了,原来是在KeyHandle(void)函数中,当按下删除全部是我没有将静态变量i置0,导致后面出错。谢谢你这几天给我提供的帮助,太感谢了。以后希望能有跟多机会互相学习

使用特权

评论回复
42
刘前辈| | 2011-4-2 14:37 | 只看该作者

咨询楼主:

本帖最后由 刘前辈 于 2011-4-2 14:45 编辑

void KeyInput(void) //扫描按键,正确按键后将按键信息加入消息队列KeyValueBuf供别的任务处理
{
    uint8 temp;
        OSQCreate(KeyValueBuf,8);  //创建按键值消息队列,占用8字节
        //OSWait(K_TMO,1);
        while (1)
    {
          P1=0xf0;
          OSWait(K_TMO,2);   //等待P1口数据稳定
          if(P1!= 0xf0)
           {
           OSWait(K_TMO,2); //延时20ms去抖
           if(P1!=0xf0)
                {
          temp=Keyscan();
             OSWait(K_TMO,2); //延时20ms去抖
             if(temp==Keyscan())        
           {
         while(temp==Keyscan()) ;    //松手检测  
   这里没松手?
OSQPost(KeyValueBuf,temp);  //正确按键后发送按键消息
                   }
                }           
          }        
    }      

}

麻烦请问LZ,这段扫描码是自己写的还是书上的?


使用特权

评论回复
43
刘前辈| | 2011-4-2 15:07 | 只看该作者
本帖最后由 刘前辈 于 2011-4-2 15:12 编辑
如果B睡眠时B是关中断的话切换过去还是关中断,但是如果B的关中断是打开的的话切换过去时会在内核函数中自动打开中断。


不合逻辑呀。假设A,B是2个独立不相关的任务,他们的切换调度完全由OS内核时间片管理:当前运行态A任务,B任务就绪态;那么,如果A关闭了中断,进入睡眠,OS时间片失效,谁来触发内核调度器切换B任务运行?谁以后来唤醒A?

       所以,关闭中断的时间不能超过一个系统节拍,系统节拍是OS内核的心跳,如果人为关闭了,就意味不要OS管理了,那程序员就不要睡眠,自己管理吧。
    、

使用特权

评论回复
44
刘前辈| | 2011-4-2 17:25 | 只看该作者
本帖最后由 刘前辈 于 2011-4-2 17:27 编辑

修改:if( OSQPend(temp,Command1602Buf,0)== OS_Q_TMO) …… ;

       void  Enter1602(void)  //1602密码登陆界面处理
{
   uint8 temp[1];
   OSSemCreate(LCD1602_SEM,0);
   Write_string(1,1,"  -SMALL RTOS-  "); //1602初始化登陆界面大概要写250ms
   OSWait(K_TMO,2);
   Write_string(2,1,"Password:");
  while(1)
   {
if( OSQPend(temp,Command1602Buf,0)== OS_Q_TMO) return ;  //总得判断一下吧。   
            
        switch (temp[0])
         {        
       case(WRITE_STAR):  //在1602上写下一个“*”号,密码为六位
            if(addr<9&&addr>=15)
             addr=9;
           else
             {addr+=1;Write_char(2,addr,'*');}break;//写一个字符大概30ms
         ……
        ……


使用特权

评论回复
45
刘前辈| | 2011-4-2 17:50 | 只看该作者
我也从LZ的程序中学会了消息队列的用法。感谢LZ,如果不是LZ,我一个人几年都懒得写这么长的程序。


下面一句话感动我半天:
有一扇窗,从未打开,却要永远关闭;
有一些人,确实存在,我们却无缘相见;
有一种生活,还没有到来,我们却已永远离开。

            ——摘自《代码阅读方法与实践》

使用特权

评论回复
46
zhouwenbin1989|  楼主 | 2011-4-3 07:28 | 只看该作者
41# zhouwenbin1989

是自己写的,全是自己写的,除了内核。
while(temp==Keyscan()) ;    //松手检测     这里没松手?

这里松手检测写的不行,没想到什么好方法,就只有这样写了,当按键按下时就在这循环,松开就跳出循环,但是这样如果按键按很长时间感觉会出问题,具体我还没试过。不知前辈有何好的方法没

使用特权

评论回复
47
刘前辈| | 2011-4-3 10:07 | 只看该作者
本帖最后由 刘前辈 于 2011-4-3 10:12 编辑

关键松手也要抖动,抖动期间如何判定是“按键∕释放”? 学校还是单位?图书馆去借下面这本书,网上中英文都有下载。好像21ic论坛也有;它的系统节拍或者扫描延迟好像是200ms。


Keypad.rar (1.74 KB)

使用特权

评论回复
48
zhouwenbin1989|  楼主 | 2011-4-3 18:37 | 只看该作者
43# 刘前辈

请问下OS时间片失效时什么意思?的确如果切换过去那个人务也是关中断的话的确定时器中断触发不起来,所以每个任务中必须又开中断就又中断。

使用特权

评论回复
49
zhouwenbin1989|  楼主 | 2011-4-3 18:39 | 只看该作者
44# 刘前辈


之前那个问题没解决时我也想过这个地方,后来加上也没什么改变。不过加上应该会比不加上好点。我刚接触这个论坛没多久,想问下你这这种带白底的引用是怎么弄出来的

使用特权

评论回复
50
zhouwenbin1989|  楼主 | 2011-4-3 18:42 | 只看该作者
45# 刘前辈

呵呵,见笑了,互相学习。这句话确实说的不错。你也是学生吗

使用特权

评论回复
51
zhouwenbin1989|  楼主 | 2011-4-3 18:43 | 只看该作者
47# 刘前辈

当时也就这个程序时其实也是为了学习消息队列没注意研究键盘,不过还是很感谢你给了我这么多建议

使用特权

评论回复
52
刘前辈| | 2011-4-4 08:40 | 只看该作者
想问下你这这种带白底的引用是怎么弄出来的



选这个按钮:

使用特权

评论回复
53
zhouwenbin1989|  楼主 | 2011-4-4 23:22 | 只看该作者
呵呵,见笑了,互相学习。这句话确实说的不错。你也是学生吗
50# zhouwenbin1989

试下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则