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

VladislavS

Свой
  • Постов

    1 241
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные VladislavS


  1. Боюсь представить, когда ТС узнает правило високосного года

    Цитата

    В григорианском календаре обычный год состоит из 365 дней. Поскольку фактическая продолжительность звездного года (период обращения Земли вокруг Солнца) составляет 365.2425 дней, «високосный год» в 366 дней используется один раз каждые четыре года для устранения ошибки, вызванной тремя обычными (но короткими) годами. Любой год, который делится на 4 без остатка, является високосным годом: например, 1988, 1992 и 1996 годы являются високосными годами.

    Тем не менее, есть еще небольшая ошибка, которая должна быть учтена. Чтобы устранить эту ошибку, григорианский календарь предусматривает, что год, который делится без остатка на 100 (например, 1900) является високосным годом только в том случае, если он также без остатка делится на 400.

    По этой причине следующие годы не являются високосными:

    1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600

    Это потому, что они делятся без остатка на 100, но не на 400.

    Следующие годы – високосные: 1600, 2000, 2400

    Это потому, что они делятся без остатка на 100 и 400.

     

  2. 6 минут назад, viakon сказал:

    1 число месяца это 0 или 1?

    Вы прикалываетесь? 0-е января, 31-е января, 32-е января, 99-е января...

    Там описания то хрен да нихрена. Читайте внимательней.

    1587792862__2022-09-09_105502276.thumb.png.49327d1978db01c87d51fb97736cc91a.png

  3. Открываете линкерскрипт и смотрите название секции стека. Допустим, это будет .reserved_for_stack.

    Цитата

        .reserved_for_stack (NOLOAD) :
        {
            . = ALIGN(4);
            PROVIDE(__reserved_for_stack_start__ = .);
            KEEP(*(.reserved_for_stack))
            . = ALIGN(4);
            PROVIDE(__reserved_for_stack_end__ = .);
        } > SRAM
     

    Создаёте в этой секции массив. Линкер будет обязан выделить под него место.

    static uint8_t _stack[1024]  __attribute__((used, section(".reserved_for_stack"), aligned(8)));

     

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

    Печалька

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

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

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

    • Upvote 1
  5. 1 час назад, oldbrowze сказал:

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

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

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

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

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

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

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

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

    • Upvote 1
  7. Ну смотрите. У вас потенциально может быть две проблемы:

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

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

    Надо понять какой у вас случай. В принципе, после  libc_init_array в стартапе сразу main вызывается. Если в стартапе убрать вызов libc_init_array и вызывать конструкторы в начале main моим кодом , то ничего не изменится. У вас в коде есть и другие конструкторы, на время отладки исключите их из кода, так будет проще. Ну и отладчиком пройдитесь, разобраться что за три адреса лежит в секции init_array не должно составить проблему.

    19 минут назад, oldbrowze сказал:

    Какую роль исполняет тогда libc_init_array?

    Можно скачать исходники clib и посмотреть. По идее, там очень похожий на то что я привёл код, только ещё для секции preinit_array. Но она пустая, можно туда не рыть.

  8. 15 минут назад, oldbrowze сказал:

    Если не секрет, где это вы нашли?

    Цитата

    init_array     0x00000000080005d8        0xc
                    0x00000000080005d8                . = ALIGN (0x4)
                    0x00000000080005d8                PROVIDE (__init_array_start, .)
     *(SORT_BY_NAME(.init_array.*))
     *(.init_array*)
     .init_array    0x00000000080005d8        0x4 /home/oldbrowze/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/7.2.1/thumb/v7e-m/crtbegin.o
     .init_array    0x00000000080005dc        0x4 .pio/build/blackpill_f401cc/src/generator.o
     .init_array    0x00000000080005e0        0x4 .pio/build/blackpill_f401cc/src/main.o
                    0x00000000080005e4                PROVIDE (__init_array_end, .)

     

    15 минут назад, oldbrowze сказал:

    Не совсем понимаю, откуда запускать.

    В идеале, вместо __libc_init_array, но можно и из main, я же не знаю что у вас там за код, не пойдёт ли дым от этого...

    • Upvote 1
  9. Ну отлично. Три конструктора. Нужный среди них есть?

    Можно даже самому позапускать их вот таким кодом

    extern void(*__init_array_start[])(void) __attribute__((weak));
    extern void(*__init_array_end[])(void) __attribute__((weak));
    
    
    for (void(**fConstr)() = __init_array_start; fConstr < __init_array_end; (*fConstr++)());

    Или сразу нужный из массива запустить.

    • Upvote 1
  10. 16 минут назад, jcxz сказал:

    Правда что-ли? 

    Я не про вообще, а конкретно про стартап для GCC. Беру стандартный асмовый из dfp и свой на С. Делают одно и то же. Код в итоге на С меньше. Оптимизация,  инлайн SystemInit и main. Где-то компилятор может паттерн копирования распознать и memcpy применить. А на асме как индус один раз написал, так оно и есть.

    А в случае с IAR в стартапе для кортексов вообще ничего коме таблицы векторов нет. Зачем там асм вообще непонятно.

  11. Для кортексов все стартапы отличаются только таблицей векторов прерываний. Заменить её для нового проца - дело 1 минуты.

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

     

    13 минут назад, Arlleex сказал:

    Я точно так же не вижу доводов в пользу Си-шных стартапов против asm-овых.

     Cи-шный код оптимизируется лучше, препроцессором им проще управлять.

    • Upvote 1
  12. 29 минут назад, dimka76 сказал:

    Т.е. вы не используете ключ -nostartfile, и при этом пытаетесь подсунуть свой файл startup.

    Это никак не связанные вещи. Просто с этой опцией не прилинковывается функция __libc_init_array() и вместо неё надо конструкторы руками вызвать. А старатап в любом случае в проекте есть. Вот это место в моём стартапе

    #if (1)
        // Use with the "-nostartfiles" linker option instead __libc_init_array();
        // Iterate over all the preinit/init routines (mainly static constructors).
        for (void(**fConstr)() = __preinit_array_start; fConstr < __preinit_array_end; (*fConstr++)()) ;
        for (void(**fConstr)() = __init_array_start; fConstr < __init_array_end; (*fConstr++)()) ;
    #else
        __libc_init_array(); // Use with libc start files
    #endif


     

  13. Проверьте в map-файле, что секция init_array не пустая.

    Цитата

    .init_array     0x08000264        0x4
                    0x08000264                PROVIDE (__init_array_start = .)
     *(SORT_BY_NAME(.init_array.*))
     *(.init_array*)
     .init_array    0x08000264        0x4 Z:\Temp\G071-Blink.elf.uAT8Lt.ltrans0.ltrans.o
                    0x08000268                PROVIDE (__init_array_end = .)
     

     

    29 минут назад, oldbrowze сказал:

    Какие флаги передаете линковщику?

    Цитата

    c:\CPP\gcc-arm-none-eabi-10.3-2021.10\bin/arm-none-eabi-g++ Bin\Release/startup_iar_gcc_keil_stm32g071xx.o Bin\Release/low_level_init.o Bin\Release/main.o  -mcpu=cortex-m0plus -mthumb   -T../LinkerScripts/GCC/STM32G071xB_flash.lds   -Wl,--gc-sections -nostartfiles -specs=nano.specs -specs=nosys.specs -Wl,-gc-sections -Wl,-Map=Bin\Release/G071-Blink.map,--cref -o Bin\Release/G071-Blink.elf

×
×
  • Создать...