OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6580|回复: 12

UCOS两个回调函数互相调用 死机

[复制链接]

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2013-5-23
在线时间
47 小时
发表于 2013-6-3 16:35:44 | 显示全部楼层 |阅读模式
回调函数1: 
static void code_Function_cbCallback(WM_MESSAGE * pMsg) 
    {.......
      主界面回调函数,对各个触摸按键检测,如果检测到密码输入,就进入密码输入界面,密码输入界面的回调函数:回调函数2

:    }
回调函数2:
    static void Function_cbCallback(WM_MESSAGE * pMsg) 
  {.............
     密码输入完 又回到主界面
  }         
    
每次都是来回调用密码界面第五次 死机
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-3 20:10:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-3 20:56:39 | 显示全部楼层
是不是你的指针处理的问题啊?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2013-5-23
在线时间
47 小时
 楼主| 发表于 2013-6-3 22:17:45 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
这个好像有人碰到过  说是栈溢出  但没说怎么解决的
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-6-3 22:23:17 | 显示全部楼层
重复调用溢出了吧。
业余程序玩家。
回复 支持 反对

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2013-5-23
在线时间
47 小时
 楼主| 发表于 2013-6-3 22:28:25 | 显示全部楼层
回复【5楼】ofourme:
---------------------------------
怎么解决这个问题呢  刚好有个类似的例子 我的程序和这个差不多 但是大了点 不方便传
现在的问题是:主页面和菜单页面互相切换,主页面一个按键,按下该按键切换到菜单页面;菜单页面有9个按键,按下菜单页面的返回按键切换到主页面,
这样互相切换个242次的时候该任务就堆栈溢出死掉了,进了HardFault_Handler中断灯亮了:(当把堆栈改大掉,切换次数就可以多一点)
void HardFault_Handler(void)
{
    Fout(13)=1;    //灯会亮
    while (1);
}
第一个主页面如下:
void Home_Page(void)            //开始首页

                BUTTON_Handle hButton;
        u8 Key;
        GUI_Clear();         
        Home_Page_BIN=1;
        GUI_SetBkColor(GUI_LIGHTBLUE);

        hButton =  BUTTON_Create( 700, 370, 95, 63, 1, BUTTON_CF_SHOW );
        BUTTON_SetBitmapEx(hButton,0,&bmbackindexpage,0,0);
        do{
                    Key = GUI_WaitKey();
                    switch (Key) 
                        {
                                    case 0:        break;
                                    case 1: BUTTON_Delete(hButton);Home_Page_Fig=0;Menu_Page();break;  //这里切换到第二个页面
                                    default:break;
                    }
     }while ((Key != 'N') && (Key!=GUI_ID_CANCEL) && (Key!=0));
     BUTTON_Delete(hButton);
}
第一个菜单页面如下:
void Menu_Page(void)
{
                 BUTTON_Handle men_Button[9];
                 u8 index_key,i;
                 GUI_Clear();
             
                 men_Button[0]= BUTTON_Create( 110, 90, 99, 119, 10, BUTTON_CF_SHOW );
                 men_Button[1]= BUTTON_Create( 270, 90, 99, 119, 11, BUTTON_CF_SHOW );
                 men_Button[2]= BUTTON_Create( 430, 90, 98, 119, 12, BUTTON_CF_SHOW );
                 men_Button[3]= BUTTON_Create( 590, 90, 95, 117,13, BUTTON_CF_SHOW );
        
                 men_Button[4]= BUTTON_Create( 110, 250, 96, 124, 14, BUTTON_CF_SHOW );
                 men_Button[5]= BUTTON_Create( 270, 250, 99, 118, 15, BUTTON_CF_SHOW );
                 men_Button[6]= BUTTON_Create( 430, 250, 98, 120, 16, BUTTON_CF_SHOW );
                 men_Button[7]= BUTTON_Create( 700, 370, 95, 63, 17, BUTTON_CF_SHOW ); 
                 men_Button[8]= BUTTON_Create( 590, 250, 96, 124, 18, BUTTON_CF_SHOW ); 
                  
                 
                 do{
                    index_key = GUI_WaitKey();
                    switch (index_key) 
                        {
                                    case 10: break;        //
                                    case 11: break;
                                    case 12: break;
                                    case 13:break;
                                    case 14: break;
                                    case 15:break;
                                    case 16: break;
                                    case 17: for(i=0;i<9;i++)                         //按下此返回按钮时回到主页面
                                                               {
                                                                                      BUTTON_Delete(men_Button);
                                                               }  Home_Page();break;                //回到主页面                        
                                                                    case 18: break;        
                                    default:break;
                    }
                                  }while ((index_key != 'N') && (index_key!=GUI_ID_CANCEL) && (index_key!=0));
                 for(i=0;i<9;i++)
                 {
                                              BUTTON_Delete(men_Button);
                 }          
}
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-6-3 23:23:52 | 显示全部楼层
哈,循环递归调用,不是才怪。
直接返回主界面吧,而不是调用主界面函数。
业余程序玩家。
回复 支持 反对

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2013-5-23
在线时间
47 小时
 楼主| 发表于 2013-6-4 07:54:40 | 显示全部楼层
回复【7楼】ofourme:
---------------------------------
小弟刚学这个 能具体说下 怎么返回主界面呢,主界面是由主界面函数完成的
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-6-4 08:54:12 | 显示全部楼层
你刚学C是吧?!

你是这样调用:Home_Page->Menu_Page->Home_Page->Menu_Page->...不溢出才怪。
应该这样才是:Home_Page<->Menu_Page
业余程序玩家。
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-6-4 14:51:11 | 显示全部楼层
回复【楼主位】yangzi6000:
---------------------------------

调用的时候 每次都要压栈, 所以几次就溢出了。 

用状态来区别, 不要嵌套调用!
回复 支持 反对

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2013-5-23
在线时间
47 小时
 楼主| 发表于 2013-6-5 17:11:01 | 显示全部楼层
回复【10楼】aleda303:
---------------------------------
可以这么理解吗:第一个函数返回到第二个函数时候状态标志位为1;
                第二个函数返回到第一个函数时候状态标志位2
 在另一个地方 检测状态标志位,来决定进入哪个函数?
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-6-6 08:38:34 | 显示全部楼层
回复【11楼】yangzi6000:
---------------------------------
可以做两个线程共有的 状态标志 用volitile限定, 然后 根据标志的不同做相应的处理。
回复 支持 反对

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2013-5-23
在线时间
47 小时
 楼主| 发表于 2013-6-6 15:36:21 | 显示全部楼层
回复【12楼】aleda303:
---------------------------------
问题解决了 卡了两天 是任务调度进入死循环了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 22:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表