libc ของ Embedded Artistry เป็นการใช้งานไลบรารีมาตรฐาน C ที่ถูกถอดออกซึ่งมีเป้าหมายสำหรับระบบฝังตัวที่ใช้ไมโครคอนโทรลเลอร์
เพื่อที่จะอนุรักษ์ทรัพยากรหน่วยความจำที่มีค่าไลบรารีนี้ไม่ได้จัดหาการใช้งานไลบรารีมาตรฐาน C ที่สมบูรณ์ แต่มีการเลือกชุดย่อยของฟังก์ชั่นที่มีประโยชน์ในระบบฝังโลหะเปลือยเปล่า หากคุณมีระบบฝังตัวโลหะหรือ RTOS ที่ใช้ RTOS ห้องสมุดนี้เหมาะสำหรับคุณ!
ซึ่งแตกต่างจากไลบรารี C อื่น ๆ ที่ฉันเคยเจอห้องสมุดนี้ใช้การทดสอบหน่วยและได้กล่าวถึงข้อบกพร่องอันยาวนานในการใช้งานโอเพนซอร์ซของฟังก์ชั่นไลบรารีมาตรฐาน C เรากำลังเพิ่มการทดสอบอย่างต่อเนื่องและทำการปรับปรุงเพิ่มเติมเกี่ยวกับการใช้งานพื้นฐาน
malloc และ free ไม่รวมอยู่ในห้องสมุดนี้ หากคุณต้องการการสนับสนุนการจัดสรรหน่วยความจำแบบไดนามิกคุณจะต้องจับคู่ห้องสมุดนี้กับ libmemory ของ ARTISTRY EMBEDDED ซึ่งมีการใช้งานของ malloc และ free
หากคุณสนใจที่จะมีส่วนร่วมในโครงการนี้โปรดอ่านคู่มือ CONTRIBUTING
libc ของ Embedded Artistry มีวัตถุประสงค์เพื่อให้ชุดฟังก์ชั่นไลบรารีมาตรฐาน C พกพาที่มีประโยชน์ซึ่งช่วยให้ระบบการฝังโลหะเปลือยเปล่าและ RTOS ใหม่ได้อย่างรวดเร็ว
นอกจากนี้เราต้องการให้การใช้งาน libc คุณภาพสูงโดยมั่นใจว่าแต่ละฟังก์ชั่นมีความครอบคลุมการทดสอบหน่วยและระบุข้อบกพร่องที่เปิดเผยโดยเครื่องวิเคราะห์แบบคงที่ การใช้งานฟังก์ชั่นไลบรารี C จำนวนมากยังคงไม่ผ่านการทดสอบและมีข้อผิดพลาด เรากำลังต่อสู้กับการใช้งานที่ไม่ดี
เพื่อที่จะอนุรักษ์หน่วยความจำไลบรารีนี้ไม่ได้จัดหาฟังก์ชั่นไลบรารีมาตรฐาน C ที่สมบูรณ์ แต่มีการเลือกชุดย่อยของฟังก์ชั่นที่มีประโยชน์ในระบบฝังโลหะเปลือยเปล่า การเลือกนี้ได้รับแรงผลักดันจากประสบการณ์ของฉันเองในการพัฒนาที่เน้นไมโครคอนโทรลเลอร์ หากคุณต้องการคุณสมบัติเพิ่มเติมโปรดยื่นปัญหาและทำคำขอคุณสมบัติ
การใช้งานที่ใช้งานได้ในไลบรารีนี้ได้รับการคัดเลือกสำหรับการพกพาและนำระบบใหม่อย่างรวดเร็ว อาจมีการใช้งานที่มีประสิทธิภาพมากขึ้นสำหรับฟังก์ชั่นเหล่านี้ แต่บ่อยครั้งที่พวกเขาเป็นสถาปัตยกรรมที่เฉพาะเจาะจงการใช้งาน หากคุณมีคำแนะนำสำหรับการปรับปรุงประสิทธิภาพเรามีความสุขเสมอที่ได้ยินพวกเขา
malloc และ free ไม่รวมอยู่ในห้องสมุดนี้ เนื่องจากแผนการจัดสรรหน่วยความจำแตกต่างกันอย่างมากกับระบบฝังตัว (บางอย่างไม่อนุญาตให้หน่วยความจำแบบไดนามิก) คุณจะต้องจัดหาการใช้งานของคุณเองตามความต้องการของระบบของคุณ คุณสามารถจับคู่ห้องสมุดนี้กับ libmemory ศิลปะแบบฝังซึ่งมีการใช้งานของ malloc และ free
ห้องสมุดนี้ให้การใช้งานที่สมบูรณ์แบบเพื่อรวบรวมและเชื่อมโยง libc++ และ libc++abi ของ Link Clang (ดูโครงการ LIBCPP ของศิลปะฝังตัว) เพื่อให้บรรลุเป้าหมายนี้บางฟังก์ชั่นจะถูกกำหนดไว้ในส่วนหัวเท่านั้น แต่ไม่มีการใช้งาน ฟังก์ชั่นที่ไม่ได้รับการสนับสนุน แต่กำหนดสามารถลบออกได้โดยใช้ตัวเลือกการสร้าง ( hide-unimplemented-libc-apis )
ส่วนต่อไปนี้ของไลบรารี C ได้ถูกนำไปใช้:
assertcrt.c , exit , atexit ฯลฯ )atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrandreallocstrtoX (หลายผ่าน gdtoa )printf (ส่วนใหญ่ผ่าน embeddedartistry/printf ตาม eyalroz/printf และเดิม mpaland/printf )putcharputstime และ asctime()wchar และฟังก์ชั่น wctype นอกจากนี้ไลบรารีนี้มีการใช้งานสำหรับ __stack_chk_guard และ __stack_chk_fail
ปัจจุบันมีการสนับสนุนสถาปัตยกรรมต่อไปนี้:
ต้องมีการทดสอบหน่วยต่อไปนี้:
reallocrandสิ่งเหล่านี้ไม่ได้ถูกนำมาใช้ในอนาคต:
wcharerrno (เปิดใช้งานเป็นสวิตช์คอมไพล์เวลา)getopt SupporttimeFILE และฟังก์ชั่น STDIO เพิ่มเติมขณะนี้เราไม่ได้วางแผนการสนับสนุนอย่างเต็มที่สำหรับ:
localeโครงการนี้ใช้ระบบการสร้างมาตรฐานของ Meson Artistry และการพึ่งพาได้อธิบายไว้ในรายละเอียดในเว็บไซต์ของเรา
อย่างน้อยที่สุดคุณจะต้อง:
git-lfs ซึ่งใช้ในการจัดเก็บไฟล์ไบนารีในที่เก็บนี้ โครงการนี้เก็บไฟล์บางไฟล์โดยใช้ git-lfs
ในการติดตั้ง git-lfs บน linux:
sudo apt install git-lfs
ในการติดตั้ง git-lfs บน macOS:
brew install git-lfs
คำแนะนำการติดตั้งเพิ่มเติมสามารถพบได้ในเว็บไซต์ git-lfs
ระบบสร้าง Meson ขึ้นอยู่กับ python3 และ ninja-build
ในการติดตั้งบน Linux:
sudo apt-get install python3 python3-pip ninja-build
ในการติดตั้งบน OSX:
brew install python3 ninja
สามารถติดตั้ง Meson ผ่าน pip3 :
pip3 install meson
หากคุณต้องการติดตั้ง Meson ทั่วโลกบน Linux ให้ใช้:
sudo -H pip3 install meson
โครงการนี้ใช้ git-lfs ดังนั้นโปรดติดตั้งก่อนการโคลนนิ่ง หากคุณโคลนก่อนที่จะติดตั้ง git-lfs เพียงเรียกใช้ git lfs pull หลังจากการติดตั้ง
โครงการนี้โฮสต์บน GitHub คุณสามารถโคลนโครงการโดยตรงโดยใช้คำสั่งนี้:
git clone --recursive [email protected]:embeddedartistry/libc.git
หากคุณไม่โคลนซ้ำ ๆ อย่าลืมเรียกใช้คำสั่งต่อไปนี้ในที่เก็บหรือบิลด์ของคุณจะล้มเหลว:
git submodule update --init
หากติดตั้ง Make ไลบรารีสามารถสร้างได้โดยการออกคำสั่งต่อไปนี้:
make
สิ่งนี้จะสร้างเป้าหมายทั้งหมดสำหรับสถาปัตยกรรมปัจจุบันของคุณ
คุณสามารถทำความสะอาดการสร้างโดยใช้:
make clean
คุณสามารถกำจัดโฟลเดอร์ buildresults ที่สร้างขึ้นโดยใช้:
make distclean
คุณยังสามารถใช้ meson โดยตรงเพื่อรวบรวม
สร้างโฟลเดอร์บิลด์เอาท์พุท:
meson buildresults
และสร้างเป้าหมายทั้งหมดด้วยการรัน
ninja -C buildresults
การรวบรวมข้ามได้รับการจัดการโดยใช้ไฟล์ meson Cross ไฟล์ตัวอย่างรวมอยู่ในโฟลเดอร์ build/cross คุณสามารถเขียนไฟล์ข้ามของคุณเองสำหรับโปรเซสเซอร์เฉพาะของคุณโดยกำหนด toolchain, การรวบรวมธงและธง linker การตั้งค่าเหล่านี้จะถูกใช้เพื่อรวบรวม libc (หรือเปิดปัญหาและเราสามารถช่วยคุณได้)
การรวบรวมข้ามจะต้องกำหนดค่าโดยใช้คำสั่ง meson เมื่อสร้างโฟลเดอร์บิวด์เอาต์พุต ตัวอย่างเช่น:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
หลังจากนั้นคุณสามารถเรียกใช้ make (ที่รูทโครงการ) หรือ ninja เพื่อสร้างโครงการ
การทดสอบจะไม่ถูกรวบรวมข้าม พวกเขาจะถูกสร้างขึ้นสำหรับแพลตฟอร์มพื้นเมืองเท่านั้น
คำแนะนำเต็มรูปแบบสำหรับการสร้างโครงการโดยใช้เชนเครื่องมือทางเลือกและการเรียกใช้เครื่องมือสนับสนุนจะได้รับการบันทึกไว้ในระบบการสร้าง Meson ที่ได้มาตรฐานของ ARTISTIRE ของ Embedded Artistry บนเว็บไซต์ของเรา
ตำแหน่งรหัสอิสระ (PIC) ถูกเปิดใช้งานโดยค่าเริ่มต้น แต่สามารถปิดการใช้งานได้ในระหว่างขั้นตอนการกำหนดค่า MESON โดยการตั้งค่าตัวเลือกในตัว b_staticpic เป็น false :
meson buildresults -Db_staticpic=false
การเพิ่มประสิทธิภาพเวลาลิงค์ (LTO) สามารถเปิดใช้งานได้ในระหว่างขั้นตอนการกำหนดค่า MESON โดยการตั้งค่าตัวเลือกใน b_lto เป็น true :
meson buildresults -Db_lto=true
ซึ่งสามารถรวมกับตัวเลือกการสร้างอื่น ๆ
หากคุณไม่ได้ใช้ meson สำหรับโครงการของคุณวิธีที่ดีที่สุดในการใช้โครงการนี้คือการสร้างแยกต่างหากและคัดลอกเนื้อหาส่วนหัวและไลบรารีลงในแผนผังต้นทางของคุณ
include/ ไดเรกทอรีลงในแผนผังต้นทางของคุณbuildresults/srcตัวอย่าง Linker Flags:
-Lpath/to/libc.a -lc
หากคุณใช้ meson คุณสามารถใช้ libc เป็นโครงการย่อย วางลงในไดเรกทอรีโครงการย่อยของคุณที่เลือกและเพิ่มคำสั่ง subproject :
libc = subproject('libc')
คุณจะต้องโปรโมตตัวแปรพึ่งพาโครงการย่อยที่ต้องการในโครงการของคุณ:
libc_dep = libc.get_variable('libc_dep')
คุณสามารถใช้การพึ่งพาสำหรับการกำหนดค่าไลบรารีเป้าหมายของคุณในการประกาศ executable ของคุณหรือการพึ่งพาอื่น ๆ ตัวอย่างเช่น:
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'),
)
การทดสอบสำหรับไลบรารีนี้เขียนด้วย CMOCKA ซึ่งรวมอยู่ในโครงการย่อยและไม่จำเป็นต้องติดตั้งในระบบของคุณ คุณสามารถเรียกใช้การทดสอบโดยการออกคำสั่งต่อไปนี้:
make test
โดยค่าเริ่มต้นผลการทดสอบจะถูกสร้างขึ้นเพื่อใช้งานโดยเซิร์ฟเวอร์ CI และจัดรูปแบบใน Junit XML ไฟล์ผลการทดสอบสามารถพบได้ใน buildresults/test/
ตัวเลือกโครงการ Meson ต่อไปนี้สามารถตั้งค่าสำหรับไลบรารีนี้เมื่อสร้างไดเรกทอรีผลลัพธ์บิลด์ด้วย meson หรือโดยใช้ meson configure :
enable-pedantic : เปิดคำเตือน pedanticenable-pedantic-error : เปิดคำเตือนและข้อผิด pedantichide-unimplemented-libc-apis : ซ่อนคำจำกัดความส่วนหัวสำหรับฟังก์ชั่นที่ไม่ได้ใช้งานจริงenable-gnu-extensions จะเปิดใช้งานส่วนขยาย GNU LIBC ที่ใช้ในไลบรารีนี้disable-builtins การใช้งาน Builtindisable-stack-protection จะบอกให้คอมไพเลอร์ไม่ใส่สายป้องกันสแต็กstack-canary-value ช่วยให้คุณสามารถปรับแต่งค่า Canary สำหรับแอปพลิเคชันของคุณ จัดหาสตริงเลขฐานสิบหก (เช่น '0xdeadbeef' ) ที่มีความยาวเท่ากับขนาดคำของโปรเซสเซอร์ของคุณdisable-stk-guard-runtime-config ปิดการใช้งานรหัสที่ใช้ในการกำหนดค่า __stk_chk_guard ในระหว่างการเริ่มต้นโปรแกรม เมื่อตัวเลือกนี้เป็น true โปรแกรมจะเปลี่ยนกลับไปใช้คำจำกัดความที่ยากสำหรับค่ายาม สามารถระบุตัวเลือกได้โดยใช้ -D และชื่อตัวเลือก:
meson buildresults -Ddisable-builtins=false
สไตล์เดียวกันทำงานกับ meson configure :
cd buildresults
meson configure -Ddisable-builtins=false
ไลบรารีนี้ให้การใช้งาน __stack_chk_guard และ __stack_chk_fail ซึ่งช่วยให้สามารถใช้กับรหัสป้องกันสแต็กของ GCC และ Clang
ค่าเริ่มต้นสำหรับ __stack_chk_guard สามารถถูกแทนที่ด้วยตัวเลือกการสร้าง stack-canary-value
[เอกสารสำหรับรุ่นล่าสุดสามารถพบได้ที่นี่] https://embeddedartistry.github.io/libc/index.html
เอกสารสามารถสร้างได้ในพื้นที่โดยเรียกใช้คำสั่งต่อไปนี้:
make docs
เอกสารสามารถพบได้ใน buildresults/docs และหน้ารูทคือ index.html
หากคุณต้องการความช่วยเหลือเพิ่มเติมหรือมีคำถามใด ๆ โปรดยื่นปัญหา GitHub หรือส่งอีเมลถึงเราโดยใช้แบบฟอร์มการติดต่อ Artistry Embedded Artistry
นอกจากนี้คุณยังสามารถเข้าถึง Twitter: MBEDDEDARTISTRY
หากคุณสนใจที่จะมีส่วนร่วมในโครงการนี้โปรดอ่านแนวทางการสนับสนุนของเรา
ลิขสิทธิ์© 2022 Embedded Artistry LLC
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT - ดูไฟล์ใบอนุญาตสำหรับรายละเอียด
สำหรับใบอนุญาตโอเพนซอร์ซอื่น ๆ โปรดดูสินค้าคงคลังซอฟต์แวร์
ฉันขอขอบคุณบุคคลต่อไปนี้สำหรับการมีส่วนร่วมโดยตรงในโครงการนี้:
printf )printf ของ Mpaland และการพัฒนาอย่างต่อเนื่อง)การใช้งานฟังก์ชั่นโอเพนซอร์ซจำนวนมากที่ใช้ในไลบรารีนี้ถูกดึงออกมาจากแหล่งข้อมูลหลักสองแหล่ง:
ฉันยังใช้และปรับปรุงไลบรารี gdtoa โอเพนซอร์ซ
รากฐานเริ่มต้นของการทดสอบถูกนำมาใช้โดยการอ้างอิงโครงการ LIBC-test
กลับไปด้านบน