ข้อดีของไมโครโปรเซสเซอร์ 32- บิต 48-96 Mhz (เช่นใน Arduino เนื่องจาก)


10

ดูเหมือนว่าArduino ครบกำหนดแล้ว (32 บิต, 84 Mhz, ARM-Cortex-M3-based SAM3X8E) ได้เปิดตัวแล้ววันนี้

นอกจากนี้เห็นได้ชัดว่ามีโปรเซสเซอร์มากมายในหมวดหมู่นี้ (32- บิต / 48-96 Mhz / ARM) เช่นเดียวกับบอร์ดต้นแบบที่สอดคล้องกัน:

  • NXP LPC1768 / mBed
  • STM32 / การค้นพบ
  • PIC32 / ChipKit
  • PIC32 / Parallax Propeller
  • Launchpad LM4F120 / TI
  • เป็นต้น

ฉันพยายามที่จะเข้าใจถึงความดึงดูดของไมโครโปรเซสเซอร์ "ที่อยู่ระหว่าง" ซึ่งสำหรับฉันดูเหมือนจะอยู่ระหว่าง AVR / MSP430 / etc ระดับล่าง (ข้อดี: ราคาไม่แพงพลังงานต่ำรอยเท้าขนาดเล็ก) และ ARM7 ระดับสูง / ฯลฯ (โปร: ความสามารถในคำสั่งที่มากขึ้นต่อวินาที)

ตัวประมวลผลแบบอิง 32-bit / 48-96 Mhz / ARM ในตัวเลือกที่เหมาะสมคืออะไร? โดยเฉพาะอย่างยิ่งฉันสงสัยว่าแอพพลิเคชั่นใดหรือพารามิเตอร์ใดที่พวกเขาต้องการเพื่อเป็นทางเลือกที่ดีกว่าในการออกแบบทั้งไมโครคอนโทรลเลอร์ 8 บิตต่ำสุดหรือโปรเซสเซอร์ ARM7 ระดับไฮเอนด์


อย่างแรกเลยในใจของฉันคุณสามารถประมวลผลวิดีโอสตรีมสด - ที่ Arduino ไม่สามารถจัดการได้ นอกจากนี้ยังอนุญาตให้อัลกอริธึมการเข้ารหัสขั้นสูงหรือการแฮช (เร็วกว่าและง่ายกว่าใน Arduino) ฉันประหลาดใจที่ Arduino ออกมาพร้อมกับแพลตฟอร์ม 32 บิต แต่มันแสดงให้คุณเห็น - บางคนต้องการทำมากกว่าควบคุมรีเลย์ มันเป็นวันที่ยอดเยี่ยมสำหรับ Arduino!
Piotr Kula

คุณจะไม่ทำอะไรยิ่งไปกว่าการประมวลผลวิดีโอสดบนโปรเซสเซอร์ <100 MHz เว้นแต่คุณจะทำในแกนฟังก์ชั่นพิเศษที่แนบมา และโดยเฉพาะอย่างยิ่งไม่ได้อยู่ในข้อ จำกัด on-board แรมบนอุปกรณ์เหล่านี้ จุดที่เหมือนจริงมากขึ้นคือค่าใช้จ่ายของชิปเหล่านี้จะไม่สูงกว่าของ 8 บิตอย่างมาก มันอาจจะต่ำกว่า ATMEGA ที่มีแฟลชและ RAM เปรียบเทียบกัน
Chris Stratton

3
เท่าที่ฉันรู้ Parallax Propeller เป็นชิปแบบกำหนดเองที่ไม่มีความเกี่ยวข้องกับ PIC32 มีแหล่งเชื่อมต่อใดบ้าง
AndrejaKo

คำตอบ:


12

นี่เป็นหนึ่งในวิชาที่สามารถถกเถียงกันอย่างมาก มีมุมมองที่แตกต่างกันมากมายและสิ่งต่าง ๆ มีความสำคัญต่อคนต่างกัน ฉันจะพยายามให้คำตอบที่ครอบคลุม แต่เข้าใจว่าจะมีคนที่ไม่เห็นด้วยเสมอ แค่เข้าใจว่าคนที่ไม่เห็นด้วยกับฉันนั้นผิด (ผมล้อเล่น.)

สรุปด่วน:

คำตอบนี้จะเป็นคำตอบยาว ๆ ขอผมสรุปเรื่องนี้ไว้ก่อน สำหรับคนส่วนใหญ่การครอบตัดล่าสุดของชิป ARM Cortex-M0 / M3 / M4 เสนอทางออกที่ดีที่สุดคุณสมบัติที่ดีที่สุดสำหรับค่าใช้จ่าย สิ่งนี้เป็นจริงเมื่อเปรียบเทียบ MCU 32 บิตเหล่านี้กับบรรพบุรุษ 8 และ 16 บิตเช่น PIC และ MSP430 M0 สามารถซื้อได้น้อยกว่า US $ 1 ต่อชิ้นและ M4 สำหรับน้อยกว่า US $ 2 ต่อชิ้นดังนั้นสำหรับแอปพลิเคชันที่มีความอ่อนไหวด้านราคาโซลูชั่น ARM นั้นดีมาก M0 นั้นมีพลังงานต่ำมากและน่าจะดีพอสำหรับคนส่วนใหญ่ สำหรับผู้ที่มีความไวต่อพลังงานมาก MSP430s อาจยังคงเป็นตัวเลือกที่ดีกว่า แต่ M0 นั้นคุ้มค่าที่จะพิจารณาแม้แต่แอปพลิเคชันเหล่านี้

หากคุณมีความสนใจในการวิเคราะห์เชิงลึกยิ่งขึ้นอ่านต่อไม่เช่นนั้นคุณสามารถหยุดอ่านได้ทันที

ตอนนี้ฉันจะดูแต่ละพื้นที่และเปรียบเทียบ MCU ที่แตกต่างกัน:

ความเร็วของการดำเนินการ

แน่นอนว่า MCU แบบ 32 บิตกำลังจะเร็วขึ้น พวกเขามักจะมีความเร็วสัญญาณนาฬิกาที่เร็วขึ้น แต่ยังทำงานได้มากขึ้นสำหรับนาฬิกาแต่ละเรือน MCUs เช่น ARM Cortex-M4 มีคำแนะนำในการประมวลผล DSP และยังสามารถรองรับจุดลอยตัวในฮาร์ดแวร์ ซีพียู 8 และ 16 บิตสามารถทำงานกับตัวเลข 32 บิต แต่ไม่มีประสิทธิภาพในการทำเช่นนั้น การทำเช่นนั้นจะใช้การลงทะเบียน CPU รอบสัญญาณนาฬิกาของ CPU และหน่วยความจำแฟลชอย่างรวดเร็วสำหรับการจัดเก็บโปรแกรม

ความง่ายในการพัฒนา

ในความคิดของฉันนี่เป็นเหตุผลที่มีค่าที่สุดสำหรับการใช้ MCU แบบ 32 บิตที่ทันสมัย ​​- แต่ก็เป็นสิ่งที่น่าชื่นชมมากที่สุด ให้ฉันเปรียบเทียบสิ่งนี้กับ PIC 8 บิตก่อน นี่คือการเปรียบเทียบกรณีที่เลวร้ายที่สุด แต่ยังดีที่สุดที่จะแสดงให้เห็นถึงจุดของฉัน

PIC ที่มีขนาดเล็กลงนั้นต้องการการเขียนโปรแกรมในภาษาแอสเซมบลี จริงมีคอมไพเลอร์ C สำหรับแม้แต่ PIC 8 บิต แต่คอมไพเลอร์เหล่านั้นฟรีหรือดี คุณไม่สามารถรับคอมไพเลอร์ที่ดีและฟรี คอมไพเลอร์รุ่นฟรีนั้นพิการเนื่องจากการเพิ่มประสิทธิภาพไม่ดีเท่ารุ่น "Pro" รุ่น Pro ประมาณ 1,000 เหรียญสหรัฐและรองรับชิป PIC ตระกูลเดียว (8, 16, หรือ 32 บิต) หากคุณต้องการใช้มากกว่าหนึ่งครอบครัวคุณต้องซื้อสำเนาอีกชุดหนึ่งสำหรับอีก 1,000 เหรียญสหรัฐ คอมไพเลอร์รุ่น "มาตรฐาน" ทำการปรับแต่งในระดับปานกลางและราคาประมาณ US $ 500 สำหรับแต่ละตระกูลชิป PIC 8 บิตช้าตามมาตรฐานที่ทันสมัยและต้องการการปรับให้เหมาะสม

จากการเปรียบเทียบมีคอมไพเลอร์ C ที่ดีมากมายสำหรับ ARM MCU ที่ไม่มีค่าใช้จ่าย เมื่อมีข้อ จำกัด ขีด จำกัด เหล่านั้นมักจะเป็นขนาดสูงสุดของหน่วยความจำแฟลชที่รองรับ บนเครื่องมือ Freescale Codewarrior ขีด จำกัด นี้คือ 128Kbytes นี่เป็นจำนวนมากสำหรับคนส่วนใหญ่ในฟอรัมนี้

ข้อดีของการใช้คอมไพเลอร์ C คือคุณไม่ต้องกังวล (มาก) กับรายละเอียดในระดับต่ำของแผนที่หน่วยความจำของ CPU การเพจบน PIC นั้นเจ็บปวดเป็นพิเศษและหลีกเลี่ยงได้ดีที่สุดหากเป็นไปได้ ข้อดีอีกอย่างคือคุณไม่ต้องกังวลกับการส่งหมายเลข 16 และ 32 บิตบน MCU 8 บิต (หรือหมายเลข 32 บิตใน MCU 16 บิต) ในขณะที่มันไม่ยากอย่างยิ่งที่จะทำในภาษาแอสเซมบลีมันเป็นความเจ็บปวดในด้านหลัง

มีคอมไพเลอร์ที่ไม่ใช่ ARM C อื่น ๆ ที่ทำงานได้ดี คอมไพเลอร์ MSP430 ดูเหมือนว่าจะทำงานที่เหมาะสม เครื่องมือ Cypress PSoC (โดยเฉพาะอย่างยิ่ง PSoC1) เป็นรถบั๊กกี้

หน่วยความจำแบบแบน

MCU ที่มีเพจ / RAM ลงทะเบียน / แฟลชเป็นเพียงโง่ ใช่ฉันกำลังพูดถึง PIC 8 บิต เป็นใบ้เป็นใบ้เป็นใบ้ นั่นทำให้ฉันปิดการทำงานของ PIC มากจนฉันไม่ได้ใส่ใจที่จะดูสิ่งใหม่ ๆ ของพวกเขา (คำเตือน: นี่หมายความว่า PIC ใหม่อาจได้รับการปรับปรุงและฉันก็ไม่รู้)

ด้วย 8-bit MCU มันเป็นเรื่องยาก (แต่ไม่เป็นไปไม่ได้) ในการเข้าถึงโครงสร้างข้อมูลที่มีขนาดใหญ่กว่า 256 ไบต์ ด้วย MCU แบบ 16 บิตที่เพิ่มเป็น 64 kbytes หรือ kwords ด้วย MCU แบบ 32 บิตที่มีขนาดสูงสุด 4 กิกะไบต์

คอมไพเลอร์ C ที่ดีสามารถซ่อนสิ่งนี้ได้มากมายจากโปรแกรมเมอร์ (aka You) แต่ถึงอย่างนั้นมันก็มีผลต่อขนาดโปรแกรมและความเร็วในการประมวลผล

มีแอปพลิเคชั่น MCU หลายตัวที่จะไม่เป็นปัญหา แต่แน่นอนว่ายังมีแอปพลิเคชันอื่น ๆ อีกมากมายที่จะมีปัญหากับสิ่งนี้ มันเป็นปัญหาส่วนใหญ่ของข้อมูลที่คุณต้องการ (อาร์เรย์และโครงสร้าง) ใน RAM หรือแฟลช แน่นอนว่าเมื่อความเร็วของ CPU เพิ่มขึ้นอัตราต่อรองของการใช้โครงสร้างข้อมูลที่ใหญ่ขึ้น!

ขนาดบรรจุภัณฑ์

PIC ขนาดเล็กบางตัวและ MCU 8 บิตอื่น ๆ นั้นมีอยู่ในแพ็คเกจขนาดเล็กจริงๆ 6 และ 8 พิน! ปัจจุบัน ARM Cortex-M0 ที่เล็กที่สุดที่ฉันรู้จักอยู่ใน QFN-28 ในขณะที่ QFN-28 มีขนาดเล็กพอสำหรับคนส่วนใหญ่ แต่ก็ไม่เล็กพอสำหรับทุกคน

ราคา

PIC ที่ถูกที่สุดคือราคา ARM Cortex-M0 ประมาณหนึ่งในสาม แต่นั่นคือจริงๆ $ 0.32 เทียบกับ US $ 0.85 ใช่ความแตกต่างของราคานั้นมีบางอย่าง แต่ฉันพูดว่าคนส่วนใหญ่ในเว็บไซต์นี้ไม่สนใจว่ามีความแตกต่างด้านค่าใช้จ่ายเล็กน้อย

ในทำนองเดียวกันเมื่อเปรียบเทียบ MCU ที่มีความสามารถมากขึ้นกับ ARM Cortex-M0 / M3 / M4 โดยปกติ ARM Cortex จะออกมา "อย่างสม่ำเสมอแม้" หรือด้านบน เมื่อทำการแฟคตอริ่งในสิ่งอื่น ๆ (ความสะดวกในการพัฒนา, ค่าคอมไพเลอร์, ฯลฯ ) ARM นั้นน่าสนใจมาก

สรุปที่สอง

ฉันเดาว่าคำถามจริงคือทำไมคุณไม่ใช้ ARM Cortex-M0 / M3 / M4 เมื่อต้นทุนที่แท้จริงเป็นสิ่งสำคัญ เมื่อการใช้พลังงานต่ำเป็นสิ่งสำคัญ เมื่อต้องการขนาดแพ็คเกจที่เล็กที่สุด เมื่อความเร็วไม่สำคัญ แต่สำหรับแอพพลิเคชั่นส่วนใหญ่นั้นไม่มีการใช้สิ่งเหล่านี้และปัจจุบัน ARM เป็นทางออกที่ดีที่สุด

ให้ราคาต่ำเว้นแต่จะมีเหตุผลที่ดีที่จะไม่ใช้ ARM Cortex จากนั้นมันสมเหตุสมผลที่จะใช้ มันจะช่วยให้เวลาในการพัฒนาเร็วขึ้นและง่ายขึ้นโดยมีอาการปวดหัวน้อยลงและระยะขอบการออกแบบที่ใหญ่กว่า MCU อื่น ๆ ส่วนใหญ่

มี MCU อื่นที่ไม่ใช่ ARM Cortex 32 บิตพร้อมใช้งาน แต่ฉันไม่เห็นประโยชน์ใด ๆ มีข้อดีหลายประการในการใช้สถาปัตยกรรม CPU มาตรฐานรวมถึงเครื่องมือในการพัฒนาที่ดีขึ้นและนวัตกรรมด้านเทคโนโลยีที่เร็วขึ้น

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


1
ในการเข้าถึงตำแหน่งหน่วยความจำด้วย ARM อันดับแรกจะต้องโหลดการลงทะเบียนด้วยที่อยู่ภายใน 4K ของมันก่อน อุปกรณ์ I / O จำนวนมากได้รับการจัดสรรพื้นที่ที่อยู่มากกว่า 4K แม้ว่าหลาย ๆ เครื่องจะใช้ที่อยู่แบบแยกเพียงไม่กี่แห่งเท่านั้น ในทางตรงกันข้าม 18Fxx PIC สามารถทำงานได้โดยตรงในสถานที่ I / O ส่วนใหญ่ด้วยคำสั่งเดียวโดยไม่ขึ้นกับสถานะของธนาคาร วิธีการที่แรมส่วนใหญ่นั้นค่อนข้างน่ารำคาญ แต่สำหรับการตีบิตบางประเภท (จุดประสงค์ที่สถาปัตยกรรม PIC ได้รับการออกแบบในปี 1970) สถาปัตยกรรม PIC ทำงานได้ดีมาก
supercat

1
BTW ฉันพบว่าอยากรู้ว่าในขณะที่ไมโครโปรเซสเซอร์ 8 บิตที่ได้รับความนิยมจากปี 1970 สามารถประมวลผลโครงสร้างข้อมูลขนาด 256 ไบต์ได้อย่างมีประสิทธิภาพและตัวประมวลผล 16 บิตที่ได้รับความนิยมสามารถทำงานได้ดีกับโครงสร้างข้อมูล 65,536 ไบต์ - ไบต์ขอบเขตหรือโครงสร้างข้อมูลที่มีการจัดตำแหน่งตามอำเภอใจเกือบจะใหญ่ตัวประมวลผล 8 บิตและ 16 บิตที่ใหม่กว่าทำให้ยากในการเขียนโค้ดที่มีประสิทธิภาพที่เลาะเลียบหน้า / ขอบเขตของธนาคาร
supercat

@supercat ช่วงที่อยู่ 4K สำหรับคำสั่ง "LDR / SRT Immediate Offset" เป็นจริง แต่มักจะไม่ใช่ปัญหา ฉันไม่เห็นด้วยกับความคิดเห็นที่เหลือของคุณ เมื่อดูที่เอกสาร Freescale M4 อุปกรณ์ต่อพ่วงแต่ละรายการจะไม่ใช้ช่วงที่อยู่เกิน 4K ดังนั้นตัวชี้ "ที่อยู่พื้นฐาน" เดียวก็เพียงพอสำหรับการเข้าถึงการลงทะเบียนทั้งหมดในอุปกรณ์ต่อพ่วงนั้น นอกจากนี้ยังมีการลงทะเบียนวัตถุประสงค์ทั่วไป 32 ข้อซึ่งสามารถใช้เป็นตัวชี้ที่อยู่พื้นฐานได้ดังนั้นการเข้าถึงอุปกรณ์ต่อพ่วงหลายตัวได้อย่างรวดเร็วในส่วนเดียวกันของรหัสนั้นค่อนข้างไม่เจ็บปวด

1
@supercat จุดที่สองของคุณสัมผัสกับการอภิปราย RISC vs. CISC ทั้งหมด ARM เป็นซีพียู RISC ซึ่งหมายความว่ามันได้รับการปรับแต่งให้ทำงานได้บ่อยที่สุด งานที่ไม่บ่อยเช่นการเข้าถึงที่ไม่ได้ จำกัด ต้องใช้งานมากขึ้นหรือใช้เวลามากขึ้น (ขึ้นอยู่กับ CPU Arch) ฉันคิดว่านี่เป็นสิ่งที่ดีไม่ใช่สิ่งเชิงลบ นั่นคือเหตุผลที่เราได้รับ MCU แบบ 32 บิตที่รวดเร็วสำหรับราคา 8 บิตที่เก่ากว่า แม้จะมีนิสัยใจคอเหล่านี้ฉันก็จะใช้ CPU ตัวใดตัวหนึ่งของ PIC เหล่านี้ได้ทุกวัน

ฉันสะกดผิด ฉันไม่ได้หมายความว่าการลงทะเบียนฐานเดียวไม่สามารถจัดการอุปกรณ์ต่อพ่วงทั้งหมด แต่ต้องลงทะเบียนบ่อยครั้งสำหรับอุปกรณ์ต่อพ่วงแต่ละเครื่อง (ดังนั้นจึงไม่สามารถทำได้ง่ายๆเช่นลงทะเบียนนั่งกับ IO_BASE_ADDR ตลอดเวลา ) สำหรับโค้ดบางประเภทสามารถตั้งค่าบิต I / O ในรอบเดียวด้วยคำสั่งเช่น "bsf LATA, 4" โดยไม่ต้องโหลดรีจิสเตอร์ใด ๆ ไว้ก่อนจะมีประโยชน์มาก ฉันชอบ ARM แต่การแมป I / O โดยตรงบน PIC สามารถทำได้ค่อนข้างดี (การเข้าถึงหน่วยความจำอื่นที่แย่เกินไปนั้นไม่ค่อยดีนัก)
supercat

3

David Kessner ถูกต้อง ฉันต้องการเพิ่มต่อไปนี้

  1. 8-bit MCUs เป็น MCUs เดียวที่พร้อมใช้งานในแพ็คเกจ PDIP ซึ่งง่ายต่อการจัดการและง่ายต่อการติดในเขียงหั่นขนมต้นแบบ
  2. MCU แบบ 32 บิตสามารถใช้พลังงานน้อยกว่า MCU แบบ 8 บิต ไม่จำเป็นต้องเป็นจริงที่ <20 MHZ 8-bit MCU จะใช้พลังงานน้อยกว่า Cortex M4
  3. 8-bit MCUs มักใช้โดยมือสมัครเล่นที่มักไม่ต้องการอะไรมากมายจาก MCU อาจเป็นโค้ด C แบบง่าย ๆ สองสามร้อยบรรทัด

ฉันยอมรับว่าวันนี้มีเหตุผลเล็กน้อยที่จะไม่ใช้ MCU แบบ 32 บิต ฉันจะใช้พวกมันเพียง [8-bit MCUs] ด้วยเหตุผลสองประการ: ฉันชอบความง่ายของแพ็คเกจ PDIP (ไม่ต้องบัดกรี) ฉันมักไม่ต้องการพลัง / ความซับซ้อนมากกว่าที่ MCU 8 บิตสามารถนำเสนอได้

ตัวจัดการดีลเป็นเครื่องมือที่มีอยู่จริง


สำหรับการสร้างต้นแบบมีซ็อกเก็ตสำหรับ LQFP ซึ่งทำงานได้ค่อนข้างดี และแน่นอนว่าคุณสามารถประสาน LQFP ด้วยมือได้เพียงฝึกฝนนิดหน่อย QFN, DFN และ BGA ฉันจะไม่ประสานด้วยมือ แต่จากนั้น MCU 32 บิตแบบ low-end ทุกตัวในตลาดจะมาพร้อมกับ LQFP
Lundin

1

เราใช้ Freescale MCF52259 ซึ่งเป็น MCU ที่มีความสามารถแบบ 32 บิต ~ 80Mhz

เหตุผล / กระบวนการคิดสำหรับการเลือกคือ:

  • มันเปลี่ยนอุปกรณ์ M.Core แบบ 32 บิตดังนั้นการย้ายจึงค่อนข้างง่าย
  • มันก็หมายความว่าเราสามารถติดกับ IDE ที่มีอยู่ (CodeWarrior)
  • เราต้องการ IO มากมาย: ควบคุมขั้นตอน / ทิศทางบนสเต็ปเปอร์มอเตอร์ 3 ตัว, PWM 4 ช่อง, 3 UART, I2C และ SPI
  • มีหลายสิ่งหลายอย่างเกิดขึ้น (ดูจุดสุดท้าย) และบางอย่างก็จำเป็นต้องเกิดขึ้นในเวลาที่เหมาะสมดังนั้นเราต้องแน่ใจว่ามีรอบ CPU เพียงพอที่จะทำทุกอย่างให้เสร็จ
  • รหัสดั้งเดิมนั้นชนกับขนาดแฟลช 256k และ RAM 32k ของ M.Core ดังนั้นการเพิ่มแฟลชและ RAM เป็นสองเท่าทำให้ชีวิตง่ายขึ้นและทำงานได้อย่างรวดเร็ว

วันนี้มันมีประสิทธิภาพมากขึ้น (และสมควร) เพื่อ over-spec / ขยายความสามารถของฮาร์ดแวร์ (การจัดเก็บ, ความเร็ว, IO, ฯลฯ ) กว่าใช้เวลาในการพัฒนาที่มีคุณค่าการเพิ่มประสิทธิภาพของรหัสเพื่อบีบลงใน MCU ราคาถูก / เล็ก พลังงานเป็นปัญหาใหญ่

ในกรณีของเราอุปกรณ์นั้นเป็นสเป็คของ M.Core สองเท่าสำหรับราคาครึ่งหนึ่งไปที่ MCU ราคาถูกกว่าจะประหยัดเพนนีต่อบอร์ดเท่านั้น แต่เสียเวลาในการพัฒนาและ จำกัด โอกาสในการพัฒนาในอนาคตโดยไม่ต้องเปลี่ยน MCU อีกครั้ง

ถ้าเราสร้างกระดานกว่าล้านแผ่นมันจะคุ้มค่าที่จะทำแบบฝึกหัดทางวิศวกรรมต้นทุนเพื่อลดสิ่งต่าง ๆ ลง แต่เพราะมันไม่คุ้มกับเวลาในการพัฒนา

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