This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320F280025C:FREE (DATA)创建非法操作中断

Guru**** 2460850 points
Other Parts Discussed in Thread: TMS320F280025C

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/943131/compiler-tms320f280025c-free-data-creates-illegal-operation-interrupt

器件型号:TMS320F280025C

工具/软件:TI C/C++编译器

您好!

我目前正在使用 TMS320F280025C controlCARD 评估模块。  
当在以下代码中执行 free()时,我将遇到非法操作中断。

提供完整的代码供参考。


uint8_t *数据;
数据=(uint8_t *) malloc ((12*total_ic)* sizeof (uint8_t)); for (uint8_t stat_reg = 1;stat_reg< 3;stat_reg++) //为每个 LTC681x 稳压器电压寄存 器执行一次{ DATA_COUNTER = 0; rdstat_reg (stat_reg、total_ic、data); //将原始状态寄存器数据读取到数据[]数组 中(uint8_t CURRENT_IC = 0;CURRENT_IC < TOTAL_IC;CURRENT_IC++) //针对菊花链中的每个 LTC681x 执行 {//如果 (IC->isospi_reverse =false) { c_ic = curry_ic; } 否则 { c_ic = total_ic - curry_ic - 1; } 如果(stat_reg =1) { for (uint8_t stat_inc = curry_stat<0;}if (stat_reg==1); CURRENT_STAT++)//此循环解析状态寄存器中的读回数据, {//它针对寄存器 中的3个 stat 代码中的每个代码循环一次,已解析的 stat_stat = DATA[DATA_COUNTER]+(DATA[DATA_COUNTER+1]<<8); //每个 stat 代码以两个字节的形式接收,并组合在一起以创建解析的状态代码 ic[c_ic].stat.stat_codes[curry_stat]=已解析的 stat; data_counter=data_counter+2; //因为 stat 代码是数据计数 器}的两个字节 ,否则(stat_reg =2) { 已解析的 stat = data[data_counter]+(data[data_counter+1]<<8); //每个 stat 作为两个字节接收,并被组合在一起以创建解析的状态代码 data_counter = data_counter +2; ic[c_ic].stat.stat_codes[3]=已解析的 stat; ic[c_ic].stat.flags[0]= data[data_counter++];ic[c_ic].flags[3]= data_counter+[data_counter.ic].ic+[DATA+].counter.counter.ic]=[DATA+[DATA_counter.counter+]=[DATA+].counter.counter.counter.[IC]=DATA ic[c_ic].stat.mux_fail[0]=(data[data_counter]& 0x02)>1; ic[c_ic].stat.thsd[0]= data[data_counter++]& 0x01; } received_pec =(data[data_counter][<8)+ data[data_counter+1]; //Current_IC 接收到的 PEC 作为第7个和第8个发送 //在6个状态数据字节 DATA_PEC = pec15_calc (BYT_IN_REG、&DATA[CURRENT_IC*NUM_RX_BYT])之后; IF (Received_PEC!= DATA_PEC) { PEC 错误=-1; //pec_error 变量仅设置为负、前提是有 PEC 错误 ic[c_ic].stat.pec_match[stat_reg-1]=1;//在接收到的串行数据 中检测到这些错误} 否则 { ic[c_ic].stat.pec_match[stat_reg-1]=0; } data_counter=data_counter+2; //由于传输的 PEC 代码长度为2个字节,因此 DATA_COUNTER //必须递增2个字节,以指向下一个 IC 状态数据 } FREE (DATA);

我尝试使用以下代码来检查每次是否都会出现此问题;就在之前代码中的 malloc 的上方。

数据=(uint8_t *) malloc ((12));
数据[0]= 5;
FREE (DATA); 

但该代码有效、未观察到错误。

此外、变量数据永远不变。 即使在提到的函数调用中也只能作为指针进行访问。

您能否帮助了解此代码可能出错的地方? 或者我需要做什么才能使其正常工作、以及原因。

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Gaurav、

    您应该将数据初始化为 NULL、然后在 malloc 之后、您应该检查数据是否为 NULL。  

    如果 malloc 失败、数据为 NULL、并且您正在尝试释放、则可能会导致错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非法操作中断的一个常见来源是堆栈溢出。 您可能还想尝试寻找这种情况的迹象。 您可以尝试使用 CCS 存储器浏览器"Fill Memory"工具以图案填充堆栈、并查看运行时是否会擦除该图形。

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    很抱歉耽误你的回答。 我按照建议检查了堆栈。 并发现由某些其他函数引起的溢出。
    感谢你的帮助。