сбой зависит от компилятора, который происходит до основного

Я работаю над проектом со встроенным устройством на базе процессора 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, приложение переходит к перехвату вектора, но указатель инструкции не ссылается на основной.

С моей точки зрения, есть некоторая ошибка при инициализации функции. Я кое-что прочитал о фиаско статического порядка инициализации, но не знаю, так ли это. Я объявляю функции внутри заголовка, который включен в оба исходных файла.

Я подумал, что это может быть проблемой, связанной с заполнением памяти, и попытался увеличить размер стека, доступного для приложения. Я также пытался закомментировать часть кода, чтобы достичь стабильного состояния, но ничего не получалось.

Любая подсказка о том, что я мог бы расследовать?

+1
источник поделиться

Посмотрите другие вопросы по меткам или Задайте вопрос