String STM32&;gcc中的常量字符串

String STM32&;gcc中的常量字符串,string,gcc,stm32,String,Gcc,Stm32,我在使用gcc的flash中使用字符串/指向字符串的指针数组时遇到了问题。控制器为STM32F100VBT6,编译器为Atolic TrueStudio v9.0.1 当优化关闭时,一切正常,但当优化设置为-s或其他任何值时,垃圾会显示在LCD上。虽然映射文件正确地显示字符串以及字符串指针数组在“rodata”中,但我可以看到传递的字符串指针的值是错误的。 这是部分代码 #define MENU_CONFF_STR_COUNT (12) static const char

我在使用gcc的flash中使用字符串/指向字符串的指针数组时遇到了问题。控制器为STM32F100VBT6,编译器为Atolic TrueStudio v9.0.1

当优化关闭时,一切正常,但当优化设置为-s或其他任何值时,垃圾会显示在LCD上。虽然映射文件正确地显示字符串以及字符串指针数组在“rodata”中,但我可以看到传递的字符串指针的值是错误的。 这是部分代码

#define MENU_CONFF_STR_COUNT            (12)
static const char g_strMnuPrev[]         = "[ ]Previous Menu";
static const char g_strMnuConf_F_1[]    = "[ ]PWD Enable?";
static const char g_strMnuConf_F_2[]    = "[ ]System Type";
static const char g_strMnuConf_F_3[]    = "[ ]Set Yr/Mon";
static const char g_strMnuConf_F_4[]    = "[ ]Set Serial";
static const char g_strMnuConf_F_5[]    = "[ ]Set M1";
static const char g_strMnuConf_F_6[]    = "[ ]Set M2";
static const char g_strMnuConf_F_7[]    = "[ ]Set IP-FSW";
static const char g_strMnuConf_F_8[]    = "[ ]Set IP-P1";
static const char g_strMnuConf_F_9[]    = "[ ]Set IP-P2";
static const char g_strMnuConf_F_10[]   = "[ ]Set TCON";
static const char g_strMnuConf_F_11[]   = "[ ]T Calib";
static const char* const g_a_strMnuConfF_P[MENU_CONFF_STR_COUNT] = {
    g_strMnuConf_F_1, g_strMnuConf_F_2 ,g_strMnuConf_F_3,
    g_strMnuConf_F_4, g_strMnuConf_F_5,
    g_strMnuConf_F_6, g_strMnuConf_F_7, g_strMnuConf_F_8,   
    g_strMnuConf_F_9, g_strMnuConf_F_10,
    g_strMnuConf_F_11,  g_strMnuPrev
};
// some code using string using function --> void vLCD_WriteStr_P( const char* pStr_P, INT8U x, INT8U y, BOOL fill );
vLCD_WriteStr_P( (const char*)g_strMnuConf_F_10, 0, LCD_ROW_1, TRUE );
//
// some code using array of pointer to strings -> INT8U ucHandle_Menu( const char* const* mnu_array, INT8U mnu_count )
for( ;; ) {
    switch( ucHandle_Menu( &g_a_strMnuConfF_P[0], MENU_CONFF_STR_COUNT ) ) {
    //....code handling switch()
    }
}
同样的代码也可以完美地与Keil配合使用。 那么,我对gcc(Atolic Crossstudio)有什么错呢

下面是vLCD_WriteStr_p()的代码


您没有显示足够的代码。通常,这种行为是代码中未定义行为的标志,或者是违反了严格的别名规则——这可能会导致异常执行和优化。正如@P_uj_u所说,您提供的代码并不能解释您的论点。您认为是字符串被破坏,而后来您提到写入LCD。在LCD上显示数据是一项比处理字符串复杂得多的任务(通常,其中的一部分也是时间敏感的)。就个人而言,我建议研究处理LCD的函数,一直到写入寄存器或内存映射区域,这取决于LCD通信的实现方式。LCD(HD44780)初始化很好。如果关闭了gcc优化,则一切正常,包括字符串显示。优化打开后,指针指向flash中的字符串,显示混乱,而RAM中的字符串又恢复正常。您能最小化程序,使其尽可能小,同时仍显示这些症状吗?然后发布完整的源代码。
void vLCD_WriteStr_P( const char* pStr_P, INT8U x, INT8U y, BOOL fill )
{
    char ch;

    vLCD_SetXY( x, y );
    for( ;; ) {
        ch = *pStr_P++;
        if( !ch ) {
            break;
        }
        x++;                                                /* col++                                */
        vLCD_CmdData( LCD_DATA, ch );
    }

    if( fill ) {                                            /* fill rest of the row with 'blanks'   */
        while( LCD_COL_MAX > x ) {
            vLCD_CmdData( LCD_DATA, ' ' );
            x++;
        }
    }
}