PicoLibC-это легкая библиотека C для встраиваемых систем


Известный разработчик Кит Паккард недавно объявил в своем блоге о запуске «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)

Компиляция исходного дерева picolibc с использованием Meson

Само исходное дерево предоставляет сценарии настройки для различных целей, включая riscv, arm, x86 и т. д. Ниже приведен пример сценария компиляции для целей arm.

И как только вы будете готовы с Meson и желаемой кросс-компиляторной средой gcc lib, выполните шаги для сборки picolibc для определенных целей (для arm). Мы использовали тестовую среду сборки была Ubuntu 18.04.

Установка Meson

Установите кросс-компилятор GCC (для arm)

Компиляция и сборка picolibc 

После успешной сборки, вы можете провести проверку, запустив примеры тестовых приложений для printf и scanf в каталоге «test», который является частью папки сборки.

Процесс компиляции кода Picolibc

Picolibc использует файл GCC.spec для компиляции исходного кода. Устанавливаем путь к файлу заголовка системы и компоновщику, чтобы указать Picolibc. Ниже приведен пример для компиляции одного файла:

Picocrt (picolibc.specs) — код запуска

Picocrt является частью picolib, названной crt0.o, включенной
по умолчанию при использовании -specs = picolibc.specs. Picocrt включает шаги инициализации:

  • Архитектурная инициализация во время выполнения.
  • Инициализация данных. Ссылка на фрагмент кода picocrt, который выполняет инициализацию данных —
      • __data_start указывает на место ОЗУ, где начинается сегмент .data
      • __data_source указывает на местоположение флэш-памяти, где находится сегмент .data
      • __data_size является абсолютным символом, отмечающим размер инициализированного сегмента .data
  • Инициализация BSS.  Ссылка на фрагмент кода picocrt, который выполняет инициализацию данных —
      • __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.

Оригинал статьи вы можете прочитать здесь.

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.