Перейти к содержанию
    

stm32f401ccu не вызывается __libc_init_array

17 часов назад, VladislavS сказал:

А на асме как индус один раз написал, так оно и есть.

А кто заставляет использовать индусский асм? Если кто-то использует чей-то быдлокод - это его выбор. И набыдлокодить и на си можно.

А вот от ляпов, навороченных си-компилятором - никак не избавиться. Каким бы грамотным ни был программист.

Так что этот ваш аргумент - притянут за уши. Здесь как раз преимущество асма - можно написать как угодно оптимально (зависит только от умения программиста). В случае же с си - больше зависит от умений уже компиляторо-писаталей, а не от талантов программиста.

17 часов назад, VladislavS сказал:

Зачем там асм вообще непонятно.

А зачем там си? вообще непонятно.... :unknw:

3 часа назад, VladislavS сказал:

Ещё один довод не в пользу асма.

Прекрасный "довод"! Некто наваял что-то на си, да так коряво, что даже запустить никак правильно не может. А виноват почему-то ассемблер.  :shok:

У вас реально - расизм. Как уже заметили выше....  :wink:

17 часов назад, VladislavS сказал:

компилятор может паттерн копирования распознать и memcpy применить.

1. Ключевое слово тут "может". Может применить, а может и нет. Как фишка ляжет. А если нужна максимально быстрая инициализация при старте устройства? Например хотя-бы - быстрое заполнение всей памяти неким шаблоном? Будете гадать - применит ли компилятор LDMIA/STMIA с максимальным числом регистров или будет тупо через один регистр колупаться?

2. А если нужны некие не совсем тривиальные операции с SP в стартапе? Как будете выкручиваться в си-функции?

3. Или например - ваше приложение запускается из другого (либо из бутлоадера, либо ваше приложение - оверлей) и ему передаются аргументы в регистрах >= R4 (в точке вызова по RESET-вектору). Опять - как на си?

 

А вот на асме всё вышеперечисленное совершенно однозначно решается. И работает независимо от причуд си-компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 минут назад, jcxz сказал:

А кто заставляет использовать индусский асм?

Да возьмите хотя бы эту тему. У ТС такой стартап и править его ни-ни. И так у подавляеющего большинсва - что было в dfp, то и используют. А править либо не умеют, либо боятся, либо лень, либо....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я не правлю, я просто свой пишу: от одного Cortex-M до другого - различия главным образом в таблице прерываний. Остальное большую часть просто копируется. Дел на несколько минут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, VladislavS сказал:

Ещё один довод не в пользу асма.

Благодарю. Переделал весь проект под компиляцию через CMake, к тому же использовал ваш С-ный стартап.

Проблема, к сожалению, осталась. 
Использовав явный вызов конструкторов с ключом -nostartfiles: 

for (void(**fConstr)() = __preinit_array_start; fConstr < __preinit_array_end; (*fConstr++)()) ;
for (void(**fConstr)() = __init_array_start; fConstr < __init_array_end; (*fConstr++)()) ;

Использовав тот же вызов 

 __libc_init_array()

, но уже без ключа - ничего не помогает

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

 

 

23 часа назад, VladislavS сказал:

1. Компилятор не добавляет в init_array нужный вам конструктор.

2. Стартап (посредством libc_init_array) не вызывает его.

Может будете добры и подскажете, как решать эти проблемы?

Да и спасибо вам за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, oldbrowze сказал:

как решать эти проблемы?

Сделать минимальный проект с этим классом, чтобы проблему было проще исследовать.

Попробовать заменить компилятор. Что-нибудь из последнего, что они для embedded специально собирали, 10.3-2021.10 к примеру.

Использовать нормальную IDE с отладкой.

Какая версия стандарта С++ задана при компиляции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 31.08.2022 в 21:19, oldbrowze сказал:

же использовал ваш С-ный стартап.

Проблема, к сожалению, осталась. 

Печалька.  :cray2: Оказывается си-стартап - не панацея. Как гуру обещали. :shok:   Кто бы мог подумать!  :umnik2:

В 31.08.2022 в 21:19, oldbrowze сказал:

как решать эти проблемы?

Начать с поиска вашего конструктора в листинге. Определить - есть он там или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, jcxz сказал:

Печалька

Если бы вы в эту тема пришли помочь ТС, а не прокачать ЧСВ, то заметили бы какая проблема идёт пунктом номер один вот в этом сообщении

Стартап на С позволил убедиться, что libc_init_array тут не причём. Ибо поставить такой эксперимент с асмовым стартапом ТС не мог. А вы вместо того чтобы привести код вызова конструкторов вручную на асме развели  зачем-то полемику на отвлечённую тему.

И какое отношение к теме имели ваши экзерсисы с листингами асма вообще непонятно. Ну оптимизировали вы одну команду в своём коде и что? От этого у автора конструктор заработал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 01.09.2022 в 06:31, VladislavS сказал:

развели  зачем-то полемику на отвлечённую тему.

И это говорит человек, последовательно, раз за разом

В 30.08.2022 в 16:32, VladislavS сказал:

чаще всего ассемблерного .s, либо нормальный на С.

В 30.08.2022 в 16:46, VladislavS сказал:

Не вижу ни одного довода в пользу стартапа на asm для кортексов.

В 30.08.2022 в 17:01, VladislavS сказал:

А можно вот так сделать, чтобы один стартап под GCC, IAR и Keil был. На асме такое как?

В 31.08.2022 в 08:23, VladislavS сказал:

Ещё один довод не в пользу асма.

упорно старающийся увести тред в сторону от темы???  :shok:  В сторону мерянья пипетками на тему "startup_c круче чем startup_asm"

И которому в конце-концов удалось это - ТС таки пошёл пинать колёса

В 31.08.2022 в 21:19, oldbrowze сказал:

к тому же использовал ваш С-ный стартап

И ожидаемо у него ничего не вышло.  :unknw:

В 01.09.2022 в 06:31, VladislavS сказал:

И какое отношение к теме имели ваши экзерсисы с листингами асма вообще непонятно

Не надо передёргивать! Мои листинги были ответом на ваше конкретное сообщение о "великой си-оптимизации". Специально отквочивал ваши слова, на которые отвечал - ознакомьтесь.

 

PS: Может всё-таки ТС осознает, что его проблема не в том, на чём написан его startup?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 часов назад, VladislavS сказал:

Сделать минимальный проект с этим классом, чтобы проблему было проще исследовать.

Спасибо большое за совет! Это привело меня к решению!

Поскольку на чистом проекте статические конструкторы вызываются, проблема с неверными ключами и всей прочей ерундой отпали. Решение было на поверхности: очевидно, что раз мой конструктор(тело) взаимодействует с периферией, эту периферию надо было затактировать!!!!
Операции на включения тактирования были вынесены в отдельную функцию, которая вызывалась в main(), но поскольку конструктор вызывался еще до того, как периферия была затактирована, у меня ничего не выходило. 

Добавил атрибут конструктор на функцию и, о чудо, всё заработало!!!


Спасибо огромное @VladislavS за огромную помощь и дельные советы!

Пришлось попробовать нечто новое - CMake!)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...