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.

[参考译文] CCS/EK-TM4C123GXL:CCS v6不断触发硬故障、我可以#39;t 进行诊断。 有人能帮我吗?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/616349/ccs-ek-tm4c123gxl-ccs-v6-keeps-triggering-a-hard-fault-that-i-can-t-diagnose-can-someone-please-help-me-out

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123

工具/软件:Code Composer Studio

大家好、这让我感到非常疯狂。  

我正在编写一个 API、除了一个函数外、该 API 几乎已经完全完成。 这一个函数持续触发硬故障

NVIC_FAULT_STAT = 0x00009200

NVIC_FAULT_ADDR = 0x1FFFFFF4

我已经查看了 TI 的故障诊断 PDF、但我仍然无法解决我的问题。 我真的很感谢在这方面提供的任何帮助、因为我很困在这里。  

这是有问题的函数。 对于整数而言、似乎可以正常工作、但小数点值会使其变得很难实现。 它需要是转换字符串内部的东西来进行浮点。  

clearArray (user_input、100);
getString (user_input);

if (!strncmp (user_input、"setFrequency"、 12)){

char out[20]、intMode[3];
int out_factor、intModeDecision;
double out_freq、 结果;
unsigned short nINT;
unsigned long nFRAC、nMOD;

clearArray (out、 20);
clearArray (intMode、3);
printString (new_line);
printString (new_line);
printString ("输入所需的输出频率:");
getString (out);
printString (new_line);
printString (new_line);
printString ("整数模式? (整数为\"y\"、小数为\"n\"):");
getString (intMode);
intModeDecision = ConvertStringToBool (intMode);
output_freq = ConvertStringToFrequency (out、&out_FACTOR);
结果= GenerateFreq-Ratio (output_freq、out_factor、InternalReferenceValue、internalRefFactor);
DetermineFeedbackValues (结果、 intModeDecision、&nINT、&nFRAC、&nMOD);
SetFeedbackControlValues (nINT、 nFRAC、nMOD);
printString (new_line);
printString (new_line);
printString ("Frequency has been set.");
printString (new_line);
printString (new_line);
printString ("Enter command:");
} 

double ConvertStringToFrequency (char* string、int*因子){

//频率范围通常为 GHz、因此我希望避免使用大数字、因为它们容易出现舍入错误

char 值[20]、unit[20];
char* value_ptr = value;
char* unit_ptr = unit;
int i;

for (i = 0;i < 20;); i++){
Value[i]='\0';
unit[i]='\0';
}//

将数字部分复制到单独的数组中(58是 ASCII 表中数字的限制)
,而(*字符串<58){
*值_ptr =*字符串++;
value_ptR++;
}


while (*字符串!= enter){**值+

=单元


double value_flt = ConvertStringToFloat (value);

if (!strncmp (unit、"GHz"、3)){
*因数= 9;// 10^9 power
}
否则(!strncmp (unit、"MHz"、3)){
*因数= 6;// 10^6 power
}
否则(!strmp (unit、"3kHz
)、*因数= 3) // 10^3 power
}
否则,如果(!strncmp (unit、"Hz"、3)){
*因数= 0;// 10^0 power
}

返回 value_flt;
} 

double ConvertStringToFloat (char* string){

char integerPart[20]、thapalPart[21];
char* int_ptr = intgerPart;
char* dec _ptr =抽取器件;
char* decimal_check =字符串;
int i、flag = 0、decime_flag = 0、mult = 0;
unsigned long integer 部分、decimal_part;
double divider = 1、result;
double intPart、decPart;

//清除
(i = 0;i < 20;i++){integerPart[i]='\0';}
for (i = 0;i < 21;i++){intualPart[i]='\0';}

//检查十进制
,同时(*十进制检查!='\0'){

如果(*十进制检查++='.') { decimed_flag = 1;}


if (decimal_flag){

//将整数部分复制到工作区
while (* string!='.') {
* int_ptr =* string++;
int_ptr++;
}

//将十进制部分复制到工作区
,同时(* string!='\0'){

if (flag = 0){
string++;
flag = 1;
}
否则{
*十进制_dptr =*字符串++;
dec = integr+
;mult+;
}


整数


部分= integrand_decrand_dec (十进制部分);integrand_decom_conominPart
= integrand_decom_integrand_decominPart =(十进制部分)(十进制部分)

对于(i = 0;i < mult;i++){divider *= 10;}

decPart /= divider;

result = intPart + decPart;
}

否则{

//复制整数部分(无小数位)
while (* string!='\0'){
*int_ptr =* string++;
int_ptr++;
}

int_part = integrPart
(int_integrPart = integrand&int&int&int&integr&int&int&int&int&int&int&int&int&trl)

结果= intPart;
}

返回结果;
} 

unsigned long ConvertStringToNumber (char* string){

//此函数可正确转换>unsigned<< long 整数的所有合法值:0D - 4、294、967、295d

//数字字符串必须采用十进制格式,此函数不能接受十六进制值

int i、digit、curry_power =-1;
unsigned long 值= 0;
pt* temp_char;

temp_ptr = string;

while (* temp_ptp++!='\0'){CURRENT_POWER++;}

while (* string!='\0'){

unsigned long 乘法器= 1;

for (i = CURRENT_POWER--;i > 0;i-){乘法器*= 10;}

switch (* string++){

case '0'
= 1



;数字 break:1:1:
案例"2":
数字= 2;
中断;
案例"3":
数字= 3;
中断;
案例"4":
数字= 4;
中断;
案例"5":
数字= 5;
中断;
案例"6":
数字= 6;
中断;
案例"7":
数字= 7;
中断;
案例"8":
数字= 8;
中断;
案例"9":
数字

= 9;中断}

值+=数字*乘法器
;}

返回值;
} 

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

    太匆忙了、无法读取和评估整个代码、但您要将小于1的浮点值转换为 INT?

    否则、您能否使用人工已知值测试函数并缩小错误发生的条件?

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、您是否已在 PC 上进行了测试(如果您尚未设置 TDD、googletest 非常适合此操作)? 这是您应该做的第一件事。

    第二、您是否检查了编译器以查看是否需要启用任何功能来正确编译浮点(或正确链接)?

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请尝试增大堆栈大小、看看是否会有所不同。 从故障地址(RAM 区域下面的一个非法地址、起始地址为0x20000000)可以看出、您已经溢出了堆栈。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ***喜欢***对 Charles -肯定是一种声音诊断。
    ***喜欢***对 Robert -很棒,一般,诊断策略- merci! (请注意、我有两次骨折-现在注定要前往哈利法克斯...)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嘿、Charles、

    您知道如何增加堆栈大小吗? 在项目设置或 STARTUP_CSS 文件中的任何位置都找不到它
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在上一个答复中从未想过、我选择的是 main.c、而不是整个项目。 我找到堆栈并将其加倍。 它似乎起了作用。 非常感谢!!!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Bruno!

    我不小心选择了 main.c 文件、而不是整个项目、因此没有为我显示链接器部分。 我现在看到屏幕截图中的内容、谢谢!!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Mason08、
    很高兴您的问题得到解决。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不用担心。 我相信每个人都会遇到这种情况!

    如果您的 RAM 不是很低、请不要介意保存它。 在我们开始 main.c 之前、这里的 TM4C129项目具有4KB 栈、而 TM4C123具有2KB 栈。 回到过去、"缓慢增加堆栈"会再次引发另一个绝对神秘的问题、稍后会有一些功能...

    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是迄今为止我编写过的最大程序、因此堆栈对我来说从未有过问题。 这是很好的信息、可供将来参考。 为了安全起见、我将堆栈设置为2KB。 再次感谢!

    Mason