OpenEdv-开源电子网

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

链表死机

[复制链接]

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-8-13
在线时间
0 小时
发表于 2012-8-13 22:03:50 | 显示全部楼层 |阅读模式

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "spi.h"
#include "flash.h"
#include "mmc_sd.h"
#include "ff.h"
#include "integer.h"
#include "diskio.h"
#include "text.h"
#include "24cxx.h"
#include "fontupd.h"
#include "remote.h"
#include "show.h"
#include "dijkstra.h"
#include "rtc.h"
#include "list.h"
#include "Retarget.h"
//#include "pwm.h"
const u8 *COMPILED_DATE=__DATE__;//获得编译日期
const u8 *COMPILED_TIME=__TIME__;//获得编译时间
int returnmax(int temp)
{
 if(temp/100000)
 {
  return 5;
 }else if(temp/10000)
 {
  return 4;
 }else if(temp/1000)
 {
  return 3;
 }else if(temp/100)
 {
  return 2;
 }else
 {
  return 1;
 }
}
u32 totalsecond(u8 hour,u8 minute,u8 second)
{
 return hour*3600 + minute*60 + second;
}


int main(void)

 //u8 totaldistance;
 int flag = 0;       //标记是各位还是十位
 int startorend = 0;        //标记是开始站点还是结束站点
 u8  startorpulse = 0;      //标记是启动还是停止
 u8 play = 0;         //是否开始显示运行时间
 u8 K_Play=0;         //判断播放链表长度
 u8 K_Pulse=0;         //判断停止链表长度
 int key;          //遥控键值
 u8 fontx[2];
 int keynumshi;         //第一次为十位
 int keynumge;         //第二次为各位
 int mykey;          //为键值转换的值
 int mysite[2]={0,0};       //保存结束和开始站点
 u16 temp = 0;              //得到站点组成的数
 u8  sitenum=0;         //记录站点数目
 u32 startsecond=0;        //记录开始时的秒数
 u32 endsecond=0;        //记录结束时的秒数
 FATFS fs;
 u32 playtotaltime = 0;                  //记录最近一次运行时间段
 u32 pulsetotaltime = 0;                 //记录最近一次停止时间段
 Lnode *L_Play;          //链表的建立
 Lnode *L_Pulse;        //链表的建立

 SystemInit();
 delay_init(72);           //延时初始化
 NVIC_Configuration();
  uart_init(9600);
  LED_Init();
  KEY_Init();
 LCD_Init();
 RTC_Init();
 Remote_Init();
 uart_init(9600);
  SPI_Flash_Init();      //SPI FLASH初始化
 f_mount(0, &fs);       //初始化必须mount
 L_Play=(Lnode*)malloc(sizeof(Lnode));   //动态分配内存
 L_Pulse=(Lnode*)malloc(sizeof(Lnode));   //动态分配内存
 
 L_Play->next=0;          //链表的建立
 L_Pulse->next=0;

 

 while(font_init())
 { 
  OINT_COLOR=RED;     
  LCD_Clear(WHITE);
   while(update_font())    //从SD卡更新
     {  
         LCD_ShowString(60,90,"FAT SYS ERROR.      "); 
   delay_ms(200);    
  }
 }
 OINT_COLOR=RED;
 Show_Screen();       //显示屏幕    
 LCD_ShowString(10,250,"Starting site:");
 while(1)
 {

  if(Remote_Rdy )
  {
   key=Remote_Process();
   
   switch(key)
   {
    case 162:
     LCD_ShowString(150,240, "POWER");
 
     break;
    case 98:
     LCD_ShowString(150,240, "UP    ");
     break;
    case 2:
     if(startorpulse == 0)
     {
      //startsecond = totalsecond(timer.hour,timer.min,timer.sec);
     /* InsertList(L_Play,1,3);
      
      LCD_ShowNum(100,200,printList(L_Play,1),1,16);          //在播放链表里插入开始运行时间点
      if(K_Play==0)               //第一次按下那个播放键起始时间为0,
      {
       pulsetotaltime = 0;
      }else                    //第二次后的播放时间点减去最新一次停止时间点为播放时间
      {
       pulsetotaltime = pulsetotaltime + printList(L_Play,K_Play) - printList(L_Pulse,K_Pulse-1);
      } 
                     //如果车在启动,则显示时间
      Show_Str(100,10,"开车时间:",16,0);
      startorpulse = 1;             //准备进入停止运行计算时间
      L_Play = L_Play->next;               //准备进入停止运行计算时间
      K_Play++;*/ play = 1;                //准备进入停止运行计算时间
     }else
     {
     /* play = 2;               //如果车停止运行
      startorpulse = 1;             //准备进入运行运行计算时间
      Show_Str(100,30,"停车时间:",16,0);
      InsertList(L_Pulse,K_Pulse,totalsecond(timer.hour,timer.min,timer.sec));   //在停止链表里插入结束运行时间点
      playtotaltime = playtotaltime + printList(L_Pulse,K_Pulse)-printList(L_Play,K_Play-1);//停止时间点减去最新一次播放时间点为停止时间段
      L_Pulse = L_Pulse -> next;                //准备进入运行计算时间
      K_Pulse++;  */                         //准备进入运行计算时间
     }
     key = 111;
     break;
    case 226:
     LCD_ShowString(10,270,"Endding site:");
     if(startorend==0)
     {
      mysite[1]=mykey;
      startorend=1;
      key = 111; 
     }else
     {
      mysite[0]=mykey;
      LCD_Clear(WHITE);
      temp=dijkstra(mysite[1],mysite[0]);
      sitenum=returnmax(temp);
      key = 111;
     }
     break;
    case 194:
     LCD_ShowString(150,240, "RIGHT ");
     break;
    case 34:
     LCD_ShowString(150,240, "LEFT  ");
     break;
    
    case 224:
     LCD_ShowString(150,240, "VOL-  ");
     break;
    case 168:
     LCD_ShowString(150,240, "DOWN  ");
     break;
    case 144:
     LCD_ShowString(150,240, "VOL+  ");
     break;
    case 82:
     LCD_ShowString(150,240, "DELETE");
     break;
   } 
   switch(key)
   {
    case 56:key=8;break;
    case 104:key=1;break;
    case 152:key=2;break;
    case 176:key=3;break;
    case 48 :key=4;break;
    case 24 :key=5;break;
    case 122:key=6;break;
    case 16 :key=7;break;
    case 90 :key=9;break;
    case 66 :key=0;break;
   }  
   switch(key)
   {
    
    case 1:
    case 0:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
     if(flag==0)             //如果是十位
     {
      keynumshi=key;
      key=111;
      flag=1;
      if(startorend==0)            //如果是开始站点
      {
       LCD_ShowNum(130,250,keynumshi,1,16);
      }else             //如果是结束站点
      {
       LCD_ShowNum(130,270,keynumshi,1,16);
      }
     }else               //如果是各位
     {
      keynumge=key;
      key=111;
      flag=0;
      if(startorend==0)
      {
       LCD_ShowNum(138,250,keynumge,1,16);
      }else
      {
       LCD_ShowNum(138,270,keynumge,1,16);
      }
     }
     mykey = keynumshi*10 + keynumge;
     break;
   }
     
  }
  endsecond = totalsecond(timer.hour,timer.min,timer.sec);
  if(play == 1)
  { 
    InsertList(L_Play,0,1);          //链表的建立
 InsertList(L_Play,1,2);
 LCD_ShowNum(100,200,printList(L_Play,0),1,16);
 L_Play=L_Play->next;
 LCD_ShowNum(100,220,printList(L_Play,1),1,16);

 InsertList(L_Pulse,0,1);
 InsertList(L_Pulse,1,2);
 LCD_ShowNum(110,200,printList(L_Pulse,0),1,16);
 L_Pulse=L_Pulse->next;
 LCD_ShowNum(110,220,printList(L_Pulse,1),1,16);  
  // LCD_Show2Num(180,10,playtotaltime + endsecond - printList(L_Play,K_Play-1),4,16,0);
  }else if(play == 2)
  {
   //LCD_Show2Num(180,10,pulsetotaltime + endsecond - printList(L_Pulse,K_Pulse-1),4,16,0);
  }
  
 }  
}

 

为什么那个InsertList放在开头处,单片机正常运行,可是放在遥控的键值处理处却死机,每插入一个数就死机

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-13 22:25:26 | 显示全部楼层
十有八九是内存访问的问题.
慢慢查吧.你的malloc有没有测试过?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-8-14 01:32:11 | 显示全部楼层

有 jtag 可以借助 jtag 来调试,
没有的话可以通过串口发送信息的方式来调试,
先慢慢定位死在了哪条语句,再继续分析,调试程序都是这么来的,代码长了谁看着都晕


另外我在 mdk 的帮助文档里搜了一下 malloc,好像是不能直接使用的。



 

https://github.com/roxma
回复 支持 反对

使用道具 举报

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-8-14 07:44:13 | 显示全部楼层
原子师兄说过用自己的malloc,这是....
回复 支持 反对

使用道具 举报

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-8-14 07:49:04 | 显示全部楼层
十有八九是内存访问的问题. 
现在很疑惑的是,为什么那个InsertList放在while之前就正常运行,可以插入数据,可是,一旦把InsertList放在键值处理就死机了
回复 支持 反对

使用道具 举报

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-8-14 07:50:26 | 显示全部楼层
 LCD_ShowNum(100,200,printList(L_Play,0),1,16);
 L_Play=L_Play->next;
 LCD_ShowNum(100,220,printList(L_Play,1),1,16);

 InsertList(L_Pulse,0,1);
 InsertList(L_Pulse,1,2);
 LCD_ShowNum(110,200,printList(L_Pulse,0),1,16);
 L_Pulse=L_Pulse->next;
 LCD_ShowNum(110,220,printList(L_Pulse,1),1,16);   

回复 支持 反对

使用道具 举报

20

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-8-14 07:51:07 | 显示全部楼层
这个放在while之前是正常运行的,但是放在键值处理处马上死机
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-14 08:55:58 | 显示全部楼层
用仿真器跟踪一下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 07:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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