打印

关于菜单里的函数一个疑问

[复制链接]
1782|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjswuyunbo|  楼主 | 2010-7-29 08:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
菜单里typedef struct
{
    unsigned char code *Menu_NextTab;       //本级菜单菜单链表
    char code *Menu_Name;                   //当前菜单名称
    void    (*CurrentOperate)();            //当前状态应该执行的功能操作
}Menustruct;
void    (*CurrentOperate)();            
这个函数是当前状态应该执行的操作。
比如这个函数要执行一个参数,可能需要一个死循环,只有设置完参数,才退出循环。
比如:
while(1)
{
      参数设置;
      if(参数设置完成)
           break;
}
但是,这样子会导致程序死在这里,被这里独占执行了,其他的一些任务(比如ad,串口等)就无法执行。

不知大家是怎么做的?

是不是就是像上面一样?
或者说是   在这里设置一个标志位,然后启动另外一个  任务做 参数设置??

相关帖子

沙发
ayb_ice| | 2010-7-29 08:45 | 只看该作者
用RTOS或状态机完成

使用特权

评论回复
板凳
ShakaLeo| | 2010-7-29 08:47 | 只看该作者
楼主的程序是裸奔吗?把AD放在定时器中断里,串口的接收和发送都用中断,会不会好些?

使用特权

评论回复
地板
zjswuyunbo|  楼主 | 2010-7-29 09:05 | 只看该作者
void    Menu_Key_Func(unsigned char NowKey); //菜单按键功能
{
    switch(NowKey)
    {
        case    KEY_UP:
                ....
        case    KEY_doWN:
                ....
                break;
        case    KEY_OK://KEY_OK,    KEY_UP,    KEY_ESC,
                if(*(KeyTab[Menu_tree][Menu_tree_ptr]].Menu_NextTab))    //Menu_NextTab[0]不为0,是菜单
                {
                    Menu_tree[Menu_tree_ptr+1]=KeyTab[Menu_tree][Menu_tree_ptr]].Menu_NextTab[Menu_item_ptr]);
                    Menu_tree_ptr++;      
                       refur_Menu();         
                }
                else      
                {
                    KeyFuncPtr=KeyTab[Menu_tree][Menu_tree_ptr]].CurrentOperate;
                    (*KeyFuncPtr)();    //这里执行操作   
                }
                break;

}

看到别人的代码是如上写的。
当按下  KEY_OK时,才会执行  (*KeyFuncPtr)();  

可否改成每次都执行这个函数,这个函数就是一个设置参数的任务,但改任务不是死循环,但是每次执行菜单时,都会进入这个程序,所以也不需要死循环。

使用特权

评论回复
5
ayb_ice| | 2010-7-29 09:50 | 只看该作者
写程序要有分时,分片概念

使用特权

评论回复
6
zjswuyunbo|  楼主 | 2010-7-29 10:13 | 只看该作者
恩。也许这个问题只有在rtos下,就很简单的解决了。

使用特权

评论回复
7
ayb_ice| | 2010-7-29 10:30 | 只看该作者
状态机轻松搞定

使用特权

评论回复
8
zjswuyunbo|  楼主 | 2010-7-29 11:40 | 只看该作者
关键是模块之间比较耦合太多。。

使用特权

评论回复
9
疯子8972| | 2010-7-29 14:46 | 只看该作者
应用上的逻辑耦合  不应该影响程序的模块化
说起来容易   呵呵
所有模块尽量非阻塞      时序逻辑统一安排
我做过一个模仿国外工控产品的东西
显示   报警   设定    检测    很多时序和逻辑的混叠
没有好的硬件驱动 (底层)  和 上层结构驱动  是完不成的
裸奔也能做出牛东西的    哈哈
在好的结构下   单片机做的东西  别人还以为是用ARM做的呢

使用特权

评论回复
10
疯子8972| | 2010-7-29 14:54 | 只看该作者
我现在用单片机驱动串口液晶组模   
也有类似的问题
经常在刷新画面时  需要有上千字节串口数据  单用缓冲+中断是不能解决问题的
如果用普通的思想  只能等了
但是  我还有外部通讯    采样   报警等多个任务
我采用阻塞+嵌套
在阻塞中继续响应除了串口发送外所有事件
希望多你有点帮助

使用特权

评论回复
11
zjswuyunbo|  楼主 | 2010-7-29 16:07 | 只看该作者
10# 疯子8972
说得有道理。。
不过,在阻塞里又调用其他的任务,思路不清晰。。。。
貌似把所有任务放在主循环里比较清晰 。。。

使用特权

评论回复
12
疯子8972| | 2010-7-30 20:37 | 只看该作者
呵呵
其实主循环就是一个阻塞
在这个阻塞中,响应了所有的事件
那如果在一个任务时,受到了阻塞,也可认为这个阻塞就是主循环,响应所有事件
都是阻塞  并无区别
只要控制好结构和嵌套层次
可以做到很清晰了

使用特权

评论回复
13
疯子8972| | 2010-7-30 20:47 | 只看该作者
可以这么理解
单片机除了在“干正事”以外
都在“阻塞”,可能说得不准确,应该说是都在“无所事事”
所以在“无所事事”的时候,它必须等待事件发生
它需要随时去“干正事”
主循环是“无所事事”   单个任务中的阻塞也是“无所事事”
所以。。。

使用特权

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

本版积分规则

163

主题

1578

帖子

1

粉丝