崩溃取决于发生在主程序之前的编译器

时间:2019-01-04 09:06:22

标签: c gcc arm embedded

我正在从事一个涉及由ARM处理器支持的嵌入式设备的项目。 我正在用GCC和RVCT5

编译以下代码

使用GCC,我没有编译器警告,程序运行没有问题。

使用RVCT5时,我也没有编译器警告,但程序会在循环中崩溃

我隔离了崩溃,但对解决方法一无所知。

RVCT5似乎无法解析我需要作为参数传递给函数的回调函数的地址。

main.c

#include "net_test.h"
void main( int argc, char **argv ) 
{
   printf("TASK1 %p \r\n",&msgTask1); //this is ok
   //printf("TASK2 %p \r\n",&msgTask2); //this crashes
}

net.c

#include "net_test.h"
INT32 msgTask1(INT32 type, INT32 param1, INT32 param2)
{
  //omissis
}

parser.c

#include "net_test.h"
INT32 msgTask2(INT32 type, INT32 param1, INT32 param2)
{
  //omissis
}

net_test.h

INT32 msgTask1(INT32 type, INT32 param1, INT32 param2);
INT32 msgTask2(INT32 type, INT32 param1, INT32 param2);

如果在我的代码中取消注释打印msgTask2地址的行,则该软件甚至无法运行主程序。可以证明这一点,因为我看不到msgTask1的行,并且使用硬件ARM调试器,应用程序进行了矢量捕获,但指令指针未引用主线程。

从我的角度来看,在初始化函数时存在一些错误。 我读了一些有关静态初始化顺序惨败的信息,但我不知道是否是这种情况。我在声明两个源文件中包含的标头中的函数。

我认为这可能是与内存占用有关的问题,因此我尝试增加应用程序可用的堆栈大小。我还尝试注释掉部分代码以达到稳定的状态,但是没有任何效果。

关于我可以调查的任何线索吗?

0 个答案:

没有答案