| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2150 人关注过本帖
标题:为什么函数执行完了,还能导致系统死机?
取消只看楼主 加入收藏
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
结帖率:16.67%
收藏
已结贴  问题点数:20 回复次数:8 
为什么函数执行完了,还能导致系统死机?
为了描述简便,前述这部分语法不对,就是为了说明意思。
我的设想是,有这么一个数组就3个字节那么大,数据内容不为空,有数。
u8 TXXX.recvaddr【3】 = {1,2,3};

然后从EEPROm里读取了一组数据,存入了u8 certify_userlist【16*3】 = {0};这个数组里。这个数组具体存入的元素个数根据变量certify_usernums来决定。
我想在certify_userlist里查找是否有TXXX.recvaddr【】这个数组的内容,3个字节一组一组的找,如果找到直接函数返回1.否则返回0.

也就是说 比如 想在 certify_userlist[48] = {4,5,6;7,8,9;1,2,3;10,11,12}里查找是否有TXXX.recvaddr[3] = {1,2,3}的值
该段函数如下:

u8 Authentication_list()
{
    u8 i,k;
    I2C_Read(I2C1, ADDR_24C02N, 48, &certify_usernums, 1);
    printf("Auther: %d\r\n", certify_usernums);
    if((certify_usernums <= 16)&&(certify_usernums >= 0))
    {
        I2C_Read(I2C1, ADDR_24C02N, 0, certify_userlist, certify_usernums * 3);
    }
    for(k = 0; k < certify_usernums *3 ;k++)
    {
        printf("certify_userlist[%d]: %d\r\n", k,certify_userlist[k]);
    }
   
    for(i = 0; i < certify_usernums; i++)
    {
        printf(" cer: %d\r\n",i);
        if(0 == memcmp(TXXX.recvaddr, certify_userlist + i*3, 3))
        {
            printf("OK\r\n");
            memset(certify_userlist, 0, 48);  
            iscertify = 1;
            return 1;
        }   
    }
    iscertify = 0;
    memset(certify_userlist, 0, 48);
    return 0;
}

我现在非常奇怪的是我这段程序,我通过看Log,基本确定它能够找到数据是否存在,而且也能执行到return;但为什么执行完,整个主程序就死机了。

大家帮我看看吧。谢谢了!!!!
搜索更多相关主题的帖子: 元素 
2014-09-04 13:37
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 
==1 是什么意思?
2014-09-04 14:34
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 
case 0xA7:  //设置组地址
             printf("A7 coming\r\n");
             if(Authentication_list())
             {
                 printf("0xA7\r\n");
                 memcpy(&(Groupaddr_nums), rev_buf + num + 1, 1);        //保存组地址个数:一字节,本包数据中共有组地址个数(≤8个)。
                if(Groupaddr_nums <= 8)
                {
                    for( i = 0; i < Groupaddr_nums; i++)
                    {
                        memcpy(Group_addr[i].addr_ID, rev_buf + num + 2 +(i*8), 3);//保存用户机ID
                        memcpy(Group_addr[i].addr_unit, rev_buf + num + 5 +(i*8), 4); //保存用户机ID对应组地址和组内地址
                        memcpy(&(Group_addr[i].addr_set), rev_buf + num + 9 + (i*8), 1); //保存用户机ID对应增删字段   
                    }
                    printf("groupaddr_nums\r\n");
                }
            
                for(j = 0; j < Groupaddr_nums; j++)            //双层循环,较长的循环放在内层效率要高。但如果循环次数相当,那谁放内谁放外,再说吧?
                {                                            
                    //int memcmp(const void *buf1, const void *buf2, unsigned int count);
                    if(0 == memcmp(Group_addr[j].addr_ID, ICXX.localID, 3)) //如果传来的用户机ID是本机ID
                    {
                        I2C_Read(I2C1, ADDR_24C02N, 65, &group_list_nums, 1);  //从EEPROM里读取组地址列表中存的组地址个数
                        printf("first for\r\n");
                        for(k = 0; k < group_list_nums; k++)
                        {
                            I2C_Read(I2C1, ADDR_24C02N, 65, &group_list_nums, 1);  //从EEPROM里读取组地址列表中存的组地址个数
                            I2C_Read(I2C1, ADDR_24C02N, 66, group_list, (group_list_nums * 4));  //从EEPROM里读取组地址列表
                            printf("twice for\r\n");
                            if(0 == memcmp(Group_addr[j].addr_unit, (group_list + 4*k), 4)) //如果EEPROm里存在本次传来的组地址
                            {
                                if(Group_addr[j].addr_set == 1)//删除
                                {
                                    memcpy(group_list_temp, group_list + 4*k + 4, (group_list_nums - k - 1)*4);      //保存EEPROm后续组地址
                                    I2C_Write(I2C1, ADDR_24C02N, 66 + k*4, delete_group, (group_list_nums - k)*4 );       //先变成0再重新保存
                                    I2C_Write(I2C1, ADDR_24C02N, 66 + k*4, group_list_temp, (group_list_nums - k - 1)*4); //将后续组地址从删除处填上
                                    group_list_nums -= 1;
                                    I2C_Write(I2C1, ADDR_24C02N, 65, &group_list_nums, 1);
                                    printf("delete Group_addr\r\n");
                                }
                                else if(Group_addr[j].addr_set == 0) //增加
                                {
                                    ;//无需操作
                                }                        
                                exist_flag = 1; //传来的组地址在本地EEPROM组地址列表里是否存在的标志位
                            }                                       
                        }

                        printf("twice for end\r\n");
                        if(exist_flag != 1)        //传来的组地址在本地EEPROM组地址列表里不存在
                        {
                            if(Group_addr[j].addr_set == 0)//增加
                            {
                                I2C_Read(I2C1, ADDR_24C02N, 65, &group_list_nums, 1);  
                                I2C_Write(I2C1, ADDR_24C02N, 66 + group_list_nums*4, Group_addr[j].addr_unit, 4);  //保存组地址
                                group_list_nums += 1;
                                I2C_Write(I2C1, ADDR_24C02N, 65, &group_list_nums, 1);  //保存组地址个数
                                printf("add group_addr\r\n");
                            }
                            else if(Group_addr[j].addr_set == 1)//删除
                            {
                                ;//无需操作
                            }                                   
                        }
                        else if(exist_flag == 1)
                        {
                            exist_flag = 0;           //存在的话前面已经处理过了
                        }                                       
                    }               
                }
               
                //分包发送组地址
                I2C_Read(I2C1, ADDR_24C02N, 65, &group_list_nums, 1);  
                package_nums = (group_list_nums / 16) + 1;
                if(package_nums == 1)      //需要传送一包
                {
                    I2C_Read(I2C1, ADDR_24C02N, 66, package_groupaddr1, group_list_nums * 4);
                    Group_Infor(txsq_context, txsqcontext_lens, package_groupaddr1, group_list_nums);    //响应:组地址信息B7
                }
                else if(package_nums == 2)     //需要传送二包
                {
                    I2C_Read(I2C1, ADDR_24C02N, 130, package_groupaddr2, (group_list_nums - 16) * 4);
                    Group_Infor(txsq_context, txsqcontext_lens, package_groupaddr1, group_list_nums);
                    package_sendtwice = 1;
                        
                }
                else if(package_nums == 3)     //需要传送三包        至多总共40组组地址
                {
                    I2C_Read(I2C1, ADDR_24C02N, 194, package_groupaddr3, (group_list_nums - 32) * 4);
                    Group_Infor(txsq_context, txsqcontext_lens, package_groupaddr1, group_list_nums);
                    package_sendtriple = 1;
                }                        
             }
            break;
2014-09-04 14:43
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 
这是哦整个分支 return1 了 我整个case才会执行
2014-09-04 14:44
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 
我这个分支,只要去了Authenti——list一点儿事没有
2014-09-04 14:45
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 

 printf("A7 coming\r\n");执行了
但是
if(Authentication_list()) 执行完了就死机
注释掉 一点事没有


我为什么要改循环条件,是因为我的数组列表有可能增删数据,每次循环完我必须改动,确保循环到。

我认为问题不在这
2014-09-04 15:06
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 
乘4后不会超过160 ,因为最多40个组地址,一组是4个字节。我定义数组长度是160.

您说的有可能,不过我当时数组里只有2组数据,最多8个字节。真是不多
2014-09-04 15:18
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

打印的LOG见上面。
我觉得问题的根源也不在于group_list-nums2. 还是我那个Authentication_list函数里。

大家能帮忙看看,是不是哪的语法错误了?函数应该执行完了,怎么会死机了?
2014-09-09 10:26
lqab1983
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2013-11-29
收藏
得分:0 
那我该怎么查找问题了,我基本用的都是数组,就没敢内存分配
2014-09-10 09:51
快速回复:为什么函数执行完了,还能导致系统死机?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.075512 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved