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.

[参考译文] 编译器/MSP430G2553:如何在特定地址设置启动初始化?

Guru**** 2558910 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/828882/compiler-msp430g2553-how-to-set-startup-initialization-at-a-specific-address

器件型号:MSP430G2553

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

您好!

为了在软件版本之间保持相同的 BSL 密码(32字节中断矢量表)、我决定将所有中断例程放置在闪存中的固定地址。 因此、除了复位处理程序之外、我对所有例程都执行了该操作。 我无法强制链接器将其放置在特定地址。 我是如何做到的:

-复位例程的地址实际上是启动代码、此函数:  _c_int00_noargs_noexit。

-如果我将这个函数放置在闪存中的一个固定地址上、那么复位例程将一直是那个地址:

-在文件 boot_special .c 中、我强制将函数放置在"MYSEGMENT"段中:

pragma CLINK (_c_int00_noargs_noexit)
#pragma CODE_SECTION (_c_int00_noargs_noexit、"MYSEGMENT")
CSTART_DECL _c_int00_noargs_noexit ()

stack_init();
如果(_system_pre_init()!= 0)_auto_init();
MAIN (0);
abort();

-在链接器指令文件中、我创建了存储器部分:

SEG:origin = 0xC000,length = 0x0100

-然后部分:

MYSEGMENT:{}> SEG

为什么不将其放置在0xC000上,而是放置在不同的随机地址上,如0xD44A?:  

0000d44a _c_int00_noargs_noexit    

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

    您好!

    下面是指向似乎与您尝试执行的操作非常相似的线程的链接。 请查看以下方法是否适合您:

    https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/394904

    您将需要确保所有中断矢量都放置在两个 SW 版本之间的相同地址中、以保证软件版本之间的 BSL 密码相同。  

    如果您仍有问题或疑问、请告诉我!

    Mitch

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

    感谢 Mitch 的回复。

    这些主题中提到的一些建议不起作用、我没有测试所有这些建议。

    我找到了一个非常简单的解决方案、该解决方案非常完美:

    -将入口点例程从 boot_special .c (编译器文件)移动到我的源项目(例如主文件)

    -我添加了 pragma 以在指定地址分配例程:

    pragma CLINK (_c_int00_noargs_noexit)
    #pragma LOCATION = 0xD310
    CSTART_DECL _c_int00_noargs_noexit ()

    stack_init();
    如果(_system_pre_init()!= 0)_auto_init();
    MAIN (0);
    abort();

    就是这样。 以下是映射文件的输出:

    0000d310 _c_int00_noargs_noexit   

    当然,复位矢量具有正确的地址:......... 10 D3

    谢谢