硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2874|回复: 8
收起左侧

[FreeRTOS] hard fault

[复制链接]

4

主题

12

回帖

24

积分

新手上路

积分
24
发表于 2017-8-27 22:29:24 | 显示全部楼层 |阅读模式
版主救命啊,
型号 stm 32 f103r8
系统 freertos   申请12k内存
任务建了5个
问题,现在LogThread里面有个方法  :ExistAlarm( MAIN_CONTROL_TEMP_HandleType  *pAllRegister, LOG_SAVE_HandleType *pSavedata)
                                                               这个里面有个一大堆的if语句,其中最后三个if就是下面贴过来的,但是只要加上这三个if,系统在运行到 AppTaskCreate (void)之前
                                                             在创建增值信号量的时候就hard fault了,但是屏蔽这三个if,就好了,
                                                           在写LogThread时,我一开始调试的时候就把  Main_Control_Communication_Thread 屏蔽了,因为此任务里有较多打印,为了使打印清晰,我就直接把
                                                         他屏蔽了,后来调好之后,我把   Main_Control_Communication_Thread 的屏蔽取消了(声明 Main_Control_Communication_Thread 此前运行正常),系统一运行就hard fault,、         
                                                        把LogThread里下面的三个if屏蔽掉就可以正常运行了。
                                                       这个到底什么问题,如何调试。
{



#if 1
  if((pAllRegister->heat2.alarm2 & BIT(2))&&(!alarmFlag.heater2_heat1WaterSwtichNOAlarm))
  {
   //printf("++++++++++++++++++++++pAllRegister->heat2.alarm2 & BIT(2)       \r\n");
   alarmFlag.heater2_heat1WaterSwtichNOAlarm = TRUE;
   
    /*save to normal area*/
    GetSaveData(pSavedata);
    SPI_Flash_Write((u8 *)pSavedata, WriteAddr_normal, sizeof(LOG_SAVE_HandleType));
  WriteAddr_normal += sizeof(LOG_SAVE_HandleType);
   if(WriteAddr_normal == WriteAddr_NORMAL_END)
      WriteAddr_normal = 0;
    /*save to alarm area*/
    SPI_Flash_Write((u8 *)pSavedata, WriteAddr_alarm, sizeof(LOG_SAVE_HandleType));
    WriteAddr_alarm += sizeof(LOG_SAVE_HandleType);
    if(WriteAddr_alarm == WriteAddr_ALARM_END)
      WriteAddr_alarm = WriteAddr_ALARM_START;

      

  }
  
  if((pAllRegister->heat2.alarm2& BIT(3))&&(!alarmFlag.heater2_heat2WaterSwtichNOAlarm))
  {
    alarmFlag.heater2_heat2WaterSwtichNOAlarm = TRUE;
    /*save to normal area*/
    GetSaveData(pSavedata);
    SPI_Flash_Write((u8 *)pSavedata, WriteAddr_normal, sizeof(LOG_SAVE_HandleType));
    WriteAddr_normal += sizeof(LOG_SAVE_HandleType);
    if(WriteAddr_normal == WriteAddr_NORMAL_END)
      WriteAddr_normal = 0;
    /*save to alarm area*/
    SPI_Flash_Write((u8 *)pSavedata, WriteAddr_alarm, sizeof(LOG_SAVE_HandleType));
    WriteAddr_alarm += sizeof(LOG_SAVE_HandleType);
    if(WriteAddr_alarm == WriteAddr_ALARM_END)
      WriteAddr_alarm = WriteAddr_ALARM_START;

  }

  if((pAllRegister->heat2.alarm2& BIT(4))&&(!alarmFlag.heater2_heat3WaterSwtichNOAlarm))
  {
    alarmFlag.heater2_heat3WaterSwtichNOAlarm = TRUE;
    /*save to normal area*/
    GetSaveData(pSavedata);
   SPI_Flash_Write((u8 *)pSavedata, WriteAddr_normal, sizeof(LOG_SAVE_HandleType));
    WriteAddr_normal += sizeof(LOG_SAVE_HandleType);
    if(WriteAddr_normal == WriteAddr_NORMAL_END)
      WriteAddr_normal = 0;
    /*save to alarm area*/
    SPI_Flash_Write((u8 *)pSavedata, WriteAddr_alarm, sizeof(LOG_SAVE_HandleType));
    WriteAddr_alarm += sizeof(LOG_SAVE_HandleType);
    if(WriteAddr_alarm == WriteAddr_ALARM_END)
      WriteAddr_alarm = WriteAddr_ALARM_START;

  }
    #endif  



任务列表

static void AppTaskCreate (void)
{

task1 =  xTaskCreate( (TaskFunction_t )Usart_thread,     /* 任务函数  */
                        "communication",       /* 任务名    */
                        256,                 /* 任务栈大小,单位word,也就是4字节 */
                        NULL,                /* 任务参数  */
                        3,                   /* 任务优先级*/
                        &xHandleCommunicationTask );  /* 任务句柄  */
                       
  task2 = xTaskCreate( (TaskFunction_t )Main_Control_Communication_Thread,
                       "mainCommuni",
                       512,
                       NULL,
                       3,
                       &xHandleMainCommuniTask );
                     
                       
  task3 =  xTaskCreate( (TaskFunction_t )MainControlTempThread,
                        "mainControlTemp",
                        256,
                        NULL,
                        3,
                        &xHandleMainControlTempTask);
                        
  task4 = xTaskCreate( (TaskFunction_t )vTaskGUI,
                       "GuiThread",
                       256,
                       NULL,
                       4,
                       &xHandleTaskGUI);
                  
  task5 = xTaskCreate( (TaskFunction_t )LogThread,
                       "logThread",
                       512,
                       NULL,
                       3,
                       &xHandleLogTask);  
   }                    
                       



      
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2017-8-28 02:06:53 | 显示全部楼层
这个函数ExistAlarm是在哪里调用的,是任务及其组件创建完毕后使用的吧,仅看你的这个函数,没有什么问题。

另外优先把调用此函数的任务堆栈先加大,还有就是,看你的这个函数有结构体指针,确保你的这个结构体指针有实体。
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2017-8-28 09:21:56 | 显示全部楼层
ExistAlarm实在LogThread 任务里调用的,

ExistAlarm  用的结构体指针我检查了,应该没问题,有实体,今天早上又试了一把,在屏蔽  task1 --- task4 其中任何一个任务时,我的task5也就是LogThread 任务是能跑起来的。
但是
全部打开,就会hard fault,
而且在任务全部开启把LogThread 的栈空间从512  提升到1024  hard fault    再提升到2048    同样hard fault
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2017-8-28 09:25:34 | 显示全部楼层
eric,

我能加你QQ么,这个问题好困扰啊,
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2017-8-28 12:56:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个函数ExistAlarm是在哪里调用的,是任务及其组件创建完毕后使用的吧,仅看你的这个函数,没有什么问题。

另外优先把调用此函数的任务堆栈先加大,还有就是,看你的这个函数有结构体指针,确保你的这个结构体指针有实体。
 (2017-08-28 02:06) 
后来我把  LogThread   里面但在  for(;;)循环之外的建立的局部变量(结构体)拿到了外面作为静态变量来处理,这样程序运行时,创建任务可以创建成功,我查看了返回值,但是在执行开始调度的函数,就崩溃了。
版主,。。。。。。。。。。。。。。。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2017-8-29 02:53:02 | 显示全部楼层

回 jobs2017 的帖子

jobs2017:eric,

我能加你QQ么,这个问题好困扰啊, (2017-08-28 09:25) 
我的QQ
512464265
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2017-8-29 02:55:22 | 显示全部楼层

回 jobs2017 的帖子

jobs2017:后来我把  LogThread   里面但在  for(;;)循环之外的建立的局部变量(结构体)拿到了外面作为静态变量来处理,这样程序运行时,创建任务可以创建成功,我查看了返回值,但是在执行开始调度的函数,就崩溃了。
版主,。。。。。。。。。。。。 .. (2017-08-28 12:56) 
注意,你配置的FreeRTOS的heap控件大小是12KB,而你任务当前配置的栈大小已经有7KB以上,创建任务函数的栈参数是4字节为单位的。
回复

使用道具 举报

4

主题

12

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2017-8-29 09:52:16 | 显示全部楼层

回 eric2013 的帖子

eric2013:注意,你配置的FreeRTOS的heap控件大小是12KB,而你任务当前配置的栈大小已经有7KB以上,创建任务函数的栈参数是4字节为单位的。 (2017-08-29 02:55) 
这个主意到了,经过测试,感觉不是任务栈空间引起的,我已经加您qq了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2017-8-30 01:43:18 | 显示全部楼层

回 jobs2017 的帖子

jobs2017:这个主意到了,经过测试,感觉不是任务栈空间引起的,我已经加您qq了 (2017-08-29 09:52) 
好的,已经通过。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 15:33 , Processed in 0.306610 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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