硬汉嵌入式论坛

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

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

[复制链接]

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-3-5 11:09:05 | 显示全部楼层 |阅读模式
我用cubemx生成的代码,分别生成了两个ide的环境,但是keil能正常运行,iar调试就进入:                /* Check the block is actually allocated. */
                configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
                configASSERT( pxLink->pxNextFreeBlock == NULL );

很奇怪。
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-5 11:12:17 | 显示全部楼层
我在调度任务之前,先创建startup任务,在里面创建5个任务,然后删除自己。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-3-5 11:37:32 | 显示全部楼层
仅创建1个启动任务测试下。
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-5 11:44:59 | 显示全部楼层
eric2013 发表于 2020-3-5 11:37
仅创建1个启动任务测试下。

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

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-5 13:35:02 | 显示全部楼层
我不用删除任务的方法,可以运行了,看来iar这个是bug啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-3-6 01:20:03 | 显示全部楼层
wdliming 发表于 2020-3-5 13:35
我不用删除任务的方法,可以运行了,看来iar这个是bug啊

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

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-6 08:00:08 | 显示全部楼层
eric2013 发表于 2020-3-6 01:20
大概率是你的程序还有点问题。

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

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-6 08:01:22 | 显示全部楼层
如果有问题,那keil不能运行啊,但是keil可以运行啊,我认为是编译器两者堆的分配有区别。
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-6 08:58:43 | 显示全部楼层
微信图片_202003060851352.png 微信图片_202003060851351.png 微信图片_20200306085135.png
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 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 */
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 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 */
}
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 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[9] = {0};
        ADS1259_Read_Reg_Enable();
        for (i = 0; i < 9; i++)
        {
            ADS1259_REG[i] = 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[i]);
        }
#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 */
}
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-6 09:04:58 | 显示全部楼层
主要的代码就是这些,我都是参考了stm32官网的freertos的教程的,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2020-3-6 11:34:52 | 显示全部楼层
wdliming 发表于 2020-3-6 08:01
如果有问题,那keil不能运行啊,但是keil可以运行啊,我认为是编译器两者堆的分配有区别。

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

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

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

嗯嗯,好的
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
 楼主| 发表于 2020-3-6 13:42:48 | 显示全部楼层
说实话, 我就是不会segger的ide,否则也想试试看。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 14:11 , Processed in 0.413253 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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