tonyk_av 83 July 10 Posted July 10 · Report post Вопрос на засыпку, прошу тех, кто не в теме, не лезть с глупыми вопросами. Благодарю за понимание. Скажу сразу, что у меня решение есть, оно работает, но мне не нравится из-за постоянно вылезающего при старте отладчика окна с предупреждением от ИАР, охреневающего от моего решения. Компилятор IAR 9. Нужно реализовать на С++ стартап, который в обработчике прерывания по сбросу Reset_Handler() делает следующее: 1) зануляет область ОЗУ со статическими; 2) инициализирует переменные; 3) вызывает мою функцию; 4) вызывает конструкторы классов; 5) переходит на main(). В gcc это всё делается просто, ибо его делали инженеры, а iar делали гансы по ТЗ, поэтому в нём с моими хотелками куча проблем. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 372 July 11 Posted July 11 · Report post 10 часов назад, tonyk_av сказал: В gcc это всё делается просто, ибо его делали инженеры, а iar делали гансы по ТЗ, поэтому в нём с моими хотелками куча проблем. Что именно проклятые гансы не дают сделать из вышеперечисленного? Quote Share this post Link to post Share on other sites More sharing options...
x893 85 July 11 Posted July 11 · Report post 4 hours ago, jcxz said: Что именно проклятые гансы не дают сделать из вышеперечисленного? Подумать головой 1 1 1 Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 83 July 11 Posted July 11 · Report post 6 hours ago, jcxz said: Что именно проклятые гансы не дают сделать из вышеперечисленного? Вызвать main(). Quote Share this post Link to post Share on other sites More sharing options...
jcxz 372 July 11 Posted July 11 · Report post 1 час назад, tonyk_av сказал: Вызвать main(). Странно... Мне яйца гансы почему-то не мешают: ;Отсюда стартует firmware AppStart: CPSID I CPSID F #ifdef FILL_RAM LDR R0, =RAM_regionA_start MOVS R1, #RAM_regionA_size LDR R2, =FILL_RAM ADDS R6, R0, R1 ;исключение области .raw из заполняемого региона LDR R5, =sfb(.raw) SUBS R7, R5, R0 CMP R7, R1 BCS AppStart_02 BL AppStart_10 LDR R0, =sfe(.raw) ADDS R0, #3 BICS R0, R0, #3 AppStart_02: MOV R5, R6 BL AppStart_10 #endif #ifdef FILL_STK LDR R0, =sfb(.bssStk) LDR R5, =sfe(.bssStk) LDR R2, =FILL_STK BL AppStart_10 LDR R0, =sfb(.bssStkMain) MOV R5, SP BL AppStart_10 #endif SUB SP, #(STK_USE_OS_TASKSW + STK_USE_OS_TASKSW_FP) * 4 + 7 & -8 ;выделение места для инициализации контекста задачи функцией создания задачи (до старта OS работаем на стеке bssStkMain, который впоследствии станет стеком главной задачи) B __iar_program_start Как видно: заполняю нужные области ОЗУ/стеки своим шаблоном, вызываю свои функции, делаю иниты/конструкторы статических переменных и вызываю main(). И ни один ганс даже слова поперёк не сказал. IAR v7.80.4. ЧЯДНТ? Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 83 July 11 Posted July 11 · Report post 1 hour ago, jcxz said: и вызываю main() Тут нет вызова main(), вот в чём дело. 1 hour ago, jcxz said: ЧЯДНТ? Делаете переход на __iar_program_star, а не main. 1 hour ago, jcxz said: И ни один ганс даже слова поперёк не сказал. Вот когда сможете перейти из своего кода на main, тогда и скажете. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 372 July 11 Posted July 11 · Report post 2 часа назад, tonyk_av сказал: Вот когда сможете перейти из своего кода на main, тогда и скажете. Надеюсь до попыток сделать такое никогда не докачусь. Есть такая общеизвестная истина: Если вас возмущает слишком малое и неудобное отверстие в трусах. В которое трудно просовывать голову и остальную тушку. Но окружающие находят трусы вполне удобными, не видят в них никаких неудобств. То может стоит наконец-то задуматься? Может это не все вокруг дураки, может это просто вы как-то НЕ ТАК надеваете трусы? Не так как принято в приличном обществе. Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 83 July 11 Posted July 11 · Report post 34 minutes ago, jcxz said: Надеюсь до попыток сделать такое никогда не докачусь. Значит, не осилили. Ожидаемо. 36 minutes ago, jcxz said: Есть такая общеизвестная истина... Ну, раз по делу сказать нечего, то начинается словоблудие. И это ожидаемо. В gcc это делается без проблем. А сделать такое хотелось, чтобы в стартап убрать инициализацию системы прерываний для С++. Впрочем, решение нашлось. 1 Quote Share this post Link to post Share on other sites More sharing options...
dxp 228 July 12 Posted July 12 · Report post 21 час назад, tonyk_av сказал: Вызвать main(). Хотите сказать, что такой код: //------------------------------------------------------------------------------ extern unsigned char __idata_start[]; extern unsigned char __data_start[]; extern unsigned char __data_end[]; extern unsigned char __bss_start[]; extern unsigned char __bss_end[]; __attribute__ ((weak)) int __low_level_init(); void __libc_init_array(); int main(); //------------------------------------------------------------------------------ void Reset_Handler() { if( __low_level_init() ) { memcpy(__data_start, __idata_start, __data_end - __data_start); // copy initialized variables memset(__bss_start, 0, __bss_end - __bss_start); // zero-fill uninitialized variables __libc_init_array(); // low-level init & ctor loop } main(); } //------------------------------------------------------------------------------ int __low_level_init() { return 1; } //------------------------------------------------------------------------------ Не скомпилируется? Или потом не слинкуется? Не очень понятна конкретная проблема. Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 83 July 12 Posted July 12 · Report post 7 hours ago, dxp said: Не скомпилируется? В ИАР- нет, не скомпилируется. ИАР строго следует Стандарту на С++, запрещающему явный вызов main(). Quote Share this post Link to post Share on other sites More sharing options...
_pv 113 July 12 Posted July 12 · Report post __asm ("b main") ? 1 Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 83 July 13 Posted July 13 · Report post 11 hours ago, _pv said: __asm ("b main") ? Quote согласно официальному стандарту C++ (ISO/IEC 14882), функция main является уникальной. В C++ запрещено не только вызывать main рекурсивно, но и брать её адрес (&main или приведение к типу). IAR версии 9.50 строго следует этому правилу, поэтому генерирует ошибку Error[Pe390]. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 353 July 13 Posted July 13 · Report post 8 минут назад, tonyk_av сказал: согласно официальному стандарту C++ (ISO/IEC 14882), функция main является уникальной. В C++ запрещено не только вызывать main рекурсивно, но и брать её адрес (&main или приведение к типу). IAR версии 9.50 строго следует этому правилу, поэтому генерирует ошибку Error[Pe390]. __asm("b main") - это расширения компилятора, это не то же самое что &main. Хотя IAR всегда себе на уме. Quote Share this post Link to post Share on other sites More sharing options...
_pv 113 July 13 Posted July 13 · Report post Quote согласно официальному стандарту C++ (ISO/IEC 14882), функция main является уникальной. В C++ запрещено не только вызывать main рекурсивно, но и брать её адрес (&main или приведение к типу). IAR версии 9.50 строго следует этому правилу, поэтому генерирует ошибку Error[Pe390]. теперь уже и в компилятор языковые модели встроили, что он такую диагностику выдаёт? Это ассемблер, а не с++. Я не проверял конечно, но компилятор тут ошибку выдавать не должен, может линкер, если они и там что-нибудь с main дополнительно нахимичили, но не компилятор. Quote Share this post Link to post Share on other sites More sharing options...
tonyk_av 83 July 13 Posted July 13 (edited) · Report post 11 hours ago, _pv said: __asm ("b main") ? Решение такое. Вызываем из стартапа на С++ промежуточную функцию jump_to_main() из С-файла, а она вызывает main() из С++-файла. При таком способе даже отладчик перестаёт ругаться и всё работает так как было задумано. 7 minutes ago, _pv said: Это ассемблер, а не с++. Я не проверял конечно, но компилятор тут ошибку выдавать не должен, может линкер, если они и там что-нибудь с main дополнительно нахимичили, но не компилятор. Это вставка на асме в С++, поэтому не работает. 7 minutes ago, _pv said: они и там что-нибудь с main дополнительно нахимичили, Проблема была и в отладке. ИАР упорно пытался ставить бряк на main(), которого нет. Попытка указать ему, что стартовая точка не main() приводила к ругане в начале отладки, но потом отладка шла как надо. Edited July 13 by tonyk_av Quote Share this post Link to post Share on other sites More sharing options...