工具/软件:TI C/C++编译器
大家好、
我正在尝试在调用 main 之前编写自定义启动例程。 因为有些东西不能处理它、所以很难做到这一点。
因此、我浏览了 TI 库源代码、并遇到了我在自定义启动例程中没有的 cinit 例程。
cinit 例程正在执行什么操作、为什么需要它? 如何编写定制 cinit 例程、而不使用由链接器生成的符号、如 __TI_Handler_Table_Base 和 __TI_Handler_Table_Limit。
谢谢、
Ashish Mishra
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.
工具/软件:TI C/C++编译器
大家好、
我正在尝试在调用 main 之前编写自定义启动例程。 因为有些东西不能处理它、所以很难做到这一点。
因此、我浏览了 TI 库源代码、并遇到了我在自定义启动例程中没有的 cinit 例程。
cinit 例程正在执行什么操作、为什么需要它? 如何编写定制 cinit 例程、而不使用由链接器生成的符号、如 __TI_Handler_Table_Base 和 __TI_Handler_Table_Limit。
谢谢、
Ashish Mishra
您好、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可能会因看门狗超时而复位。
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"函数。 假设您可以在主函数的开头实现所需的一切。
此致、
哈里