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/MSP430FR6820:将信息存储器用于函数/数组

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/885640/ccs-msp430fr6820-using-information-memory-for-functions-arrays

器件型号:MSP430FR6820
主题中讨论的其他器件:MSP430FR6822

工具/软件:Code Composer Studio

大家好、

我们需要在项目中获得更多可用的程序存储器。 遗憾的是、我们
无法使用具有更大内存的处理器。 您是否有任何关于如何
增加程序可用内存的简单提示?

我们的想法之一是将一些功能移至信息 A/B/C/D 部分。 我
尝试过-我找到了一个小于信息块的函数。 我写道: 
#pragma CODE_SECTION (myFunction、".infoD")
void myFunction (void)
{..... 

我还在 cmd 文件中更改了此行(仅此行): 
信息 D (NoLoad):{}>信息 

为此:
infoD:{}> infod 

我可以构建程序、而不会出现任何错误/警告。 当我运行程序时、我可以在内存浏览器中看到该函数被写入 infoD 块。 但是、当程序到达函数时、MCU 将冻结。 您知道如何使其正常工作吗? 第二个选项是使用信息块来保存常量、但我需要将所有信息块合并为一个、因为我需要保存包含256个16位值的常量数组。 但我不知道如何像一个块那样使用信息内存。 您知道怎么做吗?
提前感谢您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    我们有引脚对引脚器件 MSP430FR6822、该存储器是 FR6820的两倍。 它们具有相同的封装和引脚定义。

    2.对于在 informemory 中定义的函数处挂起的代码、 您能制作非常简单的演示来向我们重现问题吗?

      您是否启用了 MPU 或 IPE 功能?

    3.要定义256个字或512个字节,由于信息仅具有512个字节的内存,您只需尝试如下定义  

         *(unsigned char *) address = 0;   

      您可以通过更改地址的值来访问所有信息存储器、以保存 512字节的数据。

    最好的地方

    Gary

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

    您好、感谢您的回复。

    1.不是因为技术问题,而是由于公司内部流程、供应商等,更换处理器并不容易。 不过、我们将尝试它。

    2.下面是 INFO 存储器部分中(不起作用)函数的一个非常简单的示例:

    #include 
    #include 
    
    #pragma CODE_SECTION (myFunction、".infoD")
    void myFunction (void){
    printf ("调用函数\n");
    }
    //**
    * main.c
    */
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    myFunction ();
    return 0;
    } 

    3.老实说,我不知道你的例子如何帮助我们或如何使用它。 如果我们使用您的示例、我们甚至需要将循环中的数据复制到信息存储器、但我们仍然需要一个源数据的存储器位置。 我还尝试了以下操作:

    #pragma LOCATION (可编程、0x1800)
    静态常量无符号短整型[256]={1、2、3..} 

    但它不可构建、它说"#10324-D 界限段".TI.bound:ating"跨越现有存储器范围 INFOD 的边界"、这意味着我的变量大于 INFOD 部分。

    添加问题:是否可以减小调试模式中使用的内存大小? 如果我们在发布模式下编译它、则代码会小约2k。 原因很清楚、但我想问是否可以减少设置等中的一些缓冲区、以便使用更小的代码、但调试速度更慢或类似的代码。

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

    您可能需要明确地使 infoD (真正的所有信息段)"X"可执行。 请参阅"Build Options->CCS General"(构建选项->MPU)。

    如果你没有尝试过优化器,你真的应该--即使是相对较低的优化也可以大大减小代码大小。 请参阅"Build Options->CCS Build->MSP430 Compiler->Optimization (构建选项-> CCS 编译器->优化)"。

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

    你(们)好  

    您可以禁用 MPU 并像这样编写代码

    #include 
    
    #pragma LOCATION (myFunction、0x1800)
    void myFunction (void){
    P1OUT^=BIT0;
    }
    /**
    * main.c
    *
    / void main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    P1DIR|=BIT0;
    PM5CTL0 &=~LOCKLPM5;
    while (1)
    {
    myFunction();
    _DELAY_CYCLES (50000);
    }
    }
    

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

    感谢大家、

    但是、您的建议都不起作用(我不知道我是必须在代码中设置 MPU、还是可以在项目设置中完成。 但现在这并不重要)让我们重点了解如何将常量数组写入信息存储器。 我认为它更简单、主要原因是我可以使用所有存储器、因为我没有任何具有精确128B 的函数、但我有一个具有精确512B 的数组。

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

    你(们)好  

    由于阵列的名称、会占用一些内存。 我想您无法在512B 存储器中定义大小为512B 的阵列。 在我看来、使用512B 存储器作为512B 大小的唯一方法是我之前提到的#3。 因为它不需要数组的名称、所以只需要定义一个变量来跟踪指针的值。

    此致

    Gary

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

    您好、Gary、

    谢谢你。 我想我对你的意思感到震惊。 您是指读取存储器、我需要定义一个指针、如下所示:  

    unsigned char * myConstantArray =(unsigned char*) 0x1800;
    //然后我可以访问信息存储器中的任何值,如
    :unsigned char temp = myConstantArray[300]; 

    正确吗?

    但问题是、我不知道如何在不使用过多代码的情况下将常量简单地写入信息存储器。 因为这样的解决方案:

    unsigned char tempArray[]={0、1、2、...};
    unsigned short i;
    
    对于(i = 0;i < 512;i++){
    myConstantArray[i]= tempArray[i];
    } 

    是无用的、因为它会消耗大量的内存。

    您是否了解解决方案?

    编辑:也许我没有很高地希望使用信息存储器来保存一个常量表值、我在编译之前知道了这些值。 我只需要在将固件"刷写"到 MCU 期间简单地写入这些值。 在运行时、我只需要读取值、我不需要重写这些值。 (CRC 加速表将保存到信息存储器中)

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

    团队、

    您能在这里帮助我们回应吗?

    谢谢你。

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

    如果要将数据(512B)存储到信息存储器中:

    1) 1)声明为:

    #pragma DATA_SECTION (myConstantArray、".infoD")
    const unsigned myConstantArray[256]={0、1、2、};

    2) 2)更改链接器.cmd 文件(lnk_msp430fr6820.cmd)以将所有四个信息段组合为一个:

    [第60行左右:]

    /*
    INFOA:origin = 0x1980,length = 0x0080
    INFOB:origin = 0x1900,length = 0x0080
    INFOC:origin = 0x1880,length = 0x0080
    INFOD:origin = 0x1800,length = 0x0080
    */
    INFOD:origin = 0x1800,length = 0x0200 

    [第186行左右:]

    /*
    .infoA (空载):{}>INFOA
    .infoB (空载):{}>INFOB
    .infoC (空载):{}>INFOC
    */
    .infoD:{}>INFOD