เมื่อฉันคอมไพล์โค้ด C ด้วย cross toolchain ตัวเชื่อมโยงจะพิมพ์หน้าคำเตือนโดยบอกว่าไฟล์ปฏิบัติการของฉันใช้ฮาร์ดโฟล แต่ libc ของฉันใช้ซอฟต์โฟล อะไรคือความแตกต่าง?
เมื่อฉันคอมไพล์โค้ด C ด้วย cross toolchain ตัวเชื่อมโยงจะพิมพ์หน้าคำเตือนโดยบอกว่าไฟล์ปฏิบัติการของฉันใช้ฮาร์ดโฟล แต่ libc ของฉันใช้ซอฟต์โฟล อะไรคือความแตกต่าง?
คำตอบ:
การลอยตัวแบบแข็งใช้หน่วยจุดลอยตัวบนชิป ซอฟท์ลอยจำลองหนึ่งในซอฟต์แวร์ ความแตกต่างคือความเร็ว เป็นเรื่องแปลกที่เห็นทั้งคู่ใช้กับสถาปัตยกรรมเป้าหมายเดียวกันเนื่องจากชิปมี FPU หรือไม่ คุณสามารถเปิดใช้งานจุดลอยตัวอ่อนใน GCC ด้วย -msoft-float คุณอาจต้องการคอมไพล์ libc ของคุณใหม่เพื่อใช้จุดลอยตัวของฮาร์ดแวร์หากคุณใช้
มีสามวิธีในการคำนวณเลขคณิตลอยตัว:
พูดอย่างเคร่งครัดคำตอบทั้งหมดนี้ดูเหมือนจะผิดสำหรับฉัน
เมื่อฉันคอมไพล์โค้ด C ด้วย cross toolchain ตัวเชื่อมโยงจะพิมพ์หน้าคำเตือนโดยบอกว่าไฟล์ปฏิบัติการของฉันใช้ฮาร์ดโฟล แต่ libc ของฉันใช้ซอฟต์โฟล อะไรคือความแตกต่าง?
Debian VFP วิกิพีเดียมีข้อมูลเกี่ยวกับทางเลือกที่สามสำหรับ-mfloat-abi
,
soft
- นี่คือซอฟต์แวร์ที่แท้จริงsoftfp
- รองรับฮาร์ดแวร์ FPU แต่ABIเข้ากันได้กับซอฟต์hard
- ABI ใช้การลงทะเบียนแบบลอยหรือVFPข้อผิดพลาดตัวเชื่อมโยง (ตัวโหลด) เป็นเพราะคุณมีไลบรารีที่ใช้ร่วมกันซึ่งจะส่งผ่านค่าทศนิยมในการลงทะเบียนจำนวนเต็ม คุณยังสามารถคอมไพล์โค้ดของคุณด้วย a -mfpu=vfp
และอื่น ๆ ได้ แต่คุณควรใช้-mfloat-abi=softfp
เพื่อที่ว่าหากlibcต้องการ float มันจะถูกส่งผ่านไปในลักษณะที่ไลบรารีเข้าใจ
เคอร์เนล Linux สามารถรองรับการจำลองคำสั่ง VFP เห็นได้ชัดว่าคุณควรคอมไพล์-mfpu=none
สำหรับกรณีนี้และให้คอมไพล์สร้างโค้ดโดยตรงแทนที่จะใช้การจำลองเคอร์เนลของ Linux อย่างไรก็ตามฉันไม่เชื่อว่าข้อผิดพลาดของ OP เกี่ยวข้องกับปัญหานี้จริงๆ -mfloat-abi
มันเป็นแยกต่างหากและยังต้องจัดการกับพร้อมกับ
ไลบรารีที่ใช้ร่วมกันของ Armv5 กับ ArmV7 CPUนั้นตรงกันข้ามกับไลบรารีนี้ libcเป็นลอยยาก แต่การประยุกต์ใช้เป็นเพียงที่อ่อนนุ่ม มีบางวิธีในการแก้ไขปัญหา แต่การคอมไพล์ใหม่ด้วยตัวเลือกที่ถูกต้องนั้นง่ายที่สุดเสมอ
อีกปัญหาหนึ่งคือเคอร์เนล Linux ต้องรองรับงาน VFP (หรือจุดลอยตัวของ ARM) เพื่อบันทึก / เรียกคืนรีจิสเตอร์บนสวิตช์บริบท
ดูเหมือนว่า libc ของคุณถูกสร้างขึ้นสำหรับการดำเนินการจุดลอยตัวของซอฟต์แวร์ในขณะที่ exe ของคุณถูกคอมไพล์โดยสมมติว่ารองรับฮาร์ดแวร์สำหรับจุดลอยตัว ในระยะสั้นคุณสามารถบังคับให้ soft float เป็นแฟล็กคอมไพเลอร์ (ถ้าคุณใช้ gcc ฉันคิดว่ามันเป็น -msoft-float)
ในระยะยาวหากโปรเซสเซอร์ของเป้าหมายของคุณมีการสนับสนุนฮาร์ดแวร์สำหรับการดำเนินการจุดลอยตัวโดยทั่วไปคุณจะต้องสร้างหรือค้นหา cross toolchain ที่เปิดใช้งานฮาร์ดแวร์ลอยเพื่อความเร็ว ตระกูลโปรเซสเซอร์บางรุ่นมีรุ่นที่แตกต่างกันบางรุ่นและบางรุ่นไม่รองรับฮาร์ดแวร์ ตัวอย่างเช่นการบอกว่าโปรเซสเซอร์ของคุณเป็น ARM นั้นไม่เพียงพอที่จะทราบว่าคุณมีการรองรับทศนิยมของฮาร์ดแวร์
การคำนวณอาจทำได้โดยใช้ฮาร์ดแวร์ทศนิยมหรือในซอฟต์แวร์โดยใช้เลขคณิตจำนวนเต็ม
การทำในฮาร์ดแวร์นั้นเร็วกว่ามาก แต่ไมโครคอนโทรลเลอร์หลายตัวไม่มีฮาร์ดแวร์แบบลอยตัว ในกรณีนี้คุณอาจหลีกเลี่ยงการใช้จุดลอยตัว (โดยปกติจะเป็นตัวเลือกที่ดีที่สุด) หรือพึ่งพาการใช้งานในซอฟต์แวร์ซึ่งจะเป็นส่วนหนึ่งของไลบรารี C
ในบางตระกูลของคอนโทรลเลอร์เช่น ARM ฮาร์ดแวร์ทศนิยมมีอยู่ในบางรุ่นของตระกูล แต่ไม่มีในตระกูลอื่นดังนั้น gcc สำหรับตระกูลเหล่านี้จึงรองรับทั้งสองอย่าง ปัญหาของคุณดูเหมือนว่าคุณผสมสองตัวเลือกเข้าด้วยกัน