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.

[参考译文] 编译器:在运行时知道我们自己的闪存代码大小?

Guru**** 2573695 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/596511/compiler-knowing-in-runtime-our-own-flash-code-size

工具/软件:TI C/C++编译器

您好,

我正在处理controlCARD F2837xD。

要准备未来的Bootlader,我需要在代码中包含自身在闪存中的总大小的constante

在我的情况下,闪存包含许多部分:

codegstart:> begin,page =0
.text:> flash,page =0,align(4)
.cinit:>闪存,页=0,对齐(4)
binit:> flash,page =0,align(4)
.Pinit:>闪烁,页= 0,对齐(4)
 
 ...
 
/*初始化部分进入Flash */
econst:> flash,page =0,align(4)
.switch:> flash,page = 0,align(4)

.reset:> reset,page =0,type = DSECT /* not used,*/

因此,代码应该能够在外部SPI或闪存中复制自身。 然后,我需要知道要从闪存部分开始复制的数据大小。

第一个解决方案是复制所有闪存,但这不是最佳的。 我真的很想只复制n ü µC Flash中实际存在的数据数量。

如何知道这种尺寸?

谢谢

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

    不幸的是,这种情况没有明确的解决办法。  请查看 本主题中讨论的解决方案 是否有帮助。

    谢谢,此致,

    -George

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

    你好

    我读了不同的主题,我做了以下的工作:

    在链接器文件中,我为位于闪存中的所有部分定义开始,结束和大小如下:(假定部分“开始”位于0x8万长度=2,部分“闪存”以0x8.0002万....开始

    /*分配方案领域:*/
    codesstart :>开始, Page =0,start(_Link_FlashCodeStartStart),size(_Link_FlashCodeStartSize),End(_Link_FlashCodeStartEnd)
    .Text :>闪烁, Page =0,start(_Link_FlashTextStart), 大小(_Link_FlashTextSize), End (_Link_FlashTextEnd), 对齐(4)
    .cinit :>闪烁, Page =0,start(_Link_FlashCInitStart), 大小(_Link_FlashCInitSize), End (_Link_FlashCInitEnd), 对齐(4)
    .binit :>闪烁, Page =0,start(_Link_FlashBInitStart), 大小(_Link_FlashBInitSize), End (_Link_FlashBInitEnd), 对齐(4)
    。将其定位 :>闪烁, Page =0,start(_Link_FlashPInitStart), 大小(_Link_FlashPInitSize), End (_Link_FlashPInitEnd), Align (4)
    
    /*初始化部分进入Flash *。
    econst :>闪烁, Page =0,start(_Link_FlashEConstStart),Size (_Link_FlashEConstSize),End(_Link_FlashEConstEnd), 对齐(4)
    开关 :>闪烁, Page =0,start(_Link_FlashSwitchStart),Size (_Link_FlashSwitchSize),End(_Link_FlashSwitchEnd), Align (4)
    
    .reset :>重置, 页=0,类型= DSECT /*未使用,*/
    
    .TI.ramfunc :{} load = flash, run = RAMLS_D, table(BINIT),page =0,load_start(_Link_FlashRamFuncStart), load_size (_Link_FlashRamFuncSize),load_end (_Link_FlashRamFuncEnd),align(4)
    
    

    然后在链接程序文件的末尾

    _Link_FlashTotalStart =_Link_FlashCodeStartStart;
    _Link_FlashTotalSize =_Link_FlashCodeStartSize +_Link_FlashTextSize +_Link_FlashCInitSize +_Link_FlashBInitSize +_Link_FlashPInitSize +_Link_FlashEConstSize +_Link_FlashSwitchSize +_Link_FlashRamFuncSize; 

    在c代码文件中:

    外部UINT32_t Link_FlashTotalStart; /*闪存中代码的起始地址,由链接程序文件*/
    extern UINT32_t定义 Link_FlashTotalSize; /*闪存中的大小代码,由链接程序文件*/定义 


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

    请注意,您提议的解决方案忽略了各部分之间的差距。  这已成为另一线程中客户的问题。  这对您来说是个问题吗?

    谢谢,此致,

    -George

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

    我会检查一下,但我认为每个部分之间没有差距。

    如果存在,解决方案是确定所有部分的最大结束时间,并与第一部分的起始地址(从8万 tout 8.0002万开始)有所不同。

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

    您是对的,

    因此,在我的代码中,我进行了以下计算(如果稍后我添加了一个部分,我必须更新代码的这一部分...):

    UINT32_t LocalFlashCodeSize;
    
    /*确定代码大小(不使用总大小,因为它可能是每个部分之间的间距)*/
    LocalFlashCodeSize =0;
    LocalFlashCodeSize =最大值(LocalFlashCodeSize,(UINT32_t)&Link_FlashTextEnd);
    LocalFlashCodeSize =最大值(LocalFlashCodeSize,(UINT32_t)&Link_FlashCInitEnd);
    FlashCodeSize =最大值(LocalFlashCodeSize,(UINT32_t)&Link_FlashBInitEnd);
    LocalFlashCodeSize =最大值(LocalFlashCodeSize,(UINT32_t)&Link_FlashPInitEnd);
    LocalFlashCodeSize =最大值(LocalFlashCodeSize, (UINT32_t)&Link_FlashEConstEnd);
    LocalFlashCodeSize =最大值(LocalFlashCodeSize,(UINT32_t)&Link_FlashSwitchEnd);
    LocalFlashCodeSize -=(UINT32_t)&Link_FlashTotalStart;