Jump to content
    

Вопрос на засыпку, прошу тех, кто не в теме, не лезть с глупыми вопросами. Благодарю за понимание. Скажу сразу, что у меня решение есть, оно работает, но мне не нравится из-за постоянно вылезающего при старте отладчика окна с предупреждением от ИАР, охреневающего от моего решения.

Компилятор IAR 9. Нужно реализовать на С++ стартап, который в обработчике прерывания по сбросу Reset_Handler() делает следующее:
1) зануляет область ОЗУ со статическими;
2) инициализирует переменные;
3) вызывает мою функцию;
4) вызывает конструкторы классов;
5) переходит на main().

В gcc это всё делается просто, ибо его делали инженеры, а iar делали гансы по ТЗ, поэтому в нём с моими хотелками куча проблем.

Share this post


Link to post
Share on other sites

10 часов назад, tonyk_av сказал:

В gcc это всё делается просто, ибо его делали инженеры, а iar делали гансы по ТЗ, поэтому в нём с моими хотелками куча проблем.

Что именно проклятые гансы не дают сделать из вышеперечисленного?

Share this post


Link to post
Share on other sites

4 hours ago, jcxz said:

Что именно проклятые гансы не дают сделать из вышеперечисленного?

Подумать головой

Share this post


Link to post
Share on other sites

6 hours ago, jcxz said:

Что именно проклятые гансы не дают сделать из вышеперечисленного?

Вызвать main().

Share this post


Link to post
Share on other sites

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. ЧЯДНТ?  :unknw:

Share this post


Link to post
Share on other sites

1 hour ago, jcxz said:

и вызываю main()

Тут нет вызова main(), вот в чём дело.

 

1 hour ago, jcxz said:

ЧЯДНТ?  :unknw:

Делаете переход на __iar_program_star, а не main.

image.png.032870001d4ddd135ebbd6aa313e6459.png

1 hour ago, jcxz said:

И ни один ганс даже слова поперёк не сказал.

Вот когда сможете перейти из своего кода на main, тогда и скажете.

Share this post


Link to post
Share on other sites

2 часа назад, tonyk_av сказал:

Вот когда сможете перейти из своего кода на main, тогда и скажете.

Надеюсь до попыток сделать такое никогда не докачусь. :fool: 

 

Есть такая общеизвестная истина:

Если вас возмущает слишком малое и неудобное отверстие в трусах. В которое трудно просовывать голову и остальную тушку. Но окружающие находят трусы вполне удобными, не видят в них никаких неудобств. То может стоит наконец-то задуматься? Может это не все вокруг дураки, может это просто вы как-то НЕ ТАК надеваете трусы? Не так как принято в приличном обществе.

Share this post


Link to post
Share on other sites

34 minutes ago, jcxz said:

Надеюсь до попыток сделать такое никогда не докачусь. :fool: 

Значит, не осилили. Ожидаемо.

 

36 minutes ago, jcxz said:

Есть такая общеизвестная истина...

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

 

В gcc это делается без проблем. А сделать такое хотелось, чтобы в стартап убрать инициализацию системы прерываний для С++. Впрочем, решение нашлось.

Share this post


Link to post
Share on other sites

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;
}
//------------------------------------------------------------------------------

Не скомпилируется? Или потом не слинкуется? Не очень понятна конкретная проблема.

Share this post


Link to post
Share on other sites

7 hours ago, dxp said:

Не скомпилируется?

В ИАР- нет, не скомпилируется. ИАР строго следует Стандарту на С++, запрещающему явный вызов main(). 

Share this post


Link to post
Share on other sites

11 hours ago, _pv said:

__asm ("b main") ?

Quote

согласно официальному стандарту C++ (ISO/IEC 14882), функция main является уникальной. В C++ запрещено не только вызывать main рекурсивно, но и брать её адрес (&main или приведение к типу). IAR версии 9.50 строго следует этому правилу, поэтому генерирует ошибку Error[Pe390].

Share this post


Link to post
Share on other sites

8 минут назад, tonyk_av сказал:

согласно официальному стандарту C++ (ISO/IEC 14882), функция main является уникальной. В C++ запрещено не только вызывать main рекурсивно, но и брать её адрес (&main или приведение к типу). IAR версии 9.50 строго следует этому правилу, поэтому генерирует ошибку Error[Pe390].

__asm("b main") - это расширения компилятора, это не то же самое что &main. Хотя IAR всегда себе на уме.

Share this post


Link to post
Share on other sites

Quote

согласно официальному стандарту C++ (ISO/IEC 14882), функция main является уникальной. В C++ запрещено не только вызывать main рекурсивно, но и брать её адрес (&main или приведение к типу). IAR версии 9.50 строго следует этому правилу, поэтому генерирует ошибку Error[Pe390].

теперь уже и в компилятор языковые модели встроили, что он такую диагностику выдаёт?

Это ассемблер, а не с++. Я не проверял конечно, но компилятор тут ошибку выдавать не должен, может линкер, если они и там что-нибудь с main дополнительно нахимичили, но не компилятор.

Share this post


Link to post
Share on other sites

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 by tonyk_av

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...