wdliming 发表于 2020-3-5 11:09:05

iar调试freertos死机,但是keil能正常运行,为何?

我用cubemx生成的代码,分别生成了两个ide的环境,但是keil能正常运行,iar调试就进入:                /* Check the block is actually allocated. */
                configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
                configASSERT( pxLink->pxNextFreeBlock == NULL );

很奇怪。

wdliming 发表于 2020-3-5 11:12:17

我在调度任务之前,先创建startup任务,在里面创建5个任务,然后删除自己。

eric2013 发表于 2020-3-5 11:37:32

仅创建1个启动任务测试下。

wdliming 发表于 2020-3-5 11:44:59

eric2013 发表于 2020-3-5 11:37
仅创建1个启动任务测试下。

我试着把删除语句注释掉看看,有可能编译器的问题,因为keil都是可以的

wdliming 发表于 2020-3-5 13:35:02

我不用删除任务的方法,可以运行了,看来iar这个是bug啊

eric2013 发表于 2020-3-6 01:20:03

wdliming 发表于 2020-3-5 13:35
我不用删除任务的方法,可以运行了,看来iar这个是bug啊

大概率是你的程序还有点问题。

wdliming 发表于 2020-3-6 08:00:08

eric2013 发表于 2020-3-6 01:20
大概率是你的程序还有点问题。

那我稍后把程序截图你看看

wdliming 发表于 2020-3-6 08:01:22

如果有问题,那keil不能运行啊,但是keil可以运行啊,我认为是编译器两者堆的分配有区别。

wdliming 发表于 2020-3-6 08:58:43


wdliming 发表于 2020-3-6 08:59:16

   /* Initialize interrupts */
    MX_NVIC_Init();
    /* USER CODE BEGIN 2 */
    Start_Feed_WDI();   //看门狗需要提前

    /* USER CODE END 2 */

    /* Call init function for freertos objects (in freertos.c) */
    MX_FREERTOS_Init();

    /* Start scheduler */
    osKernelStart();

    /* We should never get here as control is now taken by the scheduler */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */

wdliming 发表于 2020-3-6 09:03:10

void MX_FREERTOS_Init(void)
{
    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* USER CODE BEGIN RTOS_MUTEX */
    /* add mutexes, ... */
    /* USER CODE END RTOS_MUTEX */

    /* USER CODE BEGIN RTOS_SEMAPHORES */
    /* add semaphores, ... */
    BinarySem_HandleUART = xSemaphoreCreateBinary();
    if (BinarySem_HandleUART == NULL)
    {
      return;
    }
    assert_param(BinarySem_HandleUART != NULL);


    //    BinarySem_HandleTCPQuery = xSemaphoreCreateBinary();
    //    assert_param(BinarySem_HandleTCPQuery != NULL);

    //    BinarySem_HandleTCPCFG = xSemaphoreCreateBinary();
    //    assert_param(BinarySem_HandleTCPCFG != NULL);
    /* USER CODE END RTOS_SEMAPHORES */

    /* USER CODE BEGIN RTOS_TIMERS */
    /* start timers, add new ones, ... */

    /* USER CODE END RTOS_TIMERS */

    /* Create the thread(s) */

    /* definition and creation of nStartUpTask */
    osThreadDef(nStartUpTask, fStartUpTask, osPriorityNormal, 0, 128);
    nStartUpTaskHandle = osThreadCreate(osThread(nStartUpTask), NULL);


    /* USER CODE BEGIN RTOS_THREADS */
    /* add threads, ... */
    /* USER CODE END RTOS_THREADS */

    /* USER CODE BEGIN RTOS_QUEUES */
    /* add queues, ... */

    /* USER CODE END RTOS_QUEUES */
}

wdliming 发表于 2020-3-6 09:04:07

void fStartUpTask(void const *argument)
{
    /* USER CODE BEGIN fStartUpTask */
    //#define RREG_TEST
#ifdef RREG_TEST
    uint8_t i = 0;
#endif

    /* Infinite loop */
    //for (;;)
    {
      BSP_Init();   //硬件初始化

      _MSG_DBG("net init...\r\n");

      global_para_init(); //系统全局参数初始化

      IT8900_Para_init(); //w5500参数初始化
      W5500_Para_init();

      w5500_init();       //w5500初始化

      show_ip();

      //Set_Voltage_Vout(0, 2000);      //将163的dac输出,用于测试空气通道

      //之后才开始创建其他任务

      //以下代码用于ads1259芯片通信正常与否
#ifdef RREG_TEST
      uint8_t ADS1259_REG = {0};
      ADS1259_Read_Reg_Enable();
      for (i = 0; i < 9; i++)
      {
            ADS1259_REG = ADS1259_READ_REG();
      }

      _MSG_DBG("\r\n");
      for (i = 0; i < 9; i++)
      {
            _MSG_DBG("ADS1259_REG[%d] = 0x%x\r\n", i, ADS1259_REG);
      }
#endif

#if 1
      /* definition and creation of nledTask */
      //01
      osThreadDef(nCurretFlowTask, fCurretFlowTask, osPriorityNormal, 0, 128);
      nCurretFlowTaskHandle = osThreadCreate(osThread(nCurretFlowTask), NULL);


      //02
      /* definition and creation of ncomTask */
      osThreadDef(ncomTask, fcomTask, osPriorityNormal, 0, 128);
      ncomTaskHandle = osThreadCreate(osThread(ncomTask), NULL);

      //03
      /* definition and creation of nacqTask */
      osThreadDef(nacqTask, facqTask, osPriorityNormal, 0, 128);
      nacqTaskHandle = osThreadCreate(osThread(nacqTask), NULL);

      //04
      /* definition and creation of ntcpTask */
      osThreadDef(ntcpTask, ftcpTask, osPriorityNormal, 0, 128);
      ntcpTaskHandle = osThreadCreate(osThread(ntcpTask), NULL);


      //05
      /* definition and creation of ntcpcomTask */
      osThreadDef(ntcpcomTask, ftcpcomTask, osPriorityNormal, 0, 256);
      ntcpcomTaskHandle = osThreadCreate(osThread(ntcpcomTask), NULL);

      //06
      /* definition and creation of ntcpcfgTsak */
      osThreadDef(ntcpcfgTsak, ftcpcfgTask, osPriorityNormal, 0, 320);
      ntcpcfgTsakHandle = osThreadCreate(osThread(ntcpcfgTsak), NULL);

      //07
      /* definition and creation of neloadTask */
      osThreadDef(neloadTask, feloadOnOffTsak, osPriorityNormal, 0, 128);
      neloadTaskHandle = osThreadCreate(osThread(neloadTask), NULL);

      //08
      /* definition and creation of ndynamicTask */
      osThreadDef(ndynamicTask, fdynamicTask, osPriorityNormal, 0, 128);
      ndynamicTaskHandle = osThreadCreate(osThread(ndynamicTask), NULL);

      //09
      /* definition and creation of nonoffTask */
      osThreadDef(nonoffTask, fOnOffqueryTask, osPriorityNormal, 0, 128);
      nonoffTaskHandle = osThreadCreate(osThread(nonoffTask), NULL);


      //10
      /* definition and creation of myTask11 */
      osThreadDef(myTask11, AppTask, osPriorityNormal, 0, 128);
      myTask11Handle = osThreadCreate(osThread(myTask11), NULL);

      //11
      /* definition and creation of myTask12 */
      osThreadDef(myTask12, PowerOnoffTask, osPriorityNormal, 0, 128);
      myTask12Handle = osThreadCreate(osThread(myTask12), NULL);
#endif
      //删除自己
      osThreadTerminate(nStartUpTaskHandle);
    }
    /* USER CODE END fStartUpTask */
}

wdliming 发表于 2020-3-6 09:04:58

主要的代码就是这些,我都是参考了stm32官网的freertos的教程的,

eric2013 发表于 2020-3-6 11:34:52

wdliming 发表于 2020-3-6 08:01
如果有问题,那keil不能运行啊,但是keil可以运行啊,我认为是编译器两者堆的分配有区别。

这种现象很正常,我们现在做例子大部分是MDK和IAR两个版本,遇到过几次1个版本能用,另一个不能用的情况。

wdliming 发表于 2020-3-6 13:38:42

eric2013 发表于 2020-3-6 11:34
这种现象很正常,我们现在做例子大部分是MDK和IAR两个版本,遇到过几次1个版本能用,另一个不能用的情况 ...

嗯嗯,好的

wdliming 发表于 2020-3-6 13:42:48

说实话, 我就是不会segger的ide,否则也想试试看。
页: [1]
查看完整版本: iar调试freertos死机,但是keil能正常运行,为何?