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.

[参考译文] MSP430F2619:如何使阵列在闪存区域中占用的空间大于RAM

Guru**** 2585275 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/617578/msp430f2619-how-to-make-array-occupy-in-flash-region-than-ram

部件号:MSP430F2619

下面的代码是占用RAM的有效解决方案,但是,当我尝试使用pragma将其移动到闪存时,该值不正确(即读取0xFFFFFFFF)

 我可以采取什么进一步的步骤来强制数组变量驻留在闪存中?

结构EDS_List //需要放在myFunctionCallSwitch
{
char* sTERMCommand;
void (*funcRoutine)(void);
};//===================================================================================================================================================================================================================================================================================================================================================================================================

所有工具的ESD/OD特定
//#pragma location=0x2100 //将下面的内容推入闪存域以释放RAM空间。 无需使用const.
struct EDS_List ODLList_Generic []= //需要放在myFunctionCallSwitch
{
{"logger _$H", zVOID }
{"logger _$D", zVOID }
{"logger", zVOID }
{"logger_on", EEPROM_ON }
{"logger_off", eeprom_off } 

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

    [QUOTE USER="Richard Payne">我 还可以采取什么措施来强制数组变量驻留在FLASH中?如果您将ODILORT_Generic 变量和sTERMCommand声明 为const,则应将该变量置于.const部分的FLASH中。 例如,使用:

    结构EDS_List //需要放在myFunctionCallSwitch
    {
    const char* sTERMCommand;
    void (*funcRoutine)(void);
    };//===================================================================================================================================================================================================================================================================================================================================================================================================
    
    所有工具
    的ESD/OD特定于结构EDS_List ODList_Generic []= //需要放在myFunctionCallSwitch
    {
    {"logger _$H", zVOID }
    {"logger _$D", zVOID }
    {"logger", zVOID }
    {"logger_on", EEPROM_ON }
    {"logger_off", eeprom_off } 

    这是假设您使用的是标准链接程序命令文件,该文件在闪存中分配.const部分。

    编辑:将 sTERMCommand声明为指向const字符串的指针。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    他们在闪存域中,但现在我得到了这个警告......

    "../4_Debug/CmdTerm.c",第120行:警告#515-D:无法将类型为"const struct EDS_List *"的值分配给类型为"struct EDS_List *"的实体
    "../4_Debug/CmdTerm.c",第122行:警告#169-D:类型"const char *"的参数与类型"char *"的参数不兼容

    struct EDS_List* pCaseMCP;
    //---------------- 通用工具命令处理器
    for (pCaseMCP = ODList_Generic;pCaseMCP != ODList_Generic + sizeof( ODList_Generic )/ sizeof( ODList_Generic[0]);pCaseMCP++)

    if( 0 == Cstrcmp(pCaseMCP->sTERMCommand), cTermCommand ))

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

    Richard Payne 说:
    They in flash domains but now I get this warning.....[/QUOT]编译器正确地警告代码正在丢弃闪存中存储的数据的const限定符。

    Richard Payne 说:
    "./4_Debug/CmdTerm.c",第120行:警告#515-D:类型为"const struct EDS_List *"的值无法分配给类型为"struct EDS_List *"

    的实体,您应该可以通过将 pCaseMCP声明为指向const结构的指针来删除该警告:

    const struct EDS_List* pCaseMCP; 

    Richard Payne 说:
    "./4_Debug/CmdTerm.c",第122行:警告#169-D:类型"const char *"的参数与类型"char *"

    的参数不兼容。我想警告是因为 Cstrcmp函数的第一个参数是类型char *。 怀疑 Cstrcmp函数以不区分大小写的方式比较两个相等的字符串。 在这种情况下,可以将 Cstrcmp的两个参数更改为const char* 以删除警告。