برای ترویج توسعه آزاد و باز، OpenThread از CMake در زنجیره ابزار ساخت استفاده می کند. در حال حاضر، این زنجیره ابزار برای انتقال OpenThread به یک پلت فرم سخت افزاری جدید مورد نیاز است.
دیگر زنجیرههای ابزار ساخت ممکن است در آینده پشتیبانی شوند، اما آنها در محدوده این راهنمای انتقال نیستند.
یک مخزن جدید ایجاد کنید
اولین قدم این است که یک خانه جدید برای پلتفرم سخت افزاری خود راه اندازی کنید. در این راهنما، ما یک مخزن جدید به نام ot-efr32 ایجاد خواهیم کرد که حاوی لایه انتزاعی پلتفرم، SDK پلتفرم سخت افزاری و چند اسکریپت مفید است.
در این مثال، ما مخزن SiliconLabs/ot-efr32 را در GitHub ایجاد کردیم و آن را به ~/repos/ot-efr32 کلون کردیم.
mkdir -p ~/reposcd ~/reposgit clone git@github.com:SiliconLabs/ot-efr32.gitCloning into 'ot-efr32'... remote: Enumerating objects: 99, done. remote: Counting objects: 100% (99/99), done. remote: Compressing objects: 100% (60/60), done. remote: Total 333 (delta 65), reused 39 (delta 39), pack-reused 234 Receiving objects: 100% (333/333), 170.78 KiB | 5.69 MiB/s, done. Resolving deltas: 100% (194/194), done.git statusOn branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean
ساختار مخزن
برای کمک به حفظ سازگاری با مخازن پلتفرم موجود در سازمان OpenThread GitHub، ممکن است بخواهید مخزن خود را به این صورت ساختار دهید:
tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
| پوشه | توضیحات |
|---|---|
examples | برنامه های کاربردی نمونه اختیاری |
openthread | مخزن openthread به عنوان یک زیر ماژول |
script | اسکریپت هایی برای ساخت، آزمایش، پرده زدن |
src | اجرای لایه انتزاعی پلت فرم |
third_party | مکان برای هر منبع شخص ثالث |
اضافه کردن زیر ماژول ها
مرحله بعدی اضافه کردن openthread و هر مخزن مورد نیاز دیگر به عنوان زیر ماژول است
git submodule add git@github.com:openthread/openthread.git
Cloning into '/home/user/repos/ot-efr32/openthread'...
remote: Enumerating objects: 78281, done.
remote: Counting objects: 100% (1056/1056), done.
remote: Compressing objects: 100% (488/488), done.
remote: Total 78281 (delta 639), reused 864 (delta 556), pack-reused 77225
Receiving objects: 100% (78281/78281), 76.62 MiB | 35.24 MiB/s, done.
Resolving deltas: 100% (61292/61292), done.
برای این مثال، ما یک نسخه ساده از Silicon Labs Gecko SDK را به عنوان یک ماژول فرعی در third_party اضافه خواهیم کرد.
cd third_partygit submodule add git@github.com:SiliconLabs/sdk_support.gitCloning into '/home/user/repos/ot-efr32/third_party/sdk_support'... remote: Enumerating objects: 32867, done. remote: Counting objects: 100% (8181/8181), done. remote: Compressing objects: 100% (3098/3098), done. remote: Total 32867 (delta 4945), reused 7469 (delta 4732), pack-reused 24686 Receiving objects: 100% (32867/32867), 128.83 MiB | 30.91 MiB/s, done. Resolving deltas: 100% (19797/19797), done.
اسکریپت ها
برای آسانتر کردن کارهای رایج، ممکن است بخواهید چند اسکریپت در پوشه script ایجاد کنید. این ممکن است شامل اسکریپت هایی برای کارهایی مانند بوت استرپینگ، ساختن، اجرای کد-لینتر و یک اسکریپت آزمایشی برای بررسی های GitHub CI باشد.
در زیر چند نمونه از اسکریپت هایی که برای اکثر مخازن پلتفرم موجود استاندارد هستند آورده شده است.
bootstrap
این اسکریپت باید تمام ابزارها و بسته های مورد نیاز پلتفرم سخت افزاری شما را نصب کند. همچنین باید اسکریپت بوت استرپ openthread را اجرا کند تا اطمینان حاصل شود که کاربر همه چیز مورد نیاز برای ساخت پشته OpenThread را دارد.
برای مثال به اسکریپت بوت استرپ در ot-efr32 مراجعه کنید.
build
اسکریپت ساخت CMake باید به کاربران اجازه دهد تا پشته OpenThread را برای پلتفرم شما بسازند. اگر مخزن شما نمونهای از برنامههای کاربردی را تعریف میکند، این اسکریپت باید آنها را نیز بسازد. این اسکریپت باید شامل گزینه های اصلی پیکربندی سیستم، از جمله هر گونه تعاریف ماکرو مخصوص پلتفرم باشد.
برای مثال اسکریپت ساخت را در ot-efr32 ببینید.
test
یک اسکریپت تست ممکن است برای کاربران مفید باشد تا تغییرات را با استفاده از هر تستی که شما تعریف کرده اید آزمایش کنند. این می تواند هر چیزی به سادگی اجرای ساخت های بررسی سلامت عقل یا به پیچیدگی راه اندازی یک مجموعه تست واحد باشد.
در ot-efr32 ، اسکریپت به سادگی اسکریپت build را برای هر برد پشتیبانی شده در هر یک از پلتفرم های efr32 اجرا می کند.
برای نمونه به اسکریپت تست در ot-efr32 مراجعه کنید.
make-pretty
برای حفظ یک ظاهر ثابت، این اسکریپت باید کد، اسکریپت ها و فایل های علامت گذاری را قالب بندی کند.
ممکن است خودتان این اسکریپت را تعریف کنید، اما استفاده از اسکریپت make-pretty که مخازن پلتفرم موجود از آن استفاده میکنند، راحتتر است. این اسکریپت اسکریپتهای سبک openthread را فراخوانی میکند و به اطمینان از یکنواختی سبک در تمام مخازن OpenThread کمک میکند.
پیکربندی اسکریپت لینکر
اسکریپت GNU Linker نحوه نگاشت تمام بخشها در فایلهای ورودی ( .o فایلهای "شیء" تولید شده توسط مجموعه کامپایلر گنو (GCC)) را به فایل خروجی نهایی (به عنوان مثال، .elf ) توضیح میدهد. همچنین مکان ذخیره سازی هر بخش از یک برنامه اجرایی و همچنین آدرس ورودی را تعیین می کند. اسکریپت پیوند دهنده مخصوص پلتفرم اغلب با BSP پلتفرم ارائه می شود.
ابزار ld را پیکربندی کنید تا با استفاده از target_link_libraries در CMake target پلتفرم خود در src/CMakeLists.txt به اسکریپت پیوند دهنده مخصوص پلتفرم اشاره کند:
set(LD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/efr32mg12.ld")
target_link_libraries(openthread-efr32mg12
PRIVATE
ot-config
PUBLIC
-T${LD_FILE}
-Wl,--gc-sections -Wl,-Map=$.map
)
کد راه اندازی Toolchain
کد راه اندازی زنجیره ابزار اغلب همراه با BSP پلتفرم ارائه می شود. این کد معمولا:
- تابع ورودی (
Reset_Handler) برنامه اجرایی را پیاده سازی می کند - جدول برداری وقفه را تعریف می کند
- Heap and Stack را راه اندازی می کند
- بخش
.dataاز حافظه غیر فرار در RAM کپی می کند - برای اجرای منطق برنامه به تابع اصلی برنامه می پرد
کد راهاندازی (کد منبع C یا اسمبلی) باید در کتابخانه openthread- platform-name پلتفرم شما گنجانده شود، در غیر این صورت برخی از متغیرهای کلیدی مورد استفاده در اسکریپت پیوند دهنده نمیتوانند به درستی نقل قول شوند:
-
src/CMakeLists.txt
مثال : startup-gcc.c در ot-cc2538 - src/CMakeLists.txt
add_library(openthread-cc2538
alarm.c
...
startup-gcc.c
...
system.c
logging.c
uart.c
$
)
