ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
1300968 Топик полностью
VVB (14.04.2023 06:41, просмотров: 232) ответил IBAH на Эта штука компиляторазависимая, для ИАР нужно переопределить putchar() для stdout, для вывода по дескриптору переопределить fputc()
Эта штука не компиляторозависимая, а библиотекозависимая. 

Для GNU ARM Embeded tools используется newlib, это библиотека с возможностью TLS (Thread Local Storage) -- каждый поток имеет свой набор структур, необходимых для работы библиотечных функций "С" (например, read/write приводят к установке errno, и в разных задачах этот errno должен быть разным).

Достаточно реализовать системные вызовы, которые должны быть предоставлены пользователем этой библиотеки, и всё заработает.

https://sourceware.org/newlib/ раздел Docs/Red Hat newlib C Library Documentation/2 System Calls/2.1 Definitions for OS interface


GNU ARM Embedded tools предоставляет свои реализации этих системных вызовов в виде библиотек, это значит, что на этапе линковки можно без проблем подменить некоторые предоставленные реализации своими функциями с теми же самыми именами и сигнатурами.

Конкретно (например, putc): открываешь share/doc/gcc-arm-none-eabi/html/libc/putc.html и читаешь пару абзацев. Supporting OS subroutines required: close, fstat, isatty, lseek, read, sbrk, write.


Другие реализации стандартной библиотеки языка С (Rogue Wave в armcc, или ещё какая-то в IAR) имеют другие привязки с операционной системе (или их заглушки, если операционка не используется).