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.

[参考译文] TM4C123GH6PM:将字符串数组大小增加到超过20个元素会导致程序挂起,暂停调试器后会产生硬故障

Guru**** 2810285 points

Other Parts Discussed in Thread: EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103316/tm4c123gh6pm-increasing-string-array-size-above-20-elements-causes-program-to-hang-and-after-pausing-the-debugger-creates-hard-fault

部件号:TM4C123GH6PM
主题中讨论的其他部件:EK-TM4C123GXL

平台:EK-TM4C123GXL

IAR嵌入式工作台32KB限制版本,v.IAR 9.20 .4.4.7112万

IAR嵌入式工作平台共享组件v.IAR 9.0。11.9006

使用(TivaWare_C_Series-I2C.LED)中的计时器示例作为程序的基础,添加了用于液晶显示屏的2.2 , 删除了计时器和0.295 ,编写了扫描8x10按键阵列的例程(见下文)

void InitKBScanner()

UARTprintf("\033[2JKBScannerf正在初始化...\n");


//正在初始化引脚组
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOB);
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOC);
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOD);
MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOE);

//配置扫描PIN
MAP_GPIOPinTypeGPIOOutput (GPIO _PORTD_BASE,GPIO PIN_0 | GPIO PIN_1 | GPIO PIN_2 |GPIO PIN_3);//MATC,1,2和3
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE,GPIO PIN_4 | GPIO PIN_5| GPIO PIN_6| GPIO PIN_7);//MATC4,5,6和7

//配置扫描器读取引脚
MAP_GPIOPinTypeGPIOInput (GPIO _PORT_BASE,GPIO PIN _0 | GPIO _PIN_1| GPIO _PIN_2| GPIO PIN _3| GPIO _PIN_4| GPIO _PIN_5);//MATL0-5
MAP_GPIOPinTypeGPIOInput (GPIO_PORTC_BASE,GPIO PIN_4 | GPIO PIN_5| GPIO PIN_6| GPIO PIN_7);//MATL6-9

//将所有扫描针脚调低
GPIOPinWrite (GPIO _PORTD_BASE,GPIO PIN_0 | GPIO PIN_1 |GPIO PIN_2 |GPIO PIN_3,0);
GPIOPinWrite (GPIO _PORTB_BASE,GPIO PIN_4 | GPIO PIN_5 | GPIO PIN_6 | GPIO PIN_7,0);
}

如果CHAR* KB_MAP[]包含的元素不超过20个,则代码编译和工作正常,最大的元素是9个字符串。

我将数组拆分为8个独立的数组x10个元素,并实现了数据显示(见下文)

CHAR* KB_MAP_MATC0[10]=

"1","2","3","K","L", "M","N","O","空白","CLR"
};
CHAR* KB_MAP_MATC1[10]=

"4","5","6","P","Q", "R","S","T","BRT","左"
};
CHAR* KB_MAP_MATC2[10]=

"7","8","9","U","V", "W","X","Y","DIM,"右"
};等等

//数据显示:

void displayLabel (CHAR* LBL)

UARTprintf (LBL);
SetCursorPos(11,3);
WriteString (LBL);

}

//使用数据显示扫描矩阵的一列的示例

GPIOPinWrite (GPIO _PORTD_BASE,GPIO PIN,0,1);
keycode=KeyDetectf();
IF (密钥代码)

DisplayLabel (KB_MAP_MATC0 [(keycode-1)]);
keycode=0;
SystlDelay(5万);

}

GPIOPinWrite (GPIO _PORTD_BASE,GPIO PIN,0);

//keyDetecf 检测高输入并返回激活键的行号

UINT8_t KeyDetectf()

UINT8_t MATL=0;//返回活动MATLx行值
//UARTprintf(" KeyDetectf调用...\n");
// SysType.Delay(500万);
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_0))
matl=1;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO PIN_1))
matl=2;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO PIN_2))
matl=3;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_3))
matl=4;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_4))
matl=5;
IF (GPIOPinRead (GPIO _PORT_BASE,GPIO _PIN_5))
MTL=6;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_4))
MTL=7;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_5))
MTL=8;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_6))
matl=9;
IF (GPIOPinRead (GPIO _PORTC_BASE,GPIO PIN_7))
matl=10;
退回MATL;
}

只有当八列 扫描中的任意两个使用"displayLabel(KB _map_MATCx[(keycode-1)]"时,代码才会很好地执行;

添加第三个任意列调用 "displayLabel(KB _map_MATCx[(keycode-1)]";进行编译时没有错误或警告,但调试和执行挂起 ,停止调试程序时会导致硬错误:

"2022年5月20日星期五14:31:31:HardFault异常。
2022年5月20日星期五14:31:31:处理器已将可配置优先级例外升级到HardFault。
2022年5月20日星期五14:31:31:
2022年5月20日星期五14:31:31:发生了精确的数据访问错误(CFSR.PRECISERR, BFAR)
2022年5月20日星期五14:31:31:数据地址0x1ffffffff0。
2022年5月20日星期五14:31:31:
2022年5月20日(星期五) 14:31:31:异常条目上发生派生总线故障(CFSR.STKERR,BFAR)
2022年5月20日星期五14:31:31:数据地址0x1ffffffff0。
2022年5月20日星期五14:31:31:
2022年5月20日星期五14:31:31:无法确定发生异常的位置。
2022年5月20日星期五14:31:31:
2022年5月20日星期五14:31:31:有关详细信息,请参阅调用栈。”

调用栈显示:

"故障ISR()

  例外帧>"

我们非常感谢您提供任何帮助。  

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

    您好Andrei,

    您设置的堆栈大小是多少? 我在这里的第一个直觉是堆栈溢出。 您是否测试过这不是根本原因?

    此致,

    Ralph Jacobi

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

    拉尔夫  

    非常感谢您的迅速响应。

    堆栈大小是由示例源代码设置的,我尚未触及它。

    $PROJ_DIR$\TIMERS.ICF:

    "

    //
    //定义包含的整个4 GB 寻址空间的内存区域
    //处理器。
    //
    使用大小= 4G定义内存内存;

    //
    //定义片上闪存的区域。
    //
    define region flash = mem:[从0x0万到0x0003ff];

    //
    //定义片上SRAM的区域。
    //
    定义区域SRAM = mem:[从0x2000万到0x2.0007万fff];

    //
    //为堆定义块。 大小应设置为其它值
    //如果使用C库中需要堆的内容,则为零。
    //
    定义块堆,使对齐=8,大小= 0x0万 {};

    "

    请提供建议

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

    您好Andrei,

    我对IAR的设置不是很熟悉,但从我所见,您可以在start_ewarm.c文件中编辑堆栈大小。 查找如下所示的行:

    //*****************************************************************************
    //
    // Reserve space for the system stack.
    //
    //*****************************************************************************
    static uint32_t pui32Stack[64] @ ".noinit";

    我建议尝试使用512字节作为初始堆栈大小。

    此致,

    Ralph Jacobi

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

    就是这样。 我是这个可怕的IAR丛林中的一个温室,非常感谢您的专业知识和指导。

    谢谢您先生。

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

    您好,Andrei,

    很高兴,成功了! 虽然我在个人问责制(IAR)方面的经验比你们多得多。

    如果您有此选项,则可能需要考虑将Code Composer Studio用于IDE。 它不需要许可证,我们的TM4C团队也将更有能力帮助您解决问题(此外,我们还有一个完整的CCS支持团队)。

    此致,

    Ralph Jacobi