Tertanam libc 's Artistry adalah implementasi perpustakaan standar C yang ditargetkan yang ditargetkan untuk sistem tertanam berbasis mikrokontroler.
Untuk melestarikan sumber daya memori yang berharga, perpustakaan ini tidak menyediakan implementasi perpustakaan standar C lengkap. Sebaliknya, subset fungsi yang berguna pada sistem tertanam logam telanjang telah dipilih. Jika Anda memiliki sistem tertanam berbasis logam atau RTOS, perpustakaan ini untuk Anda!
Tidak seperti banyak perpustakaan C lainnya yang saya temui, perpustakaan ini mengimplementasikan tes unit dan telah membahas kelemahan lama dalam implementasi sumber terbuka dari fungsi perpustakaan standar C. Kami terus menambahkan tes dan membuat perbaikan tambahan atas implementasi dasar.
malloc dan free tidak termasuk dalam perpustakaan ini. Jika Anda membutuhkan dukungan alokasi memori dinamis, Anda perlu memasangkan perpustakaan ini dengan sesuatu seperti libmemory seni tertanam, yang berisi implementasi malloc dan free .
Jika Anda tertarik untuk berkontribusi pada proyek ini, silakan baca panduan CONTRIBUTING .
libc Seni Tertanam dimaksudkan untuk menyediakan serangkaian fungsi perpustakaan standar C portabel yang memungkinkan pembagian cepat sistem tertanam berbasis logam dan RTOS baru.
Selain itu, kami ingin memberikan implementasi libc berkualitas tinggi dengan memastikan bahwa setiap fungsi memiliki cakupan uji unit dan mengatasi kelemahan yang diekspos oleh penganalisa statis. Banyak Implementasi Fungsi Perpustakaan C tetap belum teruji dan mengandung kesalahan. Kami berjuang melawan implementasi yang buruk.
Untuk menghemat memori, perpustakaan ini tidak menyediakan fungsionalitas perpustakaan standar C lengkap. Sebaliknya, subset fungsi yang berguna pada sistem tertanam logam telanjang telah dipilih. Pilihan ini terutama didorong oleh pengalaman saya sendiri dalam pengembangan yang berfokus pada mikrokontroler. Jika Anda memerlukan fitur tambahan, silakan mengajukan masalah dan membuat permintaan fitur.
Implementasi fungsional di perpustakaan ini telah dipilih untuk portabilitas dan pembagian cepat sistem baru. Mungkin ada implementasi yang lebih efisien untuk fungsi -fungsi ini, tetapi seringkali mereka adalah implementasi spesifik arsitektur. Jika Anda memiliki saran untuk meningkatkan kinerja, kami selalu senang mendengarnya.
malloc dan free tidak termasuk dalam perpustakaan ini. Karena skema alokasi memori sangat bervariasi dengan sistem tertanam (beberapa bahkan tidak memungkinkan memori dinamis), Anda perlu memasok implementasi Anda sendiri berdasarkan kebutuhan sistem Anda. Anda dapat memasangkan perpustakaan ini dengan libmemory seni tertanam, yang berisi implementasi malloc dan free .
Perpustakaan ini menyediakan implementasi yang cukup lengkap untuk menyusun dan tautan Cloat's libc++ dan libc++abi (lihat proyek LIBCPP seni tertanam). Untuk mencapai hal ini, beberapa fungsi hanya didefinisikan dalam header tetapi tidak memiliki implementasi. Fungsi yang tidak didukung tetapi ditentukan dapat dihapus menggunakan opsi build ( hide-unimplemented-libc-apis ).
Bagian berikut dari perpustakaan C telah diimplementasikan:
assertcrt.c , exit , atexit , dll.)atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrandreallocstrtoX (banyak melalui gdtoa )printf (sebagian besar via embeddedartistry/printf , berdasarkan eyalroz/printf dan aslinya mpaland/printf )putcharputstime dan asctime()wchar dan fungsi wctype Selain itu, perpustakaan ini menyediakan implementasi untuk __stack_chk_guard dan __stack_chk_fail .
Arsitektur berikut ini didukung:
Tes unit berikut perlu ditambahkan:
reallocrandIni tidak diimplementasikan oleh dapat ditambahkan di masa depan:
wcharerrno (diaktifkan sebagai sakelar waktu kompilasi)getopttimeFILE dan fungsi stdio tambahanKami saat ini tidak merencanakan dukungan penuh untuk:
localeProyek ini menggunakan sistem pembuatan meson standar seni tertanam, dan ketergantungan dijelaskan secara rinci di situs web kami.
Minimal Anda akan membutuhkan:
git-lfs , yang digunakan untuk menyimpan file biner di repositori ini Proyek ini menyimpan beberapa file menggunakan git-lfs .
Untuk menginstal git-lfs di Linux:
sudo apt install git-lfs
Untuk menginstal git-lfs di macOS:
brew install git-lfs
Instruksi instalasi tambahan dapat ditemukan di situs web git-lfs .
Sistem pembuatan meson tergantung pada python3 dan ninja-build .
Untuk menginstal di Linux:
sudo apt-get install python3 python3-pip ninja-build
Untuk menginstal di OSX:
brew install python3 ninja
Meson dapat dipasang melalui pip3 :
pip3 install meson
Jika Anda ingin menginstal meson secara global di Linux, gunakan:
sudo -H pip3 install meson
Proyek ini menggunakan git-lfs , jadi silakan instal sebelum kloning. Jika Anda mengkloning sebelum memasang git-lfs , cukup jalankan git lfs pull setelah instalasi.
Proyek ini di -host di GitHub. Anda dapat mengkloning proyek secara langsung menggunakan perintah ini:
git clone --recursive [email protected]:embeddedartistry/libc.git
Jika Anda tidak mengkloning secara rekursif, pastikan untuk menjalankan perintah berikut di repositori atau bangunan Anda akan gagal:
git submodule update --init
Jika Make diinstal, perpustakaan dapat dibangun dengan mengeluarkan perintah berikut:
make
Ini akan membangun semua target untuk arsitektur Anda saat ini.
Anda dapat membersihkan bangunan menggunakan:
make clean
Anda dapat menghilangkan folder buildresults yang dihasilkan menggunakan:
make distclean
Anda juga dapat menggunakan meson secara langsung untuk menyusun.
Buat folder output build:
meson buildresults
Dan membangun semua target dengan berlari
ninja -C buildresults
Kompilasi silang ditangani menggunakan file silang meson . Contoh file disertakan dalam folder build/cross . Anda dapat menulis file silang Anda sendiri untuk prosesor spesifik Anda dengan mendefinisikan bendera toolchain, bendera kompilasi, dan bendera linker. Pengaturan ini akan digunakan untuk mengkompilasi libc . (Atau buka masalah dan kami dapat membantu Anda).
Kompilasi silang harus dikonfigurasi menggunakan perintah meson saat membuat folder output build. Misalnya:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
Setelah itu, Anda dapat menjalankan make (di Root Proyek) atau ninja untuk membangun proyek.
Tes tidak akan dikompilasi silang. Mereka hanya akan dibangun untuk platform asli.
Instruksi lengkap untuk membangun proyek, menggunakan alternatif toolchains, dan menjalankan alat pendukung didokumentasikan dalam sistem pembuatan meson standar seni tertanam di situs web kami.
Posisi kode independen (pic) diaktifkan secara default, tetapi dapat dinonaktifkan selama tahap konfigurasi meson dengan mengatur opsi bawaan b_staticpic ke false :
meson buildresults -Db_staticpic=false
Link-Time Optimization (LTO) dapat diaktifkan selama tahap konfigurasi meson dengan mengatur opsi bawaan b_lto ke true :
meson buildresults -Db_lto=true
Ini dapat dikombinasikan dengan opsi build lainnya.
Jika Anda tidak menggunakan meson untuk proyek Anda, metode terbaik untuk menggunakan proyek ini adalah membangunnya secara terpisah dan menyalin header dan konten perpustakaan ke pohon sumber Anda.
include/ direktori ke pohon sumber Anda.buildresults/srcContoh Bendera Linker:
-Lpath/to/libc.a -lc
Jika Anda menggunakan meson , Anda dapat menggunakan libc sebagai subproyject. Masukkan ke dalam direktori Subproyik Anda dan tambahkan pernyataan subproject :
libc = subproject('libc')
Anda perlu mempromosikan variabel ketergantungan subproyject yang diinginkan untuk proyek Anda:
libc_dep = libc.get_variable('libc_dep')
Anda dapat menggunakan ketergantungan untuk konfigurasi pustaka target Anda dalam deklarasi executable atau dependensi lainnya. Misalnya:
fwdemo_sim_platform_dep = declare_dependency(
include_directories: fwdemo_sim_platform_inc,
dependencies: [
fwdemo_simulator_hw_platform_dep,
posix_os_dep,
libmemory_native_dep,
libc_dep, # <----- libc added here
libcxxabi_native_dep,
libcxx_full_native_dep,
logging_subsystem_dep
],
sources: files('platform.cpp'),
)
Tes untuk perpustakaan ini ditulis dengan CMOCKA, yang disertakan sebagai subproyik dan tidak perlu diinstal pada sistem Anda. Anda dapat menjalankan tes dengan mengeluarkan perintah berikut:
make test
Secara default, hasil tes dihasilkan untuk digunakan oleh server CI dan diformat dalam JUnit XML. Hasil pengujian file XML dapat ditemukan di buildresults/test/ .
Opsi proyek meson berikut dapat diatur untuk perpustakaan ini saat membuat direktori hasil build dengan meson , atau dengan menggunakan meson configure :
enable-pedantic : Nyalakan peringatan pedanticenable-pedantic-error : Nyalakan peringatan dan kesalahan pedantichide-unimplemented-libc-apis : Menyembunyikan definisi header untuk fungsi yang sebenarnya tidak diimplementasikanenable-gnu-extensions akan memungkinkan ekstensi Libc GNU yang diimplementasikan di perpustakaan inidisable-builtins akan memberi tahu kompiler untuk tidak menghasilkan fungsi bawaan, memaksanya untuk menggunakan fungsi perpustakaandisable-stack-protection akan memberi tahu kompiler untuk tidak memasukkan panggilan perlindungan tumpukanstack-canary-value memungkinkan Anda untuk menyesuaikan nilai kenari untuk aplikasi Anda. Suplai string heksadesimal (misalnya, '0xdeadbeef' ) dengan panjang yang sama dengan ukuran kata prosesor Anda.disable-stk-guard-runtime-config menonaktifkan kode yang digunakan untuk mengonfigurasi __stk_chk_guard selama inisialisasi program. Ketika opsi ini true , program akan kembali menggunakan definisi yang keras untuk nilai penjaga. Opsi dapat ditentukan menggunakan -D dan nama opsi:
meson buildresults -Ddisable-builtins=false
Gaya yang sama berfungsi dengan meson configure :
cd buildresults
meson configure -Ddisable-builtins=false
Perpustakaan ini menyediakan implementasi __stack_chk_guard dan __stack_chk_fail , yang memungkinkannya digunakan dengan kode perlindungan tumpukan GCC dan Clang.
Nilai default untuk __stack_chk_guard dapat ditimpa dengan opsi build stack-canary-value .
[Dokumentasi untuk rilis terbaru selalu dapat ditemukan di sini] https://embeddedartistry.github.io/libc/index.html.
Dokumentasi dapat dibangun secara lokal dengan menjalankan perintah berikut:
make docs
Dokumentasi dapat ditemukan di buildresults/docs , dan halaman root adalah index.html .
Jika Anda memerlukan bantuan lebih lanjut atau memiliki pertanyaan, silakan ajukan masalah github atau kirimkan email kepada kami menggunakan formulir kontak seni tertanam.
Anda juga dapat menjangkau di Twitter: Mbeddedartistry.
Jika Anda tertarik untuk berkontribusi pada proyek ini, silakan baca pedoman yang berkontribusi.
Hak Cipta © 2022 Embedded Artistry LLC
Proyek ini dilisensikan di bawah lisensi MIT - lihat file lisensi untuk detailnya.
Untuk lisensi sumber terbuka lainnya, silakan lihat inventaris perangkat lunak.
Saya ingin mengucapkan terima kasih kepada orang -orang berikut atas kontribusi langsung mereka pada proyek ini:
printf )printf mpaland dan pengembangan lanjutan)Banyak implementasi fungsi open-source yang digunakan di perpustakaan ini telah ditarik dari dua sumber utama:
Saya juga telah menggunakan dan meningkatkan perpustakaan gdtoa open-source.
Landasan awal pengujian diimplementasikan dengan merujuk pada proyek tes LIBC.
Kembali ke atas