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.

[参考译文] 编译器/MSP430F5438A:cinit 例程

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/883558/compiler-msp430f5438a-cinit-routine

器件型号:MSP430F5438A

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

大家好、

我正在尝试在调用 main 之前编写自定义启动例程。 因为有些东西不能处理它、所以很难做到这一点。

因此、我浏览了 TI 库源代码、并遇到了我在自定义启动例程中没有的 cinit 例程。

cinit 例程正在执行什么操作、为什么需要它? 如何编写定制 cinit 例程、而不使用由链接器生成的符号、如 __TI_Handler_Table_Base 和 __TI_Handler_Table_Limit。

谢谢、

Ashish Mishra

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

    Ashish、您好!

    您能否告诉我您使用的 IDE 以及编译器版本? IAR 和 CCS 对此略有不同。 对于器件、我假设您使用的是 MSP430F5438A、对吧?

    此外、在此处附加最有用的文档、以获取任何编译器/启动/TI 相关符号。  在本文档的第6.9章中,您可能会发现一些对您有所帮助的内容。

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

    您好、Harry、

    感谢您的回复。

    我使用的是 CCS 9.2版本、编译器版本为 TI v18.12.3.LTS。 我正在使用 MSP430F5438A 器件。

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

    Ashish、您好!

    由于您使用的是 CCS,因此您可以编写自己 的_system_pre_init()函数并使其返回0。

    然后它将调用 _system_pre_init()函数,然后直接转到 main 而不执行任何其他操作。

    在 _system_pre_init 中、您可以选择不使用任何 __TI_Handler_Table_Base 或__TI_Handler_Table_Limit 符号。

    我在下面附上了一个示例。 您可以运行此测试、并应看到、使用此测试、变量"A"初始化为"15"、而不是默认初始化值"0"。 通常在_system_pre_init()中,您可以在主函数之前写入任何所需内容,并记住将返回值设置为"0"。 另外,请记住看门狗是默认打开的,因此如果 _system_pre_init()花费很长时间,MSP430可能会因看门狗超时而复位。

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

    您好、Harry、

    很抱歉耽误你的回答。  

    如果我没有错、_system_pre_init()将由 TI 库提供的 boot.c 调用? 如果是这种情况、我希望尽可能避免这种情况。

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

    Ashish、您好!

    尝试将以下代码放入"entry.asm"等汇编代码文件中、并将其添加到您的项目中。

    .cdecls C、list、"msp430f5438a.h"
    .def 条目
    .text
    .retain
    .retainrefs
    .ref 主
    
    条目:
    MOV.w #5BF0h、SP
    
    调用#main
    JMP $
    nop
    
    .global __stack_end
    .sect .stack
    
    .sect ".reset"
    .short 条目
    
    

    并对您的项目进行以下更改:

    之后、您的 MCU 将首先从复位矢量(0xFFFE)开始、然后转到"条目"以初始化您的堆栈、然后调用"main"函数。 假设您可以在主函数的开头实现所需的一切。

    此致、

    哈里

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

    您好、Harry、

    谢谢。 它的工作原理。 我唯一缺少的是、我没有更改初始化模型设置。

    此致、

    Ashish Mishra