-
Постов
1 241 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные VladislavS
-
-
24 минуты назад, viakon сказал:
В применении к стм достаточно правила деление без остатка на 4
Чё эта? STM запретила их в машине времени использовать? :)
-
Боюсь представить, когда ТС узнает правило високосного года
ЦитатаВ григорианском календаре обычный год состоит из 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.
-
Опубликовано · Изменено пользователем VladislavS · Пожаловаться
-
-
-
Там же BCD формат.
-
Зачем вам указывать границы? Задаёте размер, остальное дело линкера.
-
Открываете линкерскрипт и смотрите название секции стека. Допустим, это будет .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)));
-
Может стоило указать для какого компилятора/линкера? Тогда и будет синтаксис узнаваем. Это конфигурационный файл линкера IAR.
-
6 часов назад, jcxz сказал:
Печалька
Если бы вы в эту тема пришли помочь ТС, а не прокачать ЧСВ, то заметили бы какая проблема идёт пунктом номер один вот в этом сообщении
Стартап на С позволил убедиться, что libc_init_array тут не причём. Ибо поставить такой эксперимент с асмовым стартапом ТС не мог. А вы вместо того чтобы привести код вызова конструкторов вручную на асме развели зачем-то полемику на отвлечённую тему.
И какое отношение к теме имели ваши экзерсисы с листингами асма вообще непонятно. Ну оптимизировали вы одну команду в своём коде и что? От этого у автора конструктор заработал?
-
1
-
-
Как это развидеть?
-
2
-
-
1 час назад, oldbrowze сказал:
как решать эти проблемы?
Сделать минимальный проект с этим классом, чтобы проблему было проще исследовать.
Попробовать заменить компилятор. Что-нибудь из последнего, что они для embedded специально собирали, 10.3-2021.10 к примеру.
Использовать нормальную IDE с отладкой.
Какая версия стандарта С++ задана при компиляции?
-
40 минут назад, jcxz сказал:
А кто заставляет использовать индусский асм?
Да возьмите хотя бы эту тему. У ТС такой стартап и править его ни-ни. И так у подавляеющего большинсва - что было в dfp, то и используют. А править либо не умеют, либо боятся, либо лень, либо....
-
1
-
-
11 часов назад, oldbrowze сказал:
Поскольку стартап у меня на асм
Ещё один довод не в пользу асма.
-
1
-
-
Ну смотрите. У вас потенциально может быть две проблемы:
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. Но она пустая, можно туда не рыть.
-
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, я же не знаю что у вас там за код, не пойдёт ли дым от этого...
-
1
-
-
Ну отлично. Три конструктора. Нужный среди них есть?
Можно даже самому позапускать их вот таким кодом
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++)());
Или сразу нужный из массива запустить.
-
1
-
-
16 минут назад, jcxz сказал:
Правда что-ли?
Я не про вообще, а конкретно про стартап для GCC. Беру стандартный асмовый из dfp и свой на С. Делают одно и то же. Код в итоге на С меньше. Оптимизация, инлайн SystemInit и main. Где-то компилятор может паттерн копирования распознать и memcpy применить. А на асме как индус один раз написал, так оно и есть.
А в случае с IAR в стартапе для кортексов вообще ничего коме таблицы векторов нет. Зачем там асм вообще непонятно.
-
Для кортексов все стартапы отличаются только таблицей векторов прерываний. Заменить её для нового проца - дело 1 минуты.
А можно вот так сделать, чтобы один стартап под GCC, IAR и Keil был. На асме такое как?
13 минут назад, Arlleex сказал:Я точно так же не вижу доводов в пользу Си-шных стартапов против asm-овых.
Cи-шный код оптимизируется лучше, препроцессором им проще управлять.
-
1
-
-
Не вижу ни одного довода в пользу стартапа на asm для кортексов.
-
Где в arm-none-eabi такое видели? В любом проекте стартап компилируется из исходника чаще всего ассемблерного .s, либо нормальный на С.
-
Что такое дефолтный?
-
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
-
Проверьте в 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
Проект GCC: компиляция ошибок не дает, в микроконтроллере не работает. Этот же проект в XC8 и IAR for AVR работает. В чем может быть проблема?
в GNU/OpenSource средства разработки
Опубликовано · Пожаловаться