ไมโครคอนโทรลเลอร์แต่ละสายมีภาษาโปรแกรม / ไวยากรณ์ของตัวเองหรือไม่?


10

ฉันได้ตั้งโปรแกรม Arduino และเริ่มเขียนโปรแกรม Teensy แล้ว พวกเขาคล้ายกับ C แต่มีความแตกต่างเล็กน้อยในภาษาการเขียนโปรแกรม

ตัวอย่างเช่นใน C ของ Arduino คุณเรียกฟังก์ชั่น pinMode (pin #, Output / Input) เพื่อกำหนดพินดิจิตอลให้เป็นสัญญาณเอาต์พุตหรือรับสัญญาณ ใน Teensy's C คุณตั้งค่าการลงทะเบียน "DDR" ที่เชื่อมโยงกับหนึ่งในสี่พอร์ต (ซึ่งแต่ละอันแทนคอลเลกชันของพิน) ซึ่งคุณกำหนดโดยรวมว่าเป็นอินพุตหรือเอาต์พุต ( ไวยากรณ์ Teensy IO )

ฉันต้องการทราบว่าเป็นกรณีที่เมื่อคุณใช้ไมโครคอนโทรลเลอร์ที่ใหม่สำหรับคุณคุณจำเป็นต้องเรียนรู้ "ภาษา" ใหม่อย่างมีประสิทธิภาพ ฉันใส่คำว่า "ภาษา" ในเครื่องหมายคำพูดเพราะแม้จะมีความแตกต่างในรูปแบบขององค์ประกอบและวิธีการที่พวกเขาตั้งค่าในซอฟต์แวร์ที่มีพื้นฐานเทียบเท่าเช่นความคิดของพอร์ตและหมุดยังคงหมายถึงขั้วที่คุณสามารถส่งออก / อินพุตดิจิตอล สัญญาณ

ในวาทกรรมเดียวกัน: มีไมโครคอนโทรลเลอร์ที่ไม่ได้ตั้งโปรแกรมไว้ในซอฟต์แวร์หรือจะมีเลเยอร์ซอฟต์แวร์ที่ใช้ในการเขียนโปรแกรม uController หรือไม่? หากหลังใครเป็นผู้เขียน / เตรียมเอกสารสำหรับพวกเขา


2
ภาษาการเขียนโปรแกรมสำหรับ Arduino คือ C ++ (ไม่ (เท่านั้น) C) - หรือบางทีอาจจะเป็นเพียงแค่ส่วนหนึ่งของ C ++ ได้ (หรือแม้กระทั่งการประมวลผล ) มันไม่ชัดเจนทั้งหมด แต่ก็เป็นมากกว่า C; ตัวอย่างก็มีการเรียนและการที่ผู้ใช้กำหนดผู้ประกอบการ + =
Peter Mortensen

1
มันคือ C ++ มันคอมไพล์โดยใช้ g ++ - avr ในทางเทคนิคแล้วจะเป็นการใช้งาน C ++ อิสระและจะไม่รวมไลบรารีมาตรฐาน C ++ (เนื่องจากสิ่งต่าง ๆ เช่นการจัดสรรหน่วยความจำแบบไดนามิกและข้อยกเว้นที่จำเป็น) คุณสามารถใช้คุณลักษณะของภาษาเช่นการเรียนและแม่แบบฉันได้เห็น digitalWrite () แม่แบบที่ใช้ทดแทนที่ประสบความสำเร็จในการปฏิบัติงานเช่นเดียวกับการเข้าถึงโดยตรงทะเบียนวิธี Arduino มีค่าใช้จ่ายค่อนข้าง
r_ahlskog

1
ภาษาเหมือนกัน มันเป็น API ที่แตกต่างกัน หากคุณย้ายออกจากไมโครคอนโทรลเลอร์และเริ่มเขียนแอปบนเดสก์ท็อปคุณจะพบปัญหาเดียวกันเมื่อเขียนโปรแกรม C สำหรับ Windows, Linux และ Mac แม้ว่าคุณจะใช้ POSIX API อย่างหมดจด (ซึ่งทั้ง 3 แพลตฟอร์มสนับสนุน) คุณจะยังคงได้รับผลต่างของแพลตฟอร์มเฉพาะเมื่อคุณต้องการบันทึกการตั้งค่า / ค่ากำหนดของผู้ใช้
slebetman

คำตอบ:


3

โดยทั่วไปแล้วไมโครโปรเซสเซอร์และไมโครคอนโทรลเลอร์จะใช้สถาปัตยกรรมที่ใช้ร่วมกันระหว่างผลิตภัณฑ์และสายการผลิตที่แตกต่างกัน สถาปัตยกรรมเหล่านี้มักจะกำหนดชุดคำสั่งระดับต่ำ ( ชุดคำสั่ง ) ทั่วไปสำหรับการใช้งานทั้งหมด คอมไพเลอร์ AC หรือ C ++ จะสามารถสร้างไฟล์ประมวลผล bytecode บนโปรเซสเซอร์ ARM ทั้งหมดได้

อย่างไรก็ตามสถาปัตยกรรมเป็นเพียงครึ่งหนึ่งของภาพ เนื่องจากมีที่อยู่หน่วยความจำเฉพาะจำนวนมากอุปกรณ์ต่อพ่วงบนบอร์ดการจัดการหน่วยความจำและรายละเอียดการใช้งานอื่น ๆ ที่สถาปัตยกรรมไม่ได้ระบุ

โดยทั่วไปผู้ผลิตหรือบุคคลที่สามจะให้บริการคอลเลกชันของไฟล์ต้นฉบับ ( HDK ) ที่จะให้คำจำกัดความการแมปพอร์ตและรหัสตัวอย่าง โดยปกติ HDK สำหรับCและC ++ โดยทั่วไป HDK จะมีบอร์ดสาธิตเชื่อมโยงกับมัน (คิดว่า aarduino $ 500) รายละเอียดงานกำหนดค่าจำนวนมากมักจำเป็นต้องปรับแพลตฟอร์มการพัฒนา / ตัวอย่างไปยังอุปกรณ์ที่คุณกำลังออกแบบ

Arduino นั้นขึ้นอยู่กับสถาปัตยกรรม AVR และได้รับการสนับสนุนจาก Atmel เป็นหลัก Arduino ได้สร้างแพลตฟอร์ม bootloader และไลบรารีของฟังก์ชั่น C ++ และวัตถุที่ง่ายขึ้นเพื่อให้คุณใช้แพลตฟอร์มได้อย่างง่ายดาย แพลตฟอร์ม Arduino และ IDE ออกแบบมาสำหรับมือสมัครเล่นที่มีอุปกรณ์น้อยที่สุด ก่อนที่อาร์ดิโน PIC จะทำหน้าที่คล้ายกันกับสภาพแวดล้อมพื้นฐานที่ใช้งานง่ายและราคาถูก

ในสภาพแวดล้อมแบบมืออาชีพโดยทั่วไปแล้วการสนับสนุนนี้จัดทำโดยผู้ขาย / ผู้ผลิตหรือทำสัญญากับบุคคลที่สาม พวกเขาให้รหัสระดับต่ำและส่วนหัวและคุณเขียนใบสมัครของคุณด้วย HDK นั้นในองค์กรขนาดใหญ่ที่สามารถทำได้ในบ้าน มีแนวโน้มล่าสุดสำหรับผู้ผลิตเพื่อสร้างระบบนิเวศ API / ซอฟต์แวร์แบบเปิดรอบ ๆ แพลตฟอร์มของพวกเขาที่ทำให้พวกเขาเป็นเรื่องง่ายต่อการใช้งานทันทีจากกล่องเป็น Arduino ยังมีชิปนับไม่ถ้วนที่มีการสนับสนุนการเขียนโปรแกรมน้อยมากและความรู้เกี่ยวกับแพลตฟอร์มส่วนใหญ่ถูกปิดกั้นในโลกธุรกิจ


14

ภาษาในกรณีนี้เหมือนกันทุกประการ สภาพแวดล้อมของ Arduino มีไลบรารีเพิ่มเติม (เพียงรหัส C เพิ่มเติม) ที่ 'ห่อ' การเข้าถึงการลงทะเบียนฮาร์ดแวร์จริง (DDRx, PORTx, INx และอื่น ๆ ) พร้อมฟังก์ชั่นที่ใช้งานง่ายขึ้นเล็กน้อย สิ่งนี้จะเพิ่มค่าใช้จ่าย (จำเป็นต้องดำเนินการคำแนะนำเพิ่มเติมสำหรับการดำเนินการเดียวกัน) แต่เพิ่มความยืดหยุ่นเนื่องจาก "ง่าย" ในการเขียนโปรแกรมที่ใช้เฉพาะการโทรเหล่านี้จากนั้นจึงกำหนดเป้าหมายใหม่สำหรับชิปที่แตกต่างกัน ห้องสมุดจะจัดการการแมปที่เหมาะสมภายใน

ไม่มี API 'มาตรฐาน' ใด ๆ สำหรับการเข้าถึงระดับต่ำทั่วชิปจากผู้ขายที่แตกต่างกัน อย่างไรก็ตามการเข้าถึงระดับต่ำทั้งหมดจะทำในลักษณะเดียวกัน - อ่านและเขียนไปยังที่อยู่หน่วยความจำคงที่ - ดังนั้นวิธีการเข้าถึงโดยรวมจะคล้ายกันระหว่างส่วนต่าง ๆ เพียงรายละเอียดและชื่อจะแตกต่างกัน บางทีหนึ่งอาจจะให้ไฟล์ส่วนหัวกับรายการใหญ่ของ #defines ลงทะเบียนที่อยู่ส่งไปยังพอยน์เตอร์ หรือบางทีไฟล์ส่วนหัวจะใช้โครงสร้างเพื่อจัดเรียงสิ่งต่าง ๆ ด้วยลำดับชั้นเล็กน้อย ผู้ผลิตบางรายอาจมี API ระดับสูงกว่าด้วย สิ่งนี้มีประโยชน์มากสำหรับอุปกรณ์ต่อพ่วงที่ซับซ้อนและกำหนดค่าได้ยาก GPIO นั้นง่ายมาก แต่บางอย่างเช่นคอนโทรลเลอร์ USB ที่รองรับ DMA อาจมีการลงทะเบียนหลายร้อยรายการ

ดังนั้นบรรทัดล่างคือใช่คุณจะต้องเรียนรู้ชื่อการลงทะเบียนใหม่ แต่ภาษานั้นยังคงเป็นภาษาซีพลัสพลัส (หรือซีแอสเซมบลีหรืออาจเป็นสิ่งที่ลึกลับกว่า)


4
Arduino ไม่ใช่แค่ C (จริงๆแล้ว C ++) - มันมี preprocessor ที่ทำการเปลี่ยนแปลงเล็กน้อยก่อนที่จะป้อนมันให้กับคอมไพเลอร์ C
Nick Johnson

ที่จริงแล้วสำหรับ Arduino มันมากกว่า C มันคือ C ++ (หรืออาจเป็นเซตย่อยของ C ++)
ปีเตอร์มอร์เทนเซ่น

มันเป็นแค่ภาษาซีพลัสพลัสที่มีห้องสมุด Arduino หรืออะไรมากกว่านั้น?
kayleeFrye_onDeck

Arduino IDE เห็นได้ชัดว่าเป็นการประมวลผลล่วงหน้าเล็กน้อยนอกเหนือจากมาตรฐาน C ++ IDEs ส่วนใหญ่ไม่ได้ทำเช่นนี้
alex.forencich

เป็นพื้น C ++ แต่มีmain()การกำหนดไว้ล่วงหน้าสำหรับคุณ แต่คุณจะได้รับสองคะแนน: init()และloop()(แก้ไขฉันถ้าฉันผิด แต่ฉันได้สัมผัส Arduino กับเสา 20 ฟุต)
slebetman

5

คุณกำลังสับสนกับไมโครคอนโทรลเลอร์และคอมไพเลอร์ ภาษาระดับสูงที่คุณสามารถตั้งโปรแกรมไมโครอินใด ๆ คือฟังก์ชั่นของคอมไพเลอร์ที่มีให้สำหรับไมโครนั้น

ในระดับต่ำไมโครประมวลคำสั่งเครื่องซึ่งคอมไพเลอร์มาสำหรับไฟล์ข้อความที่คุณให้มันว่าคุณคิดว่าเป็น "โปรแกรม" คุณกำลังระบุตรรกะบางอย่างที่จะดำเนินการและคอมไพเลอร์จะหาวิธีใช้คำสั่งเครื่องที่มีอยู่เพื่อใช้ตรรกะนั้น ในกรณีนี้สิ่งที่คุณตั้งโปรแกรมคือฟังก์ชั่นของคอมไพเลอร์ไม่ใช่ชุดคำสั่งพื้นฐานของไมโคร

คุณสามารถตั้งโปรแกรมไมโครได้โดยการระบุคำสั่งพื้นฐานโดยตรง สิ่งนี้ทำได้โดยใช้ภาษาแอสเซมบลี แอสเซมเบลอร์เป็นนักแปลที่ใช้ไฟล์ข้อความที่คุณเขียนและสร้างคำสั่งเครื่องตามผลลัพธ์ ข้อแตกต่างคือในกรณีนี้คุณกำลังระบุคำสั่งเครื่องเหล่านั้นโดยตรง การเรียนการสอนแต่ละครั้งจะได้รับชื่อและคุณเขียนชื่อเหล่านี้แทนไบนารี opcodes แต่คุณยังคงระบุคำแนะนำโดยตรง แอสเซมเบลอร์จะทำงานหนักเพียงอย่างเดียวในการหาการเข้ารหัสไบนารีที่แน่นอนของแต่ละคำสั่งจากชื่อและตัวเลือกที่คุณเขียนในไฟล์ข้อความ

ในขณะที่ภาษาระดับสูงสามารถเหมือนกันใน micros ที่แตกต่างกันมากคำแนะนำเครื่องมักจะคล้ายกันเฉพาะในตระกูลของ micros ที่เกี่ยวข้อง ตัวอย่างเช่น Microchip PIC 18 ทั้งหมดมีชุดคำสั่งเดียวกัน (ส่วนใหญ่) ซึ่งแตกต่างจาก PIC 16 ขั้นพื้นฐานและแตกต่างอีกครั้งจากส่วน 16 บิตเช่น PIC 24 และ dsPIC 30 และ 33


1
แอสเซมเบลอร์ยังแก้ไขป้ายชื่อสำหรับคำสั่งการกระโดดซึ่งมีข้อผิดพลาดสูงเมื่อทำด้วยมือ
Pete Becker

2

ภาษาการเขียนโปรแกรมยังคงเป็น C แต่ห้องสมุดของผู้ผลิตเพื่อเข้าถึงฮาร์ดแวร์ที่แตกต่างกัน เท่าที่ฉันรู้ไม่มีมาตรฐานดังนั้นผู้ผลิตทุกรายมี API ของตัวเอง หากคุณต้องการพกพาระหว่างผู้ผลิตหลายรายคุณอาจต้องการแนะนำ API นามธรรมของคุณเองเพื่อเข้าถึงฮาร์ดแวร์ด้วยการใช้งานเฉพาะซึ่งแมป API ของคุณกับวิธีการเฉพาะของผู้ผลิต


จริงๆแล้วมันมากกว่า C มันคือ C ++ (หรืออาจเป็นเซตย่อยของ C ++)
ปีเตอร์มอร์เทนเซ่น

2

คำตอบอื่น ๆ ทำให้ความแตกต่างระหว่างภาษาระดับสูง (เช่น C ++) และรหัสเครื่องแม้ว่าฉันจะไม่เชื่อว่าคำสั่งของคุณทำให้โมฆะว่าไมโครคอนโทรลเลอร์แต่ละตัวจะมี 'ภาษา' ที่เกี่ยวข้อง

ความแตกต่างของการใช้ภาษาไม่ใหญ่พอที่จะจัดเป็นภาษาที่แตกต่างกันแม้ว่าฉันจะไม่ลังเลที่จะแยกพวกเขาออกเป็น 'ภาษา' มีการเปลี่ยนแปลงสองชั้นที่นี่

  1. อาจมีไลบรารี wrapper ระดับสูงจากผู้ผลิตหรือบุคคลที่สาม
  2. คอมไพเลอร์บางตัวอาจไม่ปล่อยรหัสที่เป็นไปตามมาตรฐาน

เรามาดูจุดเหล่านี้พร้อมสังเกตแพลตฟอร์ม Arduino

  • ชุมชน Arduino มอบไลบรารี C ++ ที่เป็นนามธรรมอย่างมากสำหรับชิปสถาปัตยกรรม AVR ไลบรารีเหล่านี้แนะนำโฟลว์ควบคุมที่แตกต่างจากสิ่งที่คาดหวังจากโปรแกรม C ++ ทั่วไป (เช่นการซ่อนของ main ())
  • ภายใต้ประทุน Arduino รวบรวมรหัสของมันโดยใช้ avr-gcc ซึ่งปล่อยรหัส C / C ++ อย่างไรก็ตามข้อยกเว้นไม่ได้รับการรองรับอย่างดีกับชิป AVR และถูกปิดการใช้งานเกือบตลอดเวลา ด้วยคุณสมบัติที่ขาดหายไปขนาดใหญ่โปรแกรมที่ได้อาจไม่ทำงานเหมือนกับโปรแกรม 'C ++' ปกติ

เมื่อทราบสิ่งนี้คุณจะตัดสินใจอย่างไรในการเขียนโปรแกรมไมโครคอนโทรลเลอร์โดยพลการ คุณมีหลายทางเลือก:

  1. ค้นหาไลบรารีและ IDE ที่ทำโดยชุมชนสำหรับชิปเฉพาะของคุณ ชิป AVR ได้รับการพัฒนาโดยใช้ C เท่านั้น แต่โครงการ Arduino ให้ประสบการณ์ที่เป็นมิตรกับผู้ใช้มากขึ้น
  2. ค้นหาคอมไพเลอร์ที่สามารถรวบรวมชิพเฉพาะของคุณได้ ด้วยคอมไพเลอร์ที่เหมาะสมเอกสารข้อมูลชิปของคุณและความอดทนจำนวนหนึ่งคุณจะสามารถเขียนรหัสได้อย่างใกล้ชิดกับโลหะ

สำหรับการอ้างอิงนี่คือรายการแบ็กเอนด์ที่รองรับสำหรับ GCC คุณจะสังเกตเห็นว่ามีการสนับสนุน ARM, AVR, MIPS และอื่น ๆ

เกี่ยวกับชิปที่ไม่ได้ตั้งโปรแกรมด้วย 'ซอฟต์แวร์' ...

คุณอาจต้องการตรวจสอบอาร์เรย์เกท (FPGAs) ที่ตั้งโปรแกรมได้! FPGA ถูกควบคุมโดยการเปลี่ยนค่าของตารางการค้นหาเพื่อเลียนแบบลอจิกเกต ไม่มีรูปแบบซอฟต์แวร์ที่สอดคล้องกัน แต่ยังคงพัฒนาโดยใช้ภาษาคำอธิบายฮาร์ดแวร์เช่น VHDL และ Verilog


1

ฉันดูที่บอร์ด pc หนึ่งอันและดูอุปกรณ์ยึดพื้นผิวบางตัวต้านทานและตัวเก็บประจุและไฟ led นั่นหมายความว่าเพราะหนึ่งในบอร์ดเหล่านั้นเป็นการ์ดวิดีโอ, บอร์ดทั้งหมดที่มีตัวต้านทานและตัวเก็บประจุและหลายเลเยอร์และร่องรอยเป็นการ์ดทั้งหมดหรือไม่ Nope

นี่เป็นอีกตัวอย่างหนึ่งหน้าเว็บนี้ใช้ตัวอักษรภาษาอังกฤษและคำภาษาอังกฤษ เว็บไซต์ york ครั้งดังนั้นเว็บไซต์ที่ทำให้เว็บไซต์นี้เป็นเว็บไซต์ new york ครั้งหรือไม่ ไม่มีพวกเขาเพียงแค่ใช้ตัวอักษรและภาษาเดียวกัน แต่ต่างกันโดยสิ้นเชิง

C เป็นภาษาโปรแกรมวัตถุประสงค์ทั่วไปที่เป็นนามธรรมคำสั่งที่กำหนดไว้ด้านล่าง สามารถใช้สำหรับโลหะเปลือยสามารถใช้เพื่อสร้างความแตกต่างและไม่เข้ากันกับระบบปฏิบัติการอื่น ๆ สามารถใช้ในการสร้างวิดีโอเกมและอื่น ๆ ทั้งหมดนี้ใช้ภาษา C พื้นฐานเหมือนกันบางฟังก์ชั่น C ทั่วไปและการก่อสร้างเช่นเดียวกับ เรียกใช้ฟังก์ชันที่พวกเขาสร้างขึ้นเฉพาะสำหรับแอปพลิเคชันเป้าหมาย สำหรับแต่ละแพลตฟอร์มที่คุณพูดถึงหรืออื่น ๆ อาจมีชุดฟังก์ชั่นที่บางคนเลือกที่จะสร้าง เช่นเดียวกับผู้คนจำนวนไม่น้อยที่รวมถึงตัวฉันเองได้ให้คำตอบเดียวกับคุณ แต่เขียนมันในวิธีที่ต่างออกไป ใช้โปรแกรมเมอร์ 100 คนและแยกพวกเขาออกจากกันและให้ภารกิจการเขียนโปรแกรมเพื่อแก้ปัญหาเฉพาะโดยไม่ จำกัด เสรีภาพในการเขียนโปรแกรมทั้งหมด และคุณจะได้รับตั้งแต่ 1 ถึง 100 ที่แตกต่างกันเข้ากันไม่ได้กับโซลูชันอื่น ๆ มีแนวโน้มที่จะไม่ 1 แต่มีหลายธีมทั่วไปขึ้นอยู่กับการฝึกอบรมและประสบการณ์ของพวกเขาและจากนั้นชื่อตัวแปรและชื่อฟังก์ชันที่เป็นชุด ใช้บอร์ดเดียวกับที่คุณกำลังพูดถึงและคุณจะพบว่าฉันมีรหัส C ของตัวเองที่เข้ากันไม่ได้ (ด้วยฟังก์ชั่น arduino) เพื่อใช้งานพวกเขาเช่นเดียวกับคนอื่น ๆ และเข้ากันไม่ได้กับแพลตฟอร์มอื่น ๆ นั่นคือความงามของการเขียนโปรแกรมฝังโลหะเปลือยคุณไม่ถูก จำกัด แต่อย่างใดคุณไม่จำเป็นต้องอยู่ในระบบปฏิบัติการห้องสมุดมาตรฐานการโทรหรือชุดกฎที่ จำกัด ฯลฯ มีอิสระอย่างสมบูรณ์ มีแนวโน้มที่จะไม่ 1 แต่มีหลายธีมทั่วไปขึ้นอยู่กับการฝึกอบรมและประสบการณ์ของพวกเขาจากนั้นชื่อตัวแปรและชื่อฟังก์ชันที่แต่ละชุดมีแนวโน้มที่จะไม่ซ้ำกัน ใช้บอร์ดเดียวกับที่คุณกำลังพูดถึงและคุณจะพบว่าฉันมีรหัส C ของตัวเองที่เข้ากันไม่ได้ (ด้วยฟังก์ชั่น arduino) เพื่อใช้งานพวกเขาเช่นเดียวกับคนอื่น ๆ และเข้ากันไม่ได้กับแพลตฟอร์มอื่น ๆ นั่นคือความงามของการเขียนโปรแกรมฝังโลหะเปลือยคุณไม่ถูก จำกัด แต่อย่างใดคุณไม่จำเป็นต้องอยู่ในระบบปฏิบัติการห้องสมุดมาตรฐานการโทรหรือชุดกฎที่ จำกัด ฯลฯ มีอิสระอย่างสมบูรณ์ มีแนวโน้มที่จะไม่ 1 แต่มีหลายธีมทั่วไปขึ้นอยู่กับการฝึกอบรมและประสบการณ์ของพวกเขาจากนั้นชื่อตัวแปรและชื่อฟังก์ชันที่แต่ละชุดมีแนวโน้มที่จะไม่ซ้ำกัน ใช้บอร์ดเดียวกับที่คุณกำลังพูดถึงและคุณจะพบว่าฉันมีรหัส C ของตัวเองที่เข้ากันไม่ได้ (ด้วยฟังก์ชั่น arduino) เพื่อใช้งานพวกเขาเช่นเดียวกับคนอื่น ๆ และเข้ากันไม่ได้กับแพลตฟอร์มอื่น ๆ นั่นคือความงามของการเขียนโปรแกรมฝังโลหะเปลือยคุณไม่ถูก จำกัด แต่อย่างใดคุณไม่จำเป็นต้องอยู่ในระบบปฏิบัติการห้องสมุดมาตรฐานการโทรหรือชุดกฎที่ จำกัด ฯลฯ มีอิสระอย่างสมบูรณ์ ใช้บอร์ดเดียวกับที่คุณกำลังพูดถึงและคุณจะพบว่าฉันมีรหัส C ของตัวเองที่เข้ากันไม่ได้ นั่นคือความงามของการเขียนโปรแกรมฝังโลหะเปลือยคุณไม่ถูก จำกัด แต่อย่างใดคุณไม่จำเป็นต้องอยู่ในระบบปฏิบัติการห้องสมุดมาตรฐานการโทรหรือชุดกฎที่ จำกัด ฯลฯ มีอิสระอย่างสมบูรณ์ ใช้บอร์ดเดียวกับที่คุณกำลังพูดถึงและคุณจะพบว่าฉันมีรหัส C ของตัวเองที่เข้ากันไม่ได้ นั่นคือความงามของการเขียนโปรแกรมแบบฝังโลหะเปลือยคุณไม่ได้ถูก จำกัด แต่อย่างใดคุณไม่จำเป็นต้องอยู่ในระบบปฏิบัติการห้องสมุดมาตรฐานหรือการกำหนดกฎที่ จำกัด ฯลฯ มีอิสระอย่างสมบูรณ์

คุณอาจเลือกและทำเปอร์เซ็นต์สูงเพื่อเล่นใน Sandbox คนอื่นแทนที่จะสร้างของคุณเองหมายถึงใช้ arduino gui และไลบรารี C ของพวกเขา

คุณสามารถใช้พีซีเครื่องเดียวกันและใช้ windows รุ่นต่าง ๆ ลินุกซ์ bsd และรายการซักผ้าของระบบปฏิบัติการอื่นซึ่งในระดับหนึ่งกำลังใช้ C แต่การเรียกใช้ฟังก์ชันไม่สอดคล้องกัน ฮาร์ดแวร์เดียวกันและ C ที่เข้ากันไม่ได้ซึ่งขยายไปถึงฮาร์ดแวร์ที่แตกต่างกันภาษาเดียวกันสามารถมีรหัสที่เข้ากันได้หรือเข้ากันไม่ได้ ภาษาไม่มีทางทำให้เข้ากันได้

C ถูกใช้บนแพลตฟอร์มแบบฝังเหล่านี้เนื่องจากเป็นวิธีปฏิบัติทั่วไปไม่มีภาษาอื่นที่สามารถแทนที่ C สำหรับสิ่งนี้ ขั้นตอนแรกสำหรับตัวประมวลผลใหม่คือการประกอบแน่นอนว่าจะเป็น C ถัดไปและอาจเป็นสิ่งอื่นถ้ามันมีประสิทธิภาพเพียงพอที่จะเรียกใช้ระบบปฏิบัติการ (linux, bsd และอื่น ๆ ) C ถูกคิดค้นและหวังว่าจะแก้ปัญหาในเวลาที่พอร์ตโค้ดข้ามแพลตฟอร์มและตราบใดที่คุณมีระบบปฏิบัติการที่เป็นกรณีที่คอมไพเลอร์คอมไพเลอร์เข้ากันได้กับ C ทำให้รหัสที่ทำงานบนระบบปฏิบัติการจะทำไฟล์ C มาตรฐาน การดำเนินงานและ printf และสิ่งต่าง ๆ แต่โลหะเปลือยเป็นเรื่องที่แตกต่างไม่มีระบบปฏิบัติการมักไม่มีความคิดของระบบไฟล์หรือจอแสดงผล แต่โดยทั่วไปแล้วมีแนวโน้มว่าคอมไพเลอร์ C ซึ่งรากของมันเปลี่ยน C เป็นภาษาแอสเซมบลีเป้าหมายเฉพาะ


ที่จริงแล้วสำหรับ Arduino มันมากกว่า C มันคือ C ++ (หรืออาจเป็นเซตย่อยของ C ++)
ปีเตอร์มอร์เทนเซ่น

1

เพื่อตอบคำถามที่สองของคุณคำว่า "ไมโครคอนโทรลเลอร์" หมายความว่าชิปมี CPU และ RAM (และอาจเป็น ROM) บนบอร์ด ไมโครคอนโทรลเลอร์ทุกตัวใช้งานซอฟต์แวร์ - นั่นคือสาเหตุที่เราชอบ

คำถามที่ลึกลงไปโปรดทราบว่าในขณะที่ (เกือบ?) MCU ทั้งหมดมีคอมไพเลอร์ C ภาษา C พื้นฐานไม่สนับสนุนการเรียนการสอนทุกครั้งในโปรเซสเซอร์ทุกตัว ตัวอย่างเช่น C มีตัวดำเนินการเลื่อนซ้าย / ขวา แต่ไม่มีตัวดำเนินการหมุนซ้าย / ขวา ระบบตัวชี้ของ C ไม่สนับสนุนการแยกช่องว่างของโปรแกรมและข้อมูลตามธรรมชาติ (เช่นในสถาปัตยกรรมฮาร์วาร์ด) C ไม่มีการรองรับ SIMD โดยตรง

คอมไพเลอร์มีตัวเลือกเล็กน้อยสำหรับจัดการกับฟีเจอร์เหล่านี้:

  1. ขยายภาษาพื้นฐานโดยทั่วไปจะมีคำหลักใหม่ (เช่นใกล้และไกลสำหรับหน่วยความจำแบบเพจ)

  2. จัดให้มีฟังก์ชั่นที่แท้จริง (เช่น __ror () และ __rol () สำหรับการหมุน)

  3. ทำงานให้เป็นเครื่องมือเพิ่มประสิทธิภาพเพื่อให้ลำดับการทำงาน C ได้รับการรวบรวมเป็นคำสั่งที่มีประสิทธิภาพเดียว (เช่นทวีคูณ / สะสม)

  4. ไม่ต้องสนใจและทำให้ผู้ใช้เขียนรหัสชุดประกอบหากต้องการคุณสมบัติที่ไม่เป็นมาตรฐาน

ระดับถัดไปคือไฟล์ส่วนหัวที่ผู้ผลิตจัดหาให้ซึ่งกำหนดส่วนจดทะเบียนทั้งหมดให้คุณเป็นหลัก คุณสามารถสร้างสิ่งเหล่านี้ได้ด้วยตัวเอง แต่มันเป็นความเจ็บปวดที่ยิ่งใหญ่เว้นแต่คุณจะเป็นผู้เชี่ยวชาญใน MCU นั้น

ในที่สุดก็มีฟังก์ชั่นห้องสมุดที่ผู้ผลิตจัดหาให้ซึ่งจัดการกับสิ่งที่ต่ำอย่างเช่น register register สำหรับคุณ

ตัวอย่างของคุณผสมสองระดับ DDR เป็นมาโครที่อ้างถึงรีจิสเตอร์ มันนำมาใช้เป็นทั้งการเข้าถึงตัวชี้หรือฟังก์ชั่นที่แท้จริงของคอมไพเลอร์ (ฉันลืมที่) pinMode () เป็นฟังก์ชันที่เขียนไปยัง DDR register สำหรับคุณ

เมื่อคุณไปจากสาย MCU หนึ่งไปยังอีกสายหนึ่งคุณจะต้องเรียนรู้การลงทะเบียนใหม่และคอมไพเลอร์นิสัยใจคอใหม่ หากคุณอยู่ใน บริษัท เดียวกันคุณอาจได้รับ API ที่คล้ายกัน บริษัท ต่าง ๆ ไม่แชร์ API ทำไมเราจะช่วยคุณเปลี่ยนไปใช้คู่แข่งของเรา :-)


1

ไมโครคอนโทรลเลอร์มักจะมีไมโครโค้ดที่แตกต่างกันในระดับฮาร์ดแวร์ เพื่อช่วยให้เราไม่ต้องป้อนรหัสเครื่อง (เช่นคำแนะนำในรูปแบบของตัวเลข - แต่ละอันแสดงถึงไมโครโค้ดของไมโครคอนโทรลเลอร์) หรือในแอสเซมเบลอร์สัญลักษณ์ (ซึ่งมีป้ายกำกับช่วยจำสำหรับการเรียนการสอน

C และ Forth ได้รับการออกแบบมาเพื่อให้พกพาสะดวกในชุดรหัสเครื่องที่แตกต่างกัน

ดังนั้นถ้าคุณใช้ C บน Arduino และ C บน Teensy คุณกำลังใช้ C ในทั้งสองกรณี

ถ้าคุณใช้ Forth บน Arduino และ Forth บน Teensy คุณจะใช้ Forth ทั้งสองกรณี

บางครั้งสิ่งอำนวยความสะดวกด้านฮาร์ดแวร์เพิ่มเติมจะแจ้งให้บุคคล (หรือกลุ่ม) เปลี่ยนภาษาเป็นฮาร์ดแวร์ใหม่เพื่อเขียนโค้ดที่สร้างไว้ล่วงหน้าเพื่อให้คุณเข้าถึงสิ่งอำนวยความสะดวกใหม่ของแพลตฟอร์มฮาร์ดแวร์โดยไม่ต้องเขียนโค้ดระดับต่ำจำนวนมาก ด้วยตัวคุณเอง

ไลบรารีเหล่านี้ (ใน C) หรือพจนานุกรม (ใน Forth) สามารถมีฟังก์ชั่นเฉพาะของฮาร์ดแวร์หรือคำบางคำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.