Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EWARM 7.50.2 Некорректная линковка?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Profi2005
Добрый день,

Использую EWARM 7.50.2 с ограничением кода 32к
Микроконтроллер STM32F407VG.
Проект стартует нормально (см. картинку).


Но! После подключения к проекту tird-party .cpp, все компилится без ошибок,
но при запуске (Download & Debug) появляется надпись Program Exit Reached,
а симулятор даже не встает на первую строчку программы кода Си.

Startup приложен.

Вылет на __exit достигается из:

.text ro code 0x08003bc0 0x28 data_init.o [6]

согласно .MAP файлу. В дизассемблере это __iar_data_init3


С уважением,
К.
hd44780
Цитата(Profi2005 @ Feb 12 2016, 14:20) *
Но! После подключения к проекту tird-party .cpp, все компилится без ошибок,
но при запуске (Download & Debug) появляется надпись Program Exit Reached,
а симулятор даже не встает на первую строчку программы кода Си.


2 вопроса:
1. Этот волшебный файл "tird-party .cpp" увидеть можно?
2. Симулятор не работает, а реальный процессор?
Profi2005
Цитата(hd44780 @ Feb 13 2016, 18:15) *
2 вопроса:
1. Этот волшебный файл "tird-party .cpp" увидеть можно?
2. Симулятор не работает, а реальный процессор?


Спасибо за отклик.

1. Прикрепить .cpp к сожалению не могу.
Вроде как проблема локализовалась около динамического распределения памяти
больших массивов. Оператор new и иже с ним.
Собственно, проблема возникает уже просто при добавлении файла
в проект, никакие функции из .cpp не вызываются.
2. Реальный процессор - он как и симулятор.
Управление на основную программу не передается.
3. Как интересно, формируется код по метке __iar_data_init3?

С уважением,
К.



Profi2005
Собственно, в .cpp
инициализируются несколько массивов вида:

float* ааа = new float[512];

если увеличить heap -> 0x2000 то все начинает работать... если оставить
в комментах структуру:

int* Param = new int[5];
float* Buff = new float[Param[1]*Param[2]];

Для нее увеличение heap -> 0xE000 не помогает,
далее heap -> 0xF000 начинает ругаться линковщик.
k155la3
Цитата(Profi2005 @ Feb 15 2016, 17:03) *
. . . .
int* Param = new int[5];
float* Buff = new float[Param[1]*Param[2]];
. . . .


Это берется 2 неинициализированных значения, перемножаются, и этот фонарь
используется для new ?
float* Buff = new float[фонарь];

Если код CPP, то при запуске программы в инит-коде запускается цепочка конструкторов.
(проверьте, что-как объявляется в Вашем коде ). Т.е. может быть завес из-за некорректного конструктора.
Отследить дебагером это достаточно сложно.

ps
Цитата(Profi2005 @ Feb 15 2016, 11:26) *
. . . .
1. Прикрепить .cpp к сожалению не могу.
. . . .
Собственно, проблема возникает уже просто при добавлении файла
в проект, никакие функции из .cpp не вызываются.
. . . . .

кроме вышеупомянутых конструкторов.
Profi2005
Я небольшой спец в .cpp посему не указал инициализацию, сорри,
она там есть, иначе была бы ошибка при компиляции.

Итак, завес EWARM'a 7.50.2 с Programm exit reached
достигается двумя способами в добавленном файле .cpp :

1. int* InParam = new int;

float* Buffer = new float[*InParam];

2. Использование динамического массива с размером,
больше чем heap

(Project->Options->Linker->Config->Edit->Stack/HeapSizes)

Вроде как IAR признал, что это их косяки wacko.gif


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.