ในตอนสุดท้ายฉันสนับสนุนให้กับไมโครคอนโทรลเลอร์เล็กน้อยเป็นแพลตฟอร์มการพัฒนาที่ยังคงทำงานได้ไม่เพียง แต่สำหรับอุตสาหกรรมที่ปกติจะเห็นวันนี้ แต่สำหรับแฮกเกอร์ . ฉันอาจหลอกให้คุณได้รับฮาร์ดแวร์ราคาถูกสองชิ้น คราวนี้เราจะได้รับการตั้งค่าระบบ FORTH บนฮาร์ดแวร์นั้นและดำเนินการบังคับ “Hello World” และ LED Blinky แต่จากนั้นเราจะนำไปสู่การจิ้มเป็นหนึ่งในคุณสมบัติที่ทำจากไมโครคอนโทรลเลอร์ที่เรียบร้อยมาก: มัลติทาสกิ้งง่าย
ไปทำงาน!
ฮาร์ดแวร์
Mecrisp-Stellaris ออกมาบนไมโครคอนโทรลเลอร์แขนจำนวนมาก แต่ฉันจะมุ่งเน้นที่นี่ในชิป STM32F103 ที่มีให้สำหรับเงินน้อยเป็นพิเศษในรูปแบบของสำเนาทั่วไปของเมเปิ้ลมินิซึ่งมักเรียกว่า “STM32F103 ระบบขั้นต่ำ “หรือ” เม็ดยาสีน้ำเงิน “เนื่องจากปัจจัยปัจจัยและความจริงที่ว่ามีการใช้สีแดงสำหรับการขาย ไมโครคอนโทรลเลอร์บนบอร์ดสามารถทำงานได้ที่ 72 MHz มี RAM 20 KB และแฟลช 64 หรือ 128 KB มันมี pins มากมาย, คนเดียวเท่านั้นที่มีความอดทน 5 v และมีอุปกรณ์ต่อพ่วงไมโครคอนโทรลเลอร์ปกติทั้งหมด มันไม่ใช่ที่มีประสิทธิภาพมากที่สุดและไม่มีหน่วยจุดลอยตัวหรือ DAC แต่มันเป็นการออกแบบเก่าที่ขรุขระที่มีให้น้อยกว่าที่จะต้องเป็น
โปรแกรมเมอร์เชื่อมต่อพลังงานเหนือ USB
สิ่งมหัศจรรย์ที่คล้ายกันของการผลิตจำนวนมากสำหรับโปรแกรมเมอร์ที่คุณจะต้องใช้แฟลชชิปในตอนแรก โคลนนิ่งใด ๆ ของ st-link v2 จะทำงานได้ดี (พอเพียงฮาร์ดแวร์ภายในโปรแกรมเมอร์เกือบจะเหมือนกับเป้าหมาย) ในที่สุดเมื่อพิจารณาว่าการไหลออกมาเช่นเดียวกับในเปลือกแบบโต้ตอบคุณจะต้องเชื่อมต่อแบบอนุกรมกับบอร์ด STM32 ที่อาจระบุอะแดปเตอร์ USB / อนุกรม
การตั้งค่าทั้งหมดนี้จะไม่มีค่าใช้จ่ายมากไปกว่าอาหารฟาสต์ฟู้ดมากนักและโปรแกรมเมอร์และอะแดปเตอร์ USB / Serial เป็นสิ่งที่คุณต้องการที่จะมีในชุดของคุณต่อไปถ้าคุณยังไม่ได้
คุณสามารถเปิดเครื่องได้โดยตรงผ่านพิน 3.3 และ GND ต่าง ๆ กระจัดกระจายไปรอบ ๆ บอร์ดหรือผ่านพอร์ต Micro USB หรือพิน 5V บนกระดานเป้าหมาย สองตัวเลือกหลังผ่านตัวควบคุม 3.3 v ก่อนเข้าร่วมกับพิน 3.3 พินทั้งหมดมีการเชื่อมต่อกันดังนั้นจึงดีที่สุดถ้าคุณใช้แหล่งจ่ายไฟเพียงครั้งเดียวเท่านั้น
เฟิร์มแวร์: ระบบที่สี่
Go Get Super-Special-Edition Mecrisp Forth Package จาก GitHub รวมอยู่ในไดเรกทอรี “ROMS” เป็นระบบที่สี่ที่จะใช้งานได้สำหรับการสาธิตที่นี่ ฉันโหลดในฐานที่น่านับถือจากห้องสมุด Embello ที่ยอดเยี่ยมของ [JCW] รวมถึงการจัดหาสิ่งต่าง ๆ เช่นการกำหนดค่า GPIO ที่ง่ายฟังก์ชั่นล่าช้าและอื่น ๆ มีห้องสมุดมากขึ้นมากมายและเราจะมองเข้าไปในครั้งต่อไปเมื่อเราต้องการพวกเขา
สิ่งที่ยอดเยี่ยมที่สุดเกี่ยวกับการใช้ระบบ A FRIGH คือจำเป็นต้องใช้ซอฟต์แวร์สนับสนุนน้อยมากในทางใดทางหนึ่ง – ล่ามที่สี่รวบรวมรหัสของตัวเองและคุณโต้ตอบกับเทอร์มินัลอนุกรม ทุกอย่างเกิดขึ้นภายในไมโครคอนโทรลเลอร์ สิ่งกีดขวางหนึ่งจากนั้นก็ออกมาบนชิป ในสมัยก่อนนี้เคยทำโดยการสลับในไบต์ด้วยตนเองและออกมามีขนาดเล็กมากพอที่จะบูตอย่างแท้จริงด้วยวิธีนี้เป็นไปได้ แต่คุณได้รับโปรแกรมเมอร์ชิปแล้วใช่ไหม?
ระบบสาธารณูปโภคของ Texane] เป็นวิธีที่ง่ายที่สุดในการออกไปยังชิปของคุณ ดาวน์โหลดจาก GitHub และสร้างตัวเองหรือลองเสี่ยงโชคด้วยผู้จัดการแพ็คเกจของ Distro (คน Windows คุณไม่ได้ถูกทิ้งไว้เลยแม้ว่าไบนารีจะไม่เห็นการอัปเดตในขณะที่มันจะทำ)
เชื่อมต่อสายการเขียนโปรแกรมในแฟชั่นที่ชัดเจนและออกคำสั่ง Magic Erease ST-Flash และ ST-Flash เขียน Mecrisp-Stellaris-Hackaday-Edition.bin 0x8000000 ในห้าวินาทีคุณจะพร้อมที่จะดังก้อง
gnd – gnd
SWCLK – CLK
SWSIO – DIO
ต้องได้รับโปรแกรมเมอร์เป็นเรื่องยุ่งยากหากคุณไม่มี แต่มันจะทำให้ชีวิตที่เหลือของคุณง่ายขึ้นและการได้รับหนึ่งเป็นพื้นฐานเท่ากับการคลิก “จ่าย” และรอ ของเราเอง [al williams] (ไม่มีความสัมพันธ์) มีโพสต์ล่าสุดเกี่ยวกับการใช้ซอฟต์แวร์เดียวกันสำหรับการดีบักรหัส C หรือ Arduino กับ GDB ดังนั้นจึงคุ้มค่ากับเวลาในการตั้งค่านี้
ซอฟต์แวร์
hookup อนุกรมขับเคลื่อนด้วยแล็ปท็อป
นำโปรแกรมเมอร์ออกไปตอนนี้และเชื่อมต่อกับ STM32 มากกว่าแบบอนุกรม อัตราการรับส่งข้อมูลเริ่มต้นต้องอยู่ที่ 115,200 หากคุณยังไม่ได้ถอดปลั๊กไฟคุณอาจต้องกดปุ่มรีเซ็ตบนบอร์ด STM32 ถ้าทุกอย่างเป็นไปด้วยดีคุณจะได้รับการต้อนรับจากกะโหลกศีรษะและประแจที่คุ้นเคย Mecrisp คาดหวังว่า Linefeed ในตอนท้ายของบรรทัดดังนั้นหากคุณกำลังส่ง LF + CR คุณจะได้รับการส่งคืนสองครั้ง
A9 TX – Serial Rx
A10 Rx – Serial TX
gnd – gnd
[JCW] Folie เป็นโปรแกรมจำลองเทอร์มินัลอนุกรมที่ดีและหลายแพลตฟอร์มสำหรับแอปพลิเคชันนี้ สิ่งที่ทำหน้าที่โปรแกรมเทอร์มินัลปกติของคุณไม่อนุญาตให้คุณป้อนบรรทัดคำสั่งอีกครั้งด้วยลูกศรขึ้นซึ่งทำให้การดูแลข้อผิดพลาดมากขึ้นง่ายกว่าการพิมพ์คำสั่งยาวอีกครั้ง มันยังรวมไฟล์อื่น ๆ โดยอัตโนมัติซึ่งฉันใช้ในการสร้างไบนารีสำหรับบทความนี้อย่างมาก คุณไม่จำเป็นต้องเรียกใช้ FOLIE แต่ฉันเดิมพันคุณจะชอบมัน
สวัสดีชาวโลก
ตอนนี้มันเป็นเวลา “Hello World” หากคุณเป็นคนใหม่ไปที่นี่แนะนำให้เลือกมาก พิมพ์ 2 2 + และกด Enter มันบอกว่าโอเค .. ที่ให้ความมั่นใจใช่มั้ย ตอนนี้พิมพ์ (อ่าน “Dot”) และจะพิมพ์ผลลัพธ์ที่ไม่น่าแปลกใจ DOT เป็นสัดส่วนการจดชวเลขที่ออกมาเป็นครั้งแรกที่คุณต้องการภายใน คำสั่งจำนวนมากที่มีจุดพิมพ์ผลลัพธ์ของพวกเขาทันที .s (dot-ess) พิมพ์เนื้อหาสแต็กเป็นต้น สำนวนสองอย่างที่เราจะเห็นมากคือ @ สำหรับการรับตัวแปรหรืออ่านอินพุตและ! สำหรับการตั้งค่าตัวแปรหรือเอาต์พุต อ่านสิ่งเหล่านี้เป็น “รับ” และ “ตั้งค่า” ในหัวของคุณเมื่อสแกนรหัส
ต่อไปเรามาดูวิธีการเขียนฟังก์ชั่น : เริ่มนิยามฟังก์ชั่นและ; สิ้นสุดลง ดังนั้น: สี่ 2 2 +; กำหนดฟังก์ชั่นที่เพิ่มสองและสองด้วยกัน (และรวบรวมแบบเรียลไทม์!) จากนั้นคุณสามารถเปิดและเรียกใช้ฟังก์ชั่นนี้ได้ทันที สี่ .. จะแสดงให้คุณเห็นว่าฟังก์ชั่นของเราได้ทิ้งผลรวมของสองและสองบนสแต็ก ในแง่นี้ฟังก์ชั่นออกมาไม่ได้ฟังก์ชั่นจริงๆ พวกเขาไม่ได้รับอาร์กิวเมนต์ที่ชัดเจนหรือส่งคืนค่าที่ชัดเจน พวกเขาใช้งานกับข้อมูลที่อยู่บนสแต็กและออกจากผลลัพธ์ที่นั่นด้วยเช่นกัน นั่นเป็นเหตุผลที่เรียกว่าฟังก์ชั่น “คำ” ฉันจะยึดครองอนุสัญญานี้จากนี้ไป
ในที่สุดก็คือ “Hello World” :: HW “สวัสดีโลก!” CR; “สตริงมีคี่เล็กน้อยส่วนใหญ่เป็นเพราะวิธีการแยกวิเคราะห์ – คอมไพเลอร์อ่านถึงช่องว่างแล้วดำเนินการสิ่งที่พบดังนั้นจะต้องมีช่องว่างระหว่างการพิมพ์ – A-string คำสั่ง (. “) และอักขระตัวแรกที่คุณต้องการพิมพ์ คำสั่งการพิมพ์สแกนไปข้างหน้าจนกว่าจะพบว่าการปิด “แม้ว่าคุณจะไม่ต้องการพื้นที่พิเศษที่นั่น CR ส่งคืนค่าขนส่งพิมพ์ HW ที่พรอมต์ Hello, World!
ไฟ LED กะพริบ
แม้ว่าอินพุตและเอาต์พุตแบบอนุกรมนั้นง่ายมากกะพริบเป็นไฟ LED เป็นมาตรฐาน “Hello World” มาตรฐานของไมโครคอนโทรลเลอร์ดังนั้นจึงถึงเวลาสำหรับ GPIO บางตัว เนื่องจากระบบได้รับการกำหนดค่าไว้สำหรับบอร์ดไมโครคอนโทรลเลอร์นี้โดยเฉพาะการเปลี่ยน LED เป็นเรื่องง่ายเหมือนการพิมพ์ LED.on ที่พรอมต์ ต้องการปิดหรือไม่ LED.OFF การกะพริบด้วยตนเองจะได้รับเก่าค่อนข้างเร็ว แต่ลองเขียนคำกะพริบ : กะพริบตา LED.On 100 MS LED.OFF 200 MS; จะทำเคล็ดลับ ลองกะพริบกะพริบกะพริบกะพริบกะพริบ ดูรหัสการสาธิต Blink ของฉันสำหรับการทำอย่างละเอียด (เพิ่มเติมใน MS ในสองสามพันมิลลิวินาที)
รายละเอียดของการเริ่มต้น GPIO ถูกซ่อนอยู่ใน Core / Hackaday / LED.fs และใน STM32F1 / IO.FS ของ Embello ตามลำดับ การขุดผ่านคุณจะเห็นขั้นตอนการเริ่มต้นมาตรฐาน: PIN เฉพาะถูกตั้งเป็นเอาต์พุตโดยการพลิกบิตบางบิตในการลงทะเบียนการควบคุมอุปกรณ์ต่อพ่วงของ STM32 [JCW] ได้กำหนดจำนวนพวงของสิ่งเหล่านี้ทำให้การตั้งค่า PIN เป็นเอาต์พุตด้วยไดรเวอร์ Push-Pull เหมือนกับ PC13 Omode-PP io-mode! (จำไว้ว่า “!” บ่งชี้กำหนดค่าในตัวแปรหรือลงทะเบียน)
ในการกำหนดค่า PIN PA7 สำหรับ ADC INPUT: PA7 IMODE-ADC IO-MODE! ปุ่มทดสอบโดยใช้ตัวต้านทานแบบ pullup หรือ pulldown ในตัว: PA3 iMode-pull io-mode! จากนั้นตั้งค่าเอาต์พุตเพื่อดึงขึ้นหรือลงโดยใช้ True PA3 IO! หรือ PA3 iOS! จากนั้นคุณจะสามารถอ่านสถานะของปุ่มด้วย PA3 IO @ (“IO Get”) ในภายหลัง
GPIO บนชิป STM32 มีความยืดหยุ่นมากและหากคุณต้องการที่จะลึกลงไปในตัวเลือกการกำหนดค่าในแผ่นข้อมูลคุณสามารถตั้งค่าทั้งหมดนี้ได้อย่างง่ายดายโดยใช้รหัส IO.fs ของ JCW] ของ [JCW] ตัวอย่างเช่น io.all พิมพ์การลงทะเบียน GPIO ทั้งหมดและค่าของพวกเขาซึ่งเป็นความช่วยเหลือที่ดีสำหรับการดีบักแบบโต้ตอบ ที่กล่าวว่ามีห้องพักที่นี่สำหรับชั้นฮาร์ดแวร์ที่เป็นมิตรกับผู้ใช้ที่ใช้งานง่ายมากขึ้นหากคุณต้องการมีส่วนร่วม
มัลติทาสกิ้งอย่างรวดเร็ว
ดังนั้นตอนนี้เรามีไฟ LED กะพริบและการพิมพ์แบบอนุกรม “Hello World” ไม่ใช่การเริ่มต้นที่ไม่ดีและทั้งสองอย่างนี้เป็นการใช้งานที่ดีของการโต้ตอบของ Forth: ไฟ LED สว่างขึ้นเมื่อคุณพิมพ์กะพริบตา หนึ่งในเอกสิทธิ์ของคุณธรรมสำหรับฉันคือความสะดวกในการดำเนินการระหว่างการทดสอบคำแบบโต้ตอบเช่นนี้แล้วการปรับใช้ฟังก์ชันการทำงานในระบบการทำงาน เหตุผลหนึ่งคือเกือบทั้งหมดจะสนับสนุนมัลติทาสกิ้งสหกรณ์ขั้นพื้นฐาน นี่คือสิ่งที่ฉันหมายถึง
ก่อนอื่นให้ลู๊กฟังก์ชั่นการกะพริบของเราเพื่อให้เราไม่ต้องพิมพ์มากนัก : BB เริ่มกะพริบอีกครั้ง สร้างฟังก์ชั่น BB สำหรับ “Bad Blink” ที่จะทำงานตลอดไป ปัญหาเกี่ยวกับ “Run Forever” ใน Forth คือคุณไม่เคยกลับไปที่บรรทัดคำสั่งของล่ามโดยไม่ต้องกดปุ่มรีเซ็ตแล้วทุกอย่างที่คุณทำงานใน RAM จะหายไป
แทนที่จะกระพริบในลูปด้วยทางออก : GB เริ่มกะพริบคีย์? จนกระทั่ง ; สร้างฟังก์ชั่นที่จะเรียกใช้คำสั่งกะพริบกะพริบของเราจนกว่าจะมีการป้อนข้อมูลจากแป้นพิมพ์ – กดแบบย้อนกลับแบบย้อนกลับ โครงสร้างการวนลูปนี้เป็นประโยชน์อย่างมากสำหรับการทดสอบฟังก์ชั่นที่คุณต้องการทำงานอย่างต่อเนื่องโดยไม่ต้องแขวนระบบ เก็บไว้ฉันใจ.
เมื่อเราปรับแต่งฟังก์ชั่นการกะพริบตาของเราให้ทำงานตามที่เราต้องการเรามาสร้างงานพื้นหลังเพื่อให้สามารถกระพริบได้
งาน: Blinktask
: กะพริบ &
Blinktask เปิดใช้งาน
เริ่มกะพริบอีกครั้ง
;
มัลติทาสก์
กะพริบ &
สั้น ๆ งาน: Word สร้างพื้นที่หน่วยความจำบางอย่างสำหรับงานพื้นหลังที่กะพริบของเราที่เราเรียกว่า BlinkTask ฟังก์ชั่นกะพริบและทำงานในพื้นหลัง กะพริบตาและเริ่มโดยการประกาศว่ามันจะใช้บริบทงาน BlinkTask และต้องเริ่มทำงาน จากนั้นมันก็กลายเป็นวงที่กะพริบที่ไร้ขีด จำกัด ซึ่งไม่เคยออกไป มัลติทาสก์เปลี่ยนเป็นมัลติทาสก์และกะพริบและเรียกใช้งานของเรา เรียกใช้และไฟ LED กะพริบขณะที่คุณยังสามารถโต้ตอบกับคอนโซลได้ หวาน. ประเภทงานและคุณจะเห็นว่ามีสองใช้งานอยู่: หนึ่งคือไฟกระพริบของเราและอีกอันคือล่ามแบบโต้ตอบ
แต่งานกะพริบเป็นอย่างไรต้องรู้ว่าจะให้ผลใด ๆ กับกระบวนการพร้อมกันอื่น ๆ ? ออกมาคำชั่วคราวหยุดให้ผลผลิตจากบริบทปัจจุบันและย้ายไปยังมัลติทาสกิ้งรอบต่อไป Round-Robin ฟังก์ชั่น MS ซึ่งรวมถึงคำสั่งหยุดชั่วคราวดังนั้นสิ่งที่ดูเหมือนว่าการปิดกั้นการบล็อกในการตั้งค่างานเดียวจะจบลงด้วยการเล่นอย่างน่าอัศจรรย์ด้วยงานอื่น ๆ ของคุณ
สิ่งที่ยอดเยี่ยมเกี่ยวกับการมัลติทาสก์สหกรณ์คือคุณสามารถควบคุมได้เมื่อมีการสวิทช์บริบทซึ่งสามารถช่วยขจัดความผิดพลาดที่คุณจะพบในระบบยึดเอาก่อน ข้อเสียคือคุณต้องรับผิดชอบในการจดจำฟังก์ชั่นของคุณในตอนนี้และคุณต้องตรวจสอบเวลาด้วยตัวคุณเอง แน่นอนว่านี่เป็นไมโครคอนโทรลเลอร์และคุณมีตัวควบคุมอินเตอร์รัปต์ภายในที่ค่อนข้างร่ำรวยในการเล่นด้วยเช่นกัน
จุดที่แท้จริงของการทำงานหลายอย่างของ Multitasking on Forth คือมันทำให้เวิร์กโฟลว์ที่ยอดเยี่ยมสำหรับการเขียนการทดสอบและการปรับใช้ Daemons เล็กน้อย: ฟังก์ชั่นที่ต้องการเป็น “อยู่เสมอ” ก่อนอื่นให้เขียนฟังก์ชั่นที่กระทำครั้งเดียว ประการที่สองทดสอบในลูปด้วยฟักหลบหนี ประการที่สามเมื่อมันทำงานให้ลบการหลบหนีและสร้างงานพื้นหลังให้ จากนั้นคุณสามารถเปิดและปิดโดยใช้การใช้งานและตื่นจากภายในงานอื่น ๆ ดู Mecrisp’s Multitask.txt แหล่งที่มาสำหรับรายละเอียดเพิ่มเติมมากมาย
อะไรต่อไป?
จนถึงตอนนี้เราได้ตั้งค่า Mecrisp-Stellaris โดยมีห้องสมุดเพิ่มเติมจากกรอบการเกษตรของ Jeelabs และเรียกใช้การสาธิตที่รวดเร็ว หากสิ่งนี้ทำให้คุณสนใจฉันจะพาคุณไปที่การสร้างซอฟต์แวร์จริงในครั้งต่อไป มีอีกมากที่จะพูดเกี่ยวกับวิธีการที่ Mecrisp จัดการความแตกต่างของแฟลชกับ RAM, อินพุตและเอาต์พุตและการปฏิบัติของการพัฒนาแบบโต้ตอบ บางแง่มุมของการทำงานที่แปลกประหลาดบางอย่างจะเพิ่มหัวรูปตลกของพวกเขาและเราจะเรียนรู้ที่จะรักพวกเขาต่อไป
ในขณะเดียวกันรับบอร์ด STM32F103 ราคาถูกของคุณกระพริบด้วยไบนารีของเราและใช้งานเล็กน้อยเพื่อเล่นในสภาพแวดล้อมที่สี่บนชิป กะพริบไฟ LED บางดวง มองไปรอบ ๆ อภิธานศัพท์ Mecrisp-Stellaris และเอกสารประกอบของ Embello API หรือเพียงพิมพ์รายการเพื่อดูคำสั่งทั้งหมดที่การกำจัดของคุณและเริ่มแฮ็คออกไป