Известный разработчик Кит Паккард недавно объявил в своем блоге о запуске «picolibc». Picolibc – это библиотека C для встраиваемых систем, которая подходит для небольших микроконтроллеров,а стандартный API библиотеки C позволяет работать даже на устройствах с малой памятью (RAM). Это обновленная версия «newlib-nano» с несколькими интересными изменениями, которые включают замену «stdio» lib на специфичный для ATMEL код printf, принятый из avrlibc. Как часть этой библиотеки, Кит также запустил picocrt, который отвечает за инициализацию памяти и вызов различных конструкторов перед вызовом собственно программы на C.
Особенности
- picolibc является пересмотренной версией newlibc, без полноценной библиотеки stdio lib и использует облегченную библиотеку stdio lib от avrlibc, которая больше подходит для встраиваемых устройств с низким объемом памяти.
- Система сборки Meson упрощает процесс сборки дерева исходных кодов picolibc для различных целевых платформ и оборудования.
- Обновлен набор тестов для использования Glibc в качестве эталона
- Библиотека имеет лицензию BSD, а компоненты, не относящиеся к BSD, были удалены из исходного дерева.
- picocrt – код запуска picolibc инициализирует встраиваемую систему без необходимости написания собственного кода. Его можно включить с помощью -specs = picolibc.specs во время компиляции.
- Использует встроенное локальное хранилище потока(TLS), которое предлагает несколько преимуществ:
- Исходный код проще, так как локальные переменные потока
доступны напрямую по имени. - Локальное хранилище потока содержит только значения, используемые
программой. - Сгенерированный код меньше и быстрее.
- Исходный код проще, так как локальные переменные потока
Начало работы с picolibc
Picolibc использует систему сборки Meson для компиляции исходного дерева для различных аппаратных платформ с Linux-версией утилиты host с использованием GCC. Помимо параметров по умолчанию, эта библиотека позволяет создавать несколько атрибутов для включения и отключения различных функций с помощью строки атрибута ”-D =”.
Несмотря на то, что Picolibc работает на небольшой библиотеке stdio из avrlibc, у пользователя есть возможность включить старую библиотеку stlib newlibc с помощью атрибута (newlib-tinystdio = false). По умолчанию это будет newlib-tinystdio = true, что означает, что он будет скомпилирован с небольшой stdio на основе avrlibc.
Перед началом сборки picolibc вы должны убедиться, что система сборки Meson является частью вашей среды сборки. Пожалуйста, обратитесь к инструкциям по настройке Meson.
Как стандарт Meson, все конфигурации сборки для создания кросс-компиляции являются частью отдельных файлов конфигурации, которые являются частью исходного дерева. Ниже приведен пример файла конфигурации для различных сред сборки.
Файл конфигурации для RISC-V (cross-riscv32-unknown-elf.txt)
1 2 3 4 5 6 7 8 9 10 11 12 |
[ binaries ] c = 'riscv64-unknown-elf-gcc' ar = 'riscv64-unknown-elf-ar' as = 'riscv64-unknown-elf-as' ld = 'riscv64-unknown-elf-ld' strip = 'riscv64-unknown-elf-strip' [ host_machine ] system = 'unknown' cpu_family = 'riscv' cpu = 'riscv' endian = 'little' |
Компиляция исходного дерева picolibc с использованием Meson
Само исходное дерево предоставляет сценарии настройки для различных целей, включая riscv, arm, x86 и т. д. Ниже приведен пример сценария компиляции для целей arm.
1 2 3 4 5 6 7 8 |
#!/bin/sh ARCH = arm - none - eabi DIR = ` dirname $ 0 ` meson "$DIR" \ - Dincludedir = picolibc / $ARCH / include \ - Dlibdir = picolibc / $ARCH / lib \ -- cross - file "$DIR" / cross - $ARCH .txt \ " $@ " |
И как только вы будете готовы с Meson и желаемой кросс-компиляторной средой gcc lib, выполните шаги для сборки picolibc для определенных целей (для arm). Мы использовали тестовую среду сборки была Ubuntu 18.04.
Установка Meson
1 2 |
$ sudo apt - get install python3 python3 - pip python3 - setuptools python3 - wheels ninja - build $ pip install -- user meson |
Установите кросс-компилятор GCC (для arm)
1 |
$ sudo apt - get install gcc - arm - none - eabi |
Компиляция и сборка picolibc
1 2 3 4 5 |
$ mkdir build_picolibc _ arm $ cd build_picolibc _ arm $ ~ / picolibc / do - arm - configure ( define your binary file path , which will be part of the picolibc source tree ) $ ninja $ sudo ninja install |
После успешной сборки, вы можете провести проверку, запустив примеры тестовых приложений для printf и scanf в каталоге «test», который является частью папки сборки.
![](https://cnx-software.ru/wp-content/uploads/2019/10/Picolibc_SourceCode.png)
Процесс компиляции кода Picolibc
Picolibc использует файл GCC.spec для компиляции исходного кода. Устанавливаем путь к файлу заголовка системы и компоновщику, чтобы указать Picolibc. Ниже приведен пример для компиляции одного файла:
1 |
$ gcc -specs=picolibc.specs -c test.c |
Picocrt (picolibc.specs) – код запуска
Picocrt является частью picolib, названной crt0.o, включенной
по умолчанию при использовании -specs = picolibc.specs. Picocrt включает шаги инициализации:
- Архитектурная инициализация во время выполнения.
- Инициализация данных. Ссылка на фрагмент кода picocrt, который выполняет инициализацию данных –
1 |
memcpy(__data_start, __data_source, (uintptr_t) __data_size); |
-
-
- __data_start указывает на место ОЗУ, где начинается сегмент .data
- __data_source указывает на местоположение флэш-памяти, где находится сегмент .data
- __data_size является абсолютным символом, отмечающим размер инициализированного сегмента .data
-
- Инициализация BSS. Ссылка на фрагмент кода picocrt, который выполняет инициализацию данных –
1 |
memset(__bss_start, '\0', (uintptr_t) __bss_size); |
-
-
- __bss_start указывает на место ОЗУ, где начинается сегмент .bss
- __bss_size – абсолютный символ, отмечающий размер очищенного
сегмента данных
-
- Функции __libc_init_array и __libc_fini_array в Picolibc вызываются Picocrt во время запуска и завершения работы приложения (__libc_init_array () (AppStart) -> main () -> –libc_fini_array () (App Stop))
Рекомендации
Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.