Компоненты разработки Huawei LiteOS
Компоненты — это составные части системы Huawei LiteOS, которые относятся к её приложениям. С точки зрения системного уровня, компоненты — это все пакеты программного обеспечения, кроме ядра, скриптов сборки, вспомогательных инструментов и системной библиотеки функций. В этом документе подробно описаны структура компонентов, их стандарты и процесс разработки, чтобы помочь разработчикам компонентов в их работе.
В системе Huawei LiteOS компоненты делятся на онлайн-компоненты и офлайн-компоненты. Исходный код онлайн-компонентов не хранится в репозитории кода Huawei LiteOS. Его необходимо загрузить из сети при использовании. Исходные коды офлайн-компонентов хранятся в репозитории кода Huawei LiteOS. Базовые компоненты, такие как сетевые и файловые системы, обычно являются офлайн-компонентами.
Далее на примере онлайн-компонента curl для Huawei LiteOS подробно описываются структура компонентов и управление ими.
Каталог и структура файлов
Создание нового компонента включает создание или изменение файлов и каталогов. Каталог components содержит файл Kconfig, Makefile и каталог online_components. Онлайн-компоненты хранят информацию о загрузке. Каталог utility содержит компонент curl и демонстрационные файлы curl. Файлы и каталоги, содержащиеся в каталогах components и utility, являются новыми каталогами и файлами. Остальные файлы являются общими для всех компонентов или демонстрационных версий, и они также должны быть изменены при создании нового компонента.
.
└── Huawei_LiteOS
├── components
│ ├── components.mk // Вызов первого слоя подкаталога .mk файла и экспорт всех общедоступных заголовочных файлов компонентов
│ ├── download.sh // Скрипт загрузки онлайн-компонентов
│ ├── Kconfig
│ ├── Makefile
│ └── online_components // Информация о загрузке онлайн-компонентов
│ ├── curl // Онлайн-компонент curl
│ │ ├── curl-7.54.1 // Исходный код компонента (удалить при отправке кода)
│ │ ├── curl-7.54.1.zip // Zip-архив исходного кода компонента (удалить при отправке кода)
│ │ ├── curl.mk // Файл управления общедоступными заголовочными файлами компонентов
│ │ ├── Kconfig // Конфигурационный файл компонента
│ │ ├── Makefile // Компиляционный файл компонента
│ │ ├── origin.patch // Исправления исходного кода
│ │ ├── patch.sha256 // Контрольная сумма SHA-256 файла исправлений
│ │ └── src.sha256 // Контрольная сумма SHA-256 исходного кода
│ └── Kconfig // Вызов файла Kconfig первого слоя подкаталогов
│ ├── Makefile // Вызов файла Makefile первого слоя подкаталогов
│ └── utility.mk // Вызов .mk файла первого слоя подкаталогов и экспорт общедоступных заголовочных файлов
├── demos
│ └── utility
│ ├── curl
│ │ ├── curl_demo.c
│ │ ├── curl_demo.h
│ │ ├── curl.mk
│ │ ├── Kconfig
│ │ ├── Makefile
│ │ └── README_CN.md
│ ├── Kconfig
│ ├── Makefile
│ └── utility.mk
└── targets
├── bsp
│ └── common
│ └── demo_entry.c // Вызовы входа для каждой демонстрации
└── bsp.mk // Связывание каждого компонента и демонстрационной версии с библиотекой скомпилированных файлов
Следует отметить:
online_components
Исходный код онлайн-компонентов необходимо загружать из сети. Информация о загрузке хранится в файле online_components, который имеет определённый формат и содержит информацию (или параметры) о каждом онлайн-компоненте. Каждый компонент имеет четыре параметра, разделённых символом &#&.
curl-7.54.1 &#& components/utility/curl &#& LOSCFG_COMPONENTS_CURL=y &#& https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.zip
Первый параметр — это имя исходного кода (обычно в формате «имя исходного кода — версия»).
Следует отметить, что это имя эквивалентно переименованию исходного кода. Оно может отличаться от имени, полученного при непосредственном скачивании с веб-страницы. Например, при прямом доступе к https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.zip файл скачивается как curl-curl-7_54_1.zip. После распаковки файла получается имя curl-curl-7_54_1. Однако скрипт download.sh переименует скачанный файл в соответствии с первым параметром и четвёртым параметром (тип загружаемого файла). После распаковки файл будет называться curl-7.54.1, то есть именем, указанным в первом параметре. Поэтому разработчики должны использовать имя, указанное в первом параметре, при разработке. Если имя скачанного файла отличается от указанного в первом параметре, рекомендуется переименовать файл в соответствии со спецификациями, прежде чем продолжить разработку.
Второй параметр — путь к компоненту (исходный код загружается в этот каталог).
Третий параметр — флаг включения компонента (используется для определения, следует ли загружать исходный код; этот флаг является конфигурационным элементом в файле Kconfig компонента).
Четвёртый параметр — адрес загрузки исходного кода или команда для получения исходного кода (рекомендуется загружать архивные файлы, так как их легче проверять).
Следует отметить, что в настоящее время поддерживаются следующие методы загрузки для онлайн-компонентов:
https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.zip
https://github.com/curl/curl/archive/refs/tags/curl-7_54_1.tar.gz
git clone -b curl-7.54.1 https://github.com/curl/curl.git`
download.sh
Скачивает исходный код и исправления для онлайн-компонентов и выполняет проверку SHA-256. После успешной проверки исправления добавляются в исходный код.
components/utility/curl
Каталог curl содержит исходный код и связанные файлы компонента curl. При добавлении нового компонента рекомендуется создавать каталог в соответствующем каталоге components (например, language, media, utility или security). Поскольку curl является компонентом утилиты, он находится в каталоге utility.
Имена каталогов должны соответствовать именам исходных кодов (не допускается сокращение, например, libpng не может быть сокращено до png) или общепринятым именам в отрасли.
components/utility/curl/curl-7.54.1
Исходный код компонента, имя каталога должно совпадать с именем, указанным в параметре первом файла online_components. Для онлайн-компонентов, загруженных с использованием скрипта download.sh, исходный код не нужно отправлять в репозиторий кода Huawei LiteOS. Только исходный код офлайн-компонентов должен быть отправлен.
src.sha256
Файл содержит контрольную сумму SHA-256 исходного кода компонента. Чтобы гарантировать нормальное использование компонента, необходимо убедиться, что исходный код, загруженный из сети, совпадает с исходным кодом, используемым при разработке компонента. LiteOS проверяет загруженный исходный код с помощью контрольной суммы SHA-256, чтобы убедиться в его подлинности. Поэтому при разработке компонентов необходимо вычислить контрольную сумму SHA-256 исходных файлов и скопировать её в файл src.sha256. Содержимое файла src.sha256 компонента curl выглядит следующим образом: 7eec2c7f863c17d8586e94255cd0c2934822f1ae3cb40283a892b46e44f93bdf curl-7.54.1.zip
Метод генерации контрольной суммы sha256:
sha256sum параметр один.zip > src.sha256 # sha256sum curl-7.54.1.zip > src.sha256
find параметр один -type f -print0 | xargs -0 sha256sum > src.sha256 # find curl-7.54.1 -type f -print0 | xargs -0 sha256sum > src.sha256
Примечание:
Файл с исправлениями исходного кода, который называется origin.patch и не может быть изменён. При разработке на Huawei LiteOS рекомендуется избегать прямого изменения открытого исходного кода. В случае необходимости внесения изменений следует создать файл origin.patch.
Создание файла origin.patch:
.
└── curl // 组件目录
├── a
│ └── curl-7.54.1 // 未修改的源代码
├── b
│ └── curl-7.54.1 // 修改后的源代码
├── curl-7.54.1
├── curl-7.54.1.zip // Исходный код в архиве
└── origin.patch // Файл с исправлениями
diff -Nur a/curl-7.54.1 b/curl-7.54.1 > orinig.patch
Примечание: Перед локальной проверкой убедитесь, что файл origin.patch находится в формате unix, так как при загрузке в LiteOS_Components он будет автоматически преобразован в формат unix. Если файл не соответствует формату unix во время локальной проверки, это может привести к сбою выполнения download.sh.
Контрольная сумма файла origin.patch называется patch.sha256 и не может быть изменена. Она используется для подтверждения правильности загруженного файла с исправлениями. Формат файла должен соответствовать формату src.patch.
Файл конфигурации компонента, используемый для включения компонента в меню LiteOS. При написании можно использовать существующие файлы Kconfig других компонентов в качестве образца. Основные правила синтаксиса можно найти самостоятельно или обратиться к официальной документации «kconfig-language.txt».
Содержание и описание файла components/utility/curl/Kconfig:
config LOSCFG_COMPONENTS_CURL # Конфигурационный параметр: обычно фиксирован как "LOSCFG_COMPONENTS_каталог"
bool "Enable Curl" # bool: тип конфигурационного параметра; Enable Curl: подсказка для конфигурационного параметра
select LOSCFG_COMPONENTS_NET_LWIP # Зависимость: если зависит от других компонентов, укажите зависимость
select LOSCFG_COMPONENTS_FS_FATFS
default n # По умолчанию компонент не включён
help
Answer y to enable curl. # Помощь: описание этого конфигурационного параметра
При добавлении нового компонента необходимо создать файл Kconfig для этого компонента в его собственном каталоге, а также внести изменения в файл Kconfig родительского каталога. Этот файл используется для вызова файлов Kconfig дочерних каталогов. Содержимое файла components/utility/Kconfig включает все файлы Kconfig компонентов в каталоге utility.
menu "Utility" # Меню
source "components/utility/bidireference/Kconfig"
source "components/utility/curl/Kconfig" # Новое содержимое
source "components/utility/freetype/Kconfig"
source "components/utility/iconv/Kconfig"
source "components/utility/iniparser/Kconfig"
source "components/utility/json-c/Kconfig"
source "components/utility/libxml2/Kconfig"
endmenu
Файлы .mk используются для экспорта внешних заголовков компонентов, которые могут использоваться другими компонентами или модулями. Чтобы избежать путаницы в заголовках, LiteOS использует файлы .mk для управления и ограничения внешних заголовков компонентов и последовательно экспортирует интерфейсы компонентов через файлы .mk в каждом каталоге. Наконец, все внешние заголовки компонентов предоставляются через components.mk.
Новые компоненты обычно включают следующие файлы .mk:
Например, curl.mk и utility.mk:
####################### curl.mk содержание следующее ########################
CURL_VERSION=curl-7.54.1 # Версия компонента
COMPONENTS_CURL_INCLUDE := \
-I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/include \
-I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/src
##################### utility.mk содержание следующее #######################
ifeq ($(LOSCFG_COMPONENTS_CURL), y) # Только когда компонент включён, выполните следующие действия
include $(LITEOSTOPDIR)/components/utility/curl/curl.mk # Вызов файлов .mk дочерних каталогов
COMPONENTS_UTILITY_INCLUDE += $(COMPONENTS_CURL_INCLUDE) # Экспорт внешних заголовков этого компонента
endif
Правила оформления и пояснения:
Если требуется отступ, используйте четыре пробела, обратите внимание, что табуляция не должна использоваться.
Файл компиляции компонентов, используется для добавления компонента в структуру компиляции компонентов Huawei LiteOS. При добавлении нового компонента необходимо создать этот файл в каталоге компонента, чтобы реализовать компиляцию компонента. Содержимое файла Makefile компонентов:
include $(LITEOSTOPDIR)/config.mk
include $(LITEOSTOPDIR)/components/net/lwip/lwip.mk
include $(LITEOSTOPDIR)/components/utility/curl/curl.mk
MODULE_NAME := $(notdir $(CURDIR)) # $(notdir $(CURDIR)) эквивалентно curl
LOCAL_SRCS_y :=
LOCAL_DIRS_y :=
LOCAL_DIRS_y += $(CURL_VERSION)/lib
LOCAL_DIRS_y += $(CURL_VERSION)/lib/vauth
LOCAL_DIRS_y += $(CURL_VERSION)/lib/vtls
LOCAL_DIRS_Y += $(CURL_VERSION)/src
LOCAL_INCLUDE := $(LWIP_INCLUDE)
LOCAL_INCLUDE += \
-I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/lib \
-I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/include \
-I $(LITEOSTOPDIR)/components/utility/curl/$(CURL_VERSION)/src
LOCAL_SRCS_y += $(foreach dir, $(LOCAL_DIRS_y), $(wildcard $(dir)/*.c))
LOCAL_SRCS = $(LOCAL_SRCS_y)
LOCAL_EXT_FLAG := -Wno-error -Wno-implicit-function-declaration -Wno-unused-variable
CURL_DEFS = \
-D HAVE_CONFIG_H \
-D BUILDING_LIBCURL
LOCAL_FLAGS := $(LOCAL_INCLUDE) $(CURL_DEFS) $(LOCAL_EXT_FLAG)
include $(MODULE)
Далее объясняются несколько важных параметров (некоторые параметры не являются обязательными для каждого файла Makefile, пожалуйста, выберите писать или не писать в соответствии с фактическими потребностями):
Примечание: Если имя компонента само по себе начинается с lib, то имя модуля не должно включать lib, например, libpng следует записать как png, а не как libpng, чтобы избежать создания имени статической библиотеки liblibpng.a.
Этот файл используется для вызова файла Makefile следующего уровня подкаталога. Содержимое файла Makefile родительского каталога:
include $(LITEOSTOPDIR)/config.mk
MODULE_$(LOSCFG_COMPONENTS_BIDIREFERENCE) += bidireference
MODULE_$(LOSCFG_COMPONENTS_CURL) += curl # новое содержание этого выпуска
MODULE_$(LOSCFG_COMPONENTS_FREETYPE) += freetype
MODULE_$(LOSCFG_COMPONENTS_ICONV) += iconv
MODULE_$(LOSCFG_COMPONENTS_INIPARSER) += iniparser
MODULE_$(LOSCFG_COMPONENTS_JSON_C) += json-c
MODULE_$(LOSCFG_COMPONENTS_LIBXML2) += libxml2
include $(MODULE)
LOSCFG_COMPONENTS_CURL — это элемент конфигурации Kconfig компонента, MODULE_$(LOSCFG_COMPONENTS_CURL) указывает, что компонент скомпилирован только после включения компонента.
В принципе, каждый компонент должен предоставлять демонстрационный пример, который должен быть разработан самостоятельно и не может напрямую копировать код из сети. Каждый демонстрационный пример может предоставить только один внешний интерфейс, который вызывается единообразно в файле demo_entry.c.
Huawei LiteOS использует структуру компиляции компонентов, и после завершения компиляции каждого компонента или демонстрационного примера соответствующий файл статической библиотеки будет создан в каталоге out. Поскольку Windows не может автоматически связывать файлы статических библиотек, необходимо выполнить ручное связывание в файле bsp.mk. Например, добавьте ссылки на файлы статических библиотек curl и демонстрационных примеров:
ifneq ($(OS), Linux)
ifeq ($(LOSCFG_COMPONENTS_CURL), y)
LITEOS_BASELIB += -lcurl # curl — это имя модуля компонента
endif
ifeq ($(LOSCFG_DEMOS_CURL), y)
LITEOS_BASELIB += -lcurl_demo # curl_demo — это имя демонстрационного модуля
endif
endif
Вход всех демонстрационных примеров, после завершения демонстрационного примера, единообразно вызывается в функции DemoEntry в этом файле.
#ifdef LOSCFG_DEMOS_CURL
#include "curl_demo.h"
#endif
VOID DemoEntry(VOID)
{
#ifdef LOSCFG_DEMOS_CURL
CurlDemoTask();
#endif
}
Примечание: Вызов функции должен осуществляться способом #include заголовочный файл, а не способом extern.
Скачайте исходный код Huawei LiteOS. После выполнения команды make menuconfig в корне исходного кода Huawei LiteOS автоматически вызывается сценарий download.sh, который считывает содержимое файла online_components для получения информации о загрузке компонентов, определяет, включен ли компонент, и, если он уже включен, продолжает определять, существует ли исходный код компонента, если нет, загружает исходный код компонента, origin.patch, src.sha256 и patch.sha256. С помощью файлов .sha256 определите, правильно ли загружены исходный код компонента и файл origin.patch. Если они верны, выполните исправление, завершите процесс загрузки онлайн-компонента.
Примечание: Если вы хотите повторно загрузить исходный код и патч, вам необходимо удалить существующие исходные коды и патчи в вашей локальной среде. Кроме того, во время выполнения сценария, если внешнее прерывание сигнала, такое как ctrl z, ctrl c и т. д., принудительно останавливает выполнение сценария, это может привести к сбою процесса загрузки, поэтому рекомендуется своевременно очистить файлы, оставшиеся от этой загрузки.
После завершения настройки проекта в инструменте разработки HUAWEI LiteOS Studio автоматически вызывается файл download.sh. Остальная логика такая же, как и на платформе Linux.
Завершив всю работу по разработке компонентов, необходимо протестировать компоненты, чтобы убедиться, что процесс загрузки онлайн-компонентов выполнен успешно.
После успешного тестирования компонентов код можно отправить в различные репозитории исходного кода Huawei LiteOS. Требования к отправке кода следующие:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )