По всему тексту «SDK» относится к Raspberry Pi Pico SDK. Исходный код, включенный в документацию, защищен авторскими правами © 2020 Raspberry Pi (Trading) Ltd ( RPTL) под лицензией 3-Clause BSD.

RPTL предоставляет пользователям разрешение на использование РЕСУРСОВ исключительно в сочетании с продуктами Raspberry Pi. Любые другие виды использования РЕСУРСОВ запрещены.

RPTL и автор этого вольного перевода не несут за Ваши действия ни какой ответственности и не дают ни каких гарантий.

О SDK

SDK (Software Development Kit) предоставляет заголовки, библиотеки и систему сборки, необходимые для написания программ для устройств на базе микроконтроллера RP2040, таких как Raspberry Pi Pico, на языке ассемблера C, C++ или Arm.

SDK предназначен для предоставления API и среды программирования для разработчиков знакомых как с невстроенным C (non-embedded C) так и встроенным C (embedded C). В одно время, на устройстве запускается одна программа с функцией main().

Стандартные библиотеки C/C++ поддерживаются вместе с API для доступа к оборудованию RP2040, включая DMA, IRQ, а также широкий спектр периферийных устройств с встроенным функционалом и PIO (программируемый ввод-вывод).

Кроме того, SDK предоставляет библиотеки более высокого уровня для работы с таймерами, USB, синхронизацией и многоядерными процессорами. программирование, а также дополнительные высокоуровневые функции, созданные с использованием PIO, такие как аудио. Эти библиотеки должны быть достаточно всеобъемлющим, чтобы ваш код приложения редко, если вообще нуждался в прямом доступе к аппаратным регистрам. Однако, если вам нужно или вы предпочитаете доступ к необработанному оборудованию, вы также найдете полное и полностью прокомментированное определение регистра. заголовки в SDK. Нет необходимости искать адреса в таблице данных.

SDK можно использовать для создания чего угодно: от простых приложений до полноценных сред выполнения, таких как MicroPython до низкоуровневого программного обеспечения, такого как встроенный загрузчик RP2040.

В этой книге описаны API-интерфейсы SDK, объясняется внутреннее устройство и общий дизайн SDK, а также исследуется некоторые более глубокие темы, такие как использование ассемблера PIO для создания новых интерфейсов для внешнего оборудования. Для быстрый старт с настройкой SDK и написанием программ SDK. Начало работы с Raspberry Pi Pico лучшее место для начала.

Анатомия приложения SDK

Прежде чем полностью углубиться в наш обход SDK, стоит получить немного широты, взглянув на один из Примеры SDK более подробно описаны в разделе Начало работы с Raspberry Pi Pico.

/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "pico/stdlib.h"

int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning blink example requires a board with a regular LED
#else
    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while (true) {
        gpio_put(LED_PIN, 1);
        sleep_ms(250);
        gpio_put(LED_PIN, 0);
        sleep_ms(250);
    }
#endif
}

Эта программа состоит только из одного файла Cи с одной функцией. Так же как и в любой другой среде программирования на Cи, функция, с именем main(), является специальной, это точка, в которой среда выполнения языка впервые передает управление вашей программе, после таких вещей, как инициализация статических переменных их значениями. В SDK функция main() не принимает никаких аргументов. Довольно часто функция main() не возвращает значение, как показано здесь.

Замечание: Код возврата из main() игнорируется средой выполнения SDK, и поведение по умолчанию — зависание процессора после завершения.

В верхней части файла Cи мы включаем заголовок с именем pico/stdlib.h. Это зонтичный заголовок, который втягивает некоторые другие часто используемые заголовки. В частности, здесь нужны hardware/gpio.h, который используется для доступа к общему целевых операций ввода-вывода на RP2040 (здесь работает gpio_xxx) и pico/time.h, который содержит, среди прочего, sleep_ms функция. Вообще говоря, библиотека, имя которой начинается с pico, предоставляет высокоуровневые API и концепции или агрегаты. меньшие интерфейсы; имя, начинающееся с аппаратного обеспечения, указывает на более тонкую абстракцию между вашим кодом и встроенным аппаратным обеспечением RP2040.

Итак, используя в основном библиотеки hardware_gpio и pico_time, эта программа на C будет мигать светодиодом, подключенным к GPIO25, и выключен, два раза в секунду, навсегда (или, по крайней мере, до отключения). В каталоге, содержащем файл C (вы можете нажать на ссылку над исходным списком, чтобы перейти туда), есть еще один файл, который находится рядом с ним.

Структура каталога pico-examples/blink

blink
├── blink.c
└── CMakeLists.txt
0 directories, 2 files

Второй файл — это файл CMake, который сообщает SDK, как превратить файл C в двоичное приложение для процессора на базе RP2040. плата микроконтроллера. В последующих разделах будет подробно описано, что такое CMake и почему он используется, но мы можем посмотреть на содержимое этого файла, не погрязнув в этих деталях.

add_executable(blink
        blink.c
        )

# pull in common dependencies
target_link_libraries(blink pico_stdlib)

# create map/bin/hex file etc.
pico_add_extra_outputs(blink)

# add url via pico_set_program_url
example_auto_set_url(blink)

Функция add_executable в этом файле объявляет, что программа с именем blink должна быть собрана из C-файла, показанного ранее.

Это также целевое имя, используемое для сборки программы: в репозитории pico-examples вы можете сказать make blink в своём build, и это имя происходит от этой строки. Вы можете иметь несколько исполняемых файлов в одном проекте, и репозиторий picoexamples является одним из таких проектов.

target_link_libraries использует функциональность SDK, необходимую нашей программе. Если вы не попросите библиотеку, это не отображается в двоичном файле вашей программы. Так же, как pico/stdlib.h — это зонтичный заголовок, который включает в себя такие вещи, как pico/time.h. и hardware/gpio.h, pico_stdlib — это зонтичная библиотека, которая делает такие библиотеки, как pico_time и hardware_gpio, доступными для вашей сборки, чтобы эти заголовки можно было включить в первую очередь, а дополнительные исходные файлы C были скомпилированы и связаны.

Если вам нужны менее распространенные функции, такие как доступ к оборудованию DMA, вы можете вызвать эти библиотеки здесь (например, перечисление hardware_dma до или после pico_stdlib).

Мы могли бы закончить файл CMake здесь, и этого было бы достаточно для сборки программы blink. По умолчанию сборка будет создайте файл ELF (исполняемый компоновочный формат), содержащий весь ваш код и библиотеки SDK, которые он использует. Вы можете загрузить ELF в ОЗУ RP2040 или внешнюю флэш-память через порт Serial Wire Debug с настройкой отладчика, такой как gdb и опенокд. Часто проще запрограммировать Raspberry Pi Pico или другую плату RP2040 напрямую через USB с помощью BOOTSEL. режиме, и для этого требуется другой тип файла, называемый UF2, который служит здесь той же цели, что и файл ELF, но сконструирован таким образом, чтобы легче переносить суровые условия переноса USB-накопителей. Функция pico_add_extra_outputs объявляет, что вы хотите создать файл UF2, а также некоторые полезные дополнительные выходные данные сборки, такие как дизассемблирование и сопоставление файлы.

Замечание: Файл ELF преобразуется в UF2 с помощью внутреннего инструмента SDK под названием elf2uf2, который загружается автоматически как часть процесса сборки.

Функция example_auto_set_url связана с тем, как вы можете прочитать этот исходный файл в этом документе, который вы читаете. прямо сейчас и щелкните ссылки, чтобы перейти к списку на GitHub. Вы увидите это в приложениях pico-examples, но это не так. необходимо в ваших собственных программах. Вы видите, как делается колбаса.

Наконец, краткое примечание о библиотеке pico_stdlib. Помимо общего оборудования и высокоуровневых библиотек, таких как hardware_gpio и pico_time, он также извлекает такие компоненты, как pico_standard_link, который содержит скрипты компоновщика и crt0 для SDK, и pico_runtime, который содержит код, работающий между crt0 и main(), приводящий систему в состояние, готовое к запуску кода, перевод таких вещей, как часы и перезагрузка, в безопасное начальное состояние. Это невероятно низкоуровневые компоненты, которые большинство пользователей не нужно будет беспокоиться о. Причина, по которой они упоминаются, состоит в том, чтобы указать, что они в конечном счете являются явными зависимости .вашей программы, и вы можете отказаться от их использования, продолжая строить с помощью SDK и используя такие вещи, как аппаратные библиотеки.