iar调试freertos死机,但是keil能正常运行,为何?
我用cubemx生成的代码,分别生成了两个ide的环境,但是keil能正常运行,iar调试就进入: /* Check the block is actually allocated. */configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 );
configASSERT( pxLink->pxNextFreeBlock == NULL );
很奇怪。
我在调度任务之前,先创建startup任务,在里面创建5个任务,然后删除自己。 仅创建1个启动任务测试下。 eric2013 发表于 2020-3-5 11:37
仅创建1个启动任务测试下。
我试着把删除语句注释掉看看,有可能编译器的问题,因为keil都是可以的 我不用删除任务的方法,可以运行了,看来iar这个是bug啊 wdliming 发表于 2020-3-5 13:35
我不用删除任务的方法,可以运行了,看来iar这个是bug啊
大概率是你的程序还有点问题。 eric2013 发表于 2020-3-6 01:20
大概率是你的程序还有点问题。
那我稍后把程序截图你看看 如果有问题,那keil不能运行啊,但是keil可以运行啊,我认为是编译器两者堆的分配有区别。
/* 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 */ 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 */
}
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 */
}
主要的代码就是这些,我都是参考了stm32官网的freertos的教程的, wdliming 发表于 2020-3-6 08:01
如果有问题,那keil不能运行啊,但是keil可以运行啊,我认为是编译器两者堆的分配有区别。
这种现象很正常,我们现在做例子大部分是MDK和IAR两个版本,遇到过几次1个版本能用,另一个不能用的情况。 eric2013 发表于 2020-3-6 11:34
这种现象很正常,我们现在做例子大部分是MDK和IAR两个版本,遇到过几次1个版本能用,另一个不能用的情况 ...
嗯嗯,好的 说实话, 我就是不会segger的ide,否则也想试试看。
页:
[1]