我正在为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(;;)
{
}
}
答案 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()