А сама оптимизация, как инструмент настройки компилятора, не виновата.
Stm32 с чего начать изучение...
- Сообщения: 588
- Зарегистрирован: Пн фев 16, 2026 17:30:02
calloc объединяет две функции - malloc и memset. В newlib функция calloc (равно как и malloc) обернута в макрос для связи с разными компиляторами. Как это сделано в вашем случае портирования - фиг знает. Баги то в основном и возникают при вот таких трансформациях одного к другому.
А сама оптимизация, как инструмент настройки компилятора, не виновата.
А сама оптимизация, как инструмент настройки компилятора, не виновата.
- Реклама
- Сообщения: 355
- Зарегистрирован: Ср мар 09, 2016 08:07:41
там в модуле "lib.c" кастомные реализации библиотечных malloc(), memcpy(), memset(), strlen() и прочих функций, которые оптимизатор почему-то выкидывает из проекта, что и приводит к ошибке при линковке.
- Сообщения: 588
- Зарегистрирован: Пн фев 16, 2026 17:30:02
А, ну дак в этих кастомных реализациях, либо в их вызовах и следует искать ошибку. Я показывал ранее, как именно выбрасывается неиспользуемый код.
Так же, для GCC можно задать индивидуальные для каждой функции настройки оптимизации при помощи атрибута __attribute__((optimize("O0"))) void Foo(); где "O0", "O1", "O2", "O3", "Os", "Of" - указание уровня оптимизации.
Так же, для GCC можно задать индивидуальные для каждой функции настройки оптимизации при помощи атрибута __attribute__((optimize("O0"))) void Foo(); где "O0", "O1", "O2", "O3", "Os", "Of" - указание уровня оптимизации.
но в файле py/malloc.с нет вообще обращений к "calloc"!!! и в lib.c тоже нет...JackSmith писал(а): Чт июл 02, 2026 12:44:52 я конкретно про O3. проект микропитон для примера, порт bare-arm. c "Os" проект нормально собирается, но если поменять в Makefile оптимизацию на "O3", это строка 25
https://github.com/micropython/micropyt ... y/malloc.c
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 355
- Зарегистрирован: Ср мар 09, 2016 08:07:41
ARV писал(а): Пт июл 03, 2026 08:03:47 но в файле py/malloc.с нет вообще обращений к "calloc"!!! и в lib.c тоже нет...
calloc объединяет две функции - malloc и memset
Код: Выделить всё
void *m_malloc_maybe(size_t num_bytes) {
void *ptr = malloc(num_bytes);- Реклама
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Это не важно, компилятор может сам их вызывать. Вот, например, он распознал паттерн копирования и вставил memcpy.
как это "не важно"?! я, конечно, от Си вобще в большом шоке, и с выбрасыванием лишнего я смирился, но чтобы компилятор добавлял то, о чем я не просил - это, имхо, явный перебор! хотя бы большими красными буквами написали, что при оптимизации такой-то компилятор предугадывает ваши желания и делает сам, как лучше.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Задача компилятора — обеспечить, чтобы наблюдаемое поведение программы совпадало с тем, что предписывает абстрактная машина языка С. Когда вы поймёте смысл этого предложения, то программировать станет сильно проще
- Сообщения: 355
- Зарегистрирован: Ср мар 09, 2016 08:07:41
давайте посмотрим, что там есть:
пересобрал с "Os" и
Код: Выделить всё
build/py/malloc.o: in function `m_malloc0':
malloc.c:(.text.m_malloc0+0x6): undefined reference to `calloc'
make: *** [Makefile:45: build/firmware.elf] Ошибка 1
$ arm-none-eabi-nm ./build/py/malloc.o
U calloc <--- ВОТ
U free
00000000 T m_free
00000000 T m_malloc
00000000 T m_malloc0
U m_malloc_fail
00000000 T m_malloc_maybe
00000000 T m_realloc
00000000 T m_realloc_maybe
U malloc
U realloc
Код: Выделить всё
$ arm-none-eabi-nm ./build/py/malloc.o
U free
00000000 T m_free
00000000 T m_malloc
00000000 T m_malloc0
U m_malloc_fail
00000000 T m_malloc_maybe
00000000 T m_realloc
00000000 T m_realloc_maybe
U malloc
U memset
U realloc
я понимаю смысл этого предложения. я не понимаю, откуда абстрактная машина языка Си берет ссылку на несуществующую функцию? calloc разве абсолютная часть стандартного языка Си? по-моему, это всего-навсего библиотечная функция, которая может быть, а может и не быть, и как раз задача компилятора не обращаться к несуществующим абстракциям, а использовать существующие.VladislavS писал(а): Пт июл 03, 2026 08:44:47 Задача компилятора — обеспечить, чтобы наблюдаемое поведение программы совпадало с тем, что предписывает абстрактная машина языка С. Когда вы поймёте смысл этого предложения
разве нет? только если нет, прошу не констатировать, а объяснить более понятно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 355
- Зарегистрирован: Ср мар 09, 2016 08:07:41
да.
стандарт https://www.open-std.org/jtc1/sc22/wg14 ... /n3220.pdf
параграф 7.24.3.2 , страница 365
чем больше о Си я узнаю, тем меньше он мне нравится... calloc - это часть библиотеки, если я не намеревался использовать библиотеки, выходит, компилятор за меня решение принимает?! как-то это не по-людски...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Не библиотеки, а языка. В библиотеке эта функция или нет - детали реализации. Не нравится - проходим мимо 
- Сообщения: 588
- Зарегистрирован: Пн фев 16, 2026 17:30:02
Не нравится Си - пишите на ассемблере. Или вообще на Питоне - на нем как раз все школьники нынче пишут, очень популярный изык. Че себя мучить тем, на что ума не хватает
- Сообщения: 355
- Зарегистрирован: Ср мар 09, 2016 08:07:41
ну так не линкийте стандартную библиотеку. но если нет аппаратного деления в микроконтроллере, функцию деления придется писать самому. тоже самое с плавающей точной, синусами, псевдослучаными числами и пр.
- Сообщения: 355
- Зарегистрирован: Ср мар 09, 2016 08:07:41
не умеете готовить - не мешайте другим. питон в разы сложнее СиRapra писал(а): Пт июл 03, 2026 13:16:14 Или вообще на Питоне - на нем как раз все школьники нынче пишут, очень популярный изык. Че себя мучить тем, на что ума не хватает
Код: Выделить всё
with open(out_file, "w", encoding="utf-8") as out:
out.write("FONT = \\\n")
for i in range(0, len(data), 16):
chunk = data[i:i+16]
hex_str = "".join(f"\\x{b:02x}" for b in chunk)
suffix = "\\" if i + 16 < len(data) else ""
out.write(f"\tb'{hex_str}'{suffix}\n")- Сообщения: 588
- Зарегистрирован: Пн фев 16, 2026 17:30:02
"Программировать" методом "вайб-кодинга" или стыривания из интернета готовых кусков кода и программировать по-настоящему — очень разные вещи.
Видел я, как школьники змеюку "хавают": вообще не понимают, что "их" код делает!
Питон не просто значительно сложней С, но еще и с уродским синтаксисом и почти полным отсутствием логики. Я вот змеюку не понимаю, да и никакого желания с ней разбираться нет: у меня нет задач, которые невозможно было бы на С решить. А учитывая то, что под змеюку до сих пор нет компилятора, она вообще не может называться языком программирования. Так - баловство какое-то.
Видел я, как школьники змеюку "хавают": вообще не понимают, что "их" код делает!
Питон не просто значительно сложней С, но еще и с уродским синтаксисом и почти полным отсутствием логики. Я вот змеюку не понимаю, да и никакого желания с ней разбираться нет: у меня нет задач, которые невозможно было бы на С решить. А учитывая то, что под змеюку до сих пор нет компилятора, она вообще не может называться языком программирования. Так - баловство какое-то.
Windows must die!
- Сообщения: 588
- Зарегистрирован: Пн фев 16, 2026 17:30:02
Ну почему ж баловство? Это язык достаточно высокого уровня абстракции. Для микроконтроллеров конечно слабо подходит, поскольку микроконтроллеры - это всё-таки больше "железо" чем софт.


