IAR Embedded workbench 6(MSP430 V5.6)覆盖程序启动

时间:2014-12-03 15:41:03

标签: c99 msp430 iar

我正在为MSP430 v5.60.7使用IAR嵌入式工作台,这是IAR嵌入式工作台版本6.6。我正在使用C99。

我试图用我自己的符号覆盖__program_start(),这是一个名为__unit_test_main()的函数。我已经转到链接器配置选项卡并选中了框#34;覆盖默认程序条目",选择"条目符号"选项并输入__unit_test_main。这会编译并链接,但它不会在模拟器中运行。我收到消息"用户错误:在地址0x0和#34;上找到非法操作码。当我尝试在目标上运行它时它就不起作用 - 控制器进入低功耗模式。

PC和SP在启动时都被初始化为0x00。

那么我需要做什么/定义才能正确初始化PC和SP?

我的单元测试主要功能现在很简单,这里有整个文件:

    #include <cstdio>
    void __unit_test_main(void);
    void __unit_test_main(void)
    {
        printf("Hello World");
        for(;;)
        {
        }
    }

1 个答案:

答案 0 :(得分:0)

__program_start:在cstartup.s43中定义。此文件可以复制到项目目录中,并包含在项目中,该项目将覆盖库版本。

在初始化__program_start:标签后,立即调用堆栈指针,调用__low_level_init(),然后调用?cstart_call_main

?cstart_call_main:标签(第339行)附近有以下内容:

    XRSEGCSTART
    PUBLIC  ?cstart_call_main

    EXTERN  main
    EXTERN  exit

?cstart_call_main:
    XXCALL  main
    XXCALL  exit

在那里,您可以添加要替换主要功能的符号。

您可以使用一些#ifdef预处理器逻辑来有条件地执行此操作。

所以我有

    XRSEGCSTART
    PUBLIC  ?cstart_call_main
#ifdef UNIT_TEST
    EXTERN  test_runner_main
#else
    EXTERN  main
#endif
    EXTERN  exit

?cstart_call_main:
#ifdef  UNIT_TEST
    XXCALL  test_runner_main
#else
    XXCALL  main
#endif
    XXCALL  exit

    PUBLIC  ?cstart_end

我必须在汇编程序和编译器选项中定义我的UNIT_TEST符号。

另一个选项是在我的项目中的某个地方实现函数__low_level_init()并有条件地调用test_runner而不是调用main()