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