ThaiEasyElecTPE
กลับไปหน้ารายชื่อกระทู้ ตอบกลับ เริ่มโพส

แนะนำ AVR RTOS

โดนกล่าวหา ว่า เชียร์แต่ PIC ออกหน้าออกตา.. สมาชิกเริ่มออกอาการขิว รับไม่ค่อยได้กัน (ซึ่งก็เป็นจิง เช่น นั้นแล..) เพราะฉะนั้นแล้ว เดี่ยวค่อยๆ จัดไปทีล่ะตัวๆ ของ AVR ตุนไว้เยอะ..อันดับแรกๆก็ของ ฟรีก่อน ของไฮโซ เสียเงินเอาไว้ ท้ายๆ ตามมาทีหลัง ไม่ต้องกลัวว่า AVR ไม่มี.. เยอะจัด ขอบอก! ฟรีๆทั้งนั้น จะไปขุดจาก google มาลอง test ทำ project file ไว้ให้ที่เหลือก็ลองใช้ ความสามารถต่อเอาเอง.. คิดว่าไม่ยาก

ตัวแรก CocoOS เล็กๆ ง่ายๆ เป็น cooperative มีเอกสาร..ให้ศึกษา โครงสร้าง ง่ายๆ เข้าท่าดี

http://sites.google.com/site/cocoosorg/home



Example Project Mega32 + ไฟกระพริบเทพ
.. เอกสาร รวมอยู่ใน folder
Project Download ----> http://202.28.49.186/download/AVR/RTOS/cocoOS.rar
2

ผู้ให้คะแนน

  • ucLive

  • admin

ปั่นยอด 100 FP , มา Like ให้ซ่ะดีๆ คนล่ะจึก.. สองจึก  


จะเน็นตัวเล้กๆและมีเอกสาร น่ะครับ ใช้กับ mega8/16/32 ได้ เน้นศึกษาเบื้องต้น ใหญ่เกิน ucOS-II นี่ก็ไม่เล่นแล้วที่ลองๆแล้วก็มี

AVRx
pOS
femto RTOS
ucOS-II  และตระกูลที่ copy มาจาก uCOS ของ จีนแดงเพียบ เลย..ตัวเล้ก
ปั่นยอด 100 FP , มา Like ให้ซ่ะดีๆ คนล่ะจึก.. สองจึก  


แก้ไขล่าสุด akiraten เมื่อ 2009-8-10 00:43

แหล่มๆครับ ปลุกกระแส real-time

เล่นนำแน่ๆ
เว็บ Blog ส่วนตัวครับ >>> http://www.10Logic.com
สุดยอดเลยครับป๋า แต่ขอแก้ Fuse ให้เวิร์คก่อน
http://en.wikipedia.org/wiki/List_of_real-time_operating_systems

รวม RTOS เยอะมากครับ
โย้ววว
...............................
..............
........
.
เย้ว
ช่วยดู Bertos ให้ด้วยครับ dev.bertos.org
ช่วยดู Bertos ให้ด้วยครับ dev.bertos.org
ต้นฉบับโพสโดย whoami เมื่อ 2009-8-10 19:50
ลองๆดู แล่ว .. งง หลายครับ มันออกแบบมาให้ เทพใช้..  noob แบบผมคง บ่..ไหว  แถมตัว install มันลง wizard config ไม่ได้อีก manual อ่านไปงง..ไป.. โครงสร้า้งของ OS มันก็ไม่ อธิบายให้ง่ายๆ เคลียร์ๆ ไม่บอกอะไรเลย.. นั่งเปิดดู code ไล่เอาว่ามันจะต้องเรียกอะไรก่อน.. เป็นตางึดอีหลี

แถม source ก็แบบเทพ #define กันเป็นพรืด กะว่าจะให้มันใช้ได้ทุก MCU  แถมต้องมา config option กันอีก มโหราฬ แค่สร้าง empty_project ขึ้นมาได้ เล่นเอา งง.. ตัวอย่างก็ไม่มี นั่งทางในเอา..  ดูเหมือนจะง่าย แต่แบบนี้และ งง  เดี่ยวรอลอง tool สำหรับ config มันได้ก่อน ค่อย ว่ากันอีกที.. เพราะมัน ลง บ่..ได้เลยผมเอามาแค่ source  



ว่า ucOS-II ซับซ้อนแล้วน่ะ เจอตัวนี้เข้าไป อึ้งเลย เอิ้กๆๆ
ปั่นยอด 100 FP , มา Like ให้ซ่ะดีๆ คนล่ะจึก.. สองจึก  


Many embedded systems run for years without rebooting. Reliable products must never contain fragile code.
ของ AVR เยอะมาก ครับ แต่ใช้ได้ จิงๆไม่กี่ตัวหรอก ถ้าไม่ ยากจนเทพโครต  ก็ เอกสารไม่มี .. อย่าง AVRx นี่ก็เอกสารไม่ดี นั่งอ่าน code เอาพอเข้าใจได้อยู่.. ตัว OS ทำได้ดีทีเดียวตัวเล้กมากเป็น cooperative เดี่ยวรอ test hardware แล้วทำ libary แยก เบอร์ไว้ให้ ครับ.. Mega8/32/128




****UPDATE****  เอกสารของ AVRX หาเจอแล้ว มันอยู่ใน   http://finance.groups.yahoo.com/group/avrx/  ต้องสมัคร yahoo แล้วเข้า group ถึงจะเจอ ผม upload มาให้แล้วลองศึกษาดู  มันบอกวิธีลงวิธีติดตั้งอยู่ แต่ใช้วิธี add เอาก็ได้ไม่ยาก

http://202.28.49.186/download/AVR/avrx_document.rar

ส่วนตัวอย่าง code ง่ายๆ ครับ  มาแนวนี้ ไฟกระพริบ 3 ดวง + 3 task + OS_delay  เดี่ยว test เสร็จแล้วจะ เขียน guide ให้กำลังอ่าน doc และ code ส่วน timer มีการแก้ไข.. ต้องศึกษาโครงสร้าง มันก่อน มั่วเอาไม่ได้.. ได้แค่ไฟกระพริบ นี่แหละ หุๆๆ..  
  1. #include <avr/io.h>                       
  2. #include <avr/signal.h>               
  3. #include "avrx.h"
  4. #include "hardware.h"

  5. AVRX_GCC_TASK(task1, 20, 2);
  6. AVRX_GCC_TASK(task2, 20, 2);
  7. AVRX_GCC_TASK(task3, 20, 2);

  8. TimerControlBlock timer1, timer2, timer3;

  9. int main(void)
  10. {
  11.     DDRB=0xFF;
  12.     PORTB=0xFF;

  13.     AvrXSetKernelStack(0);

  14.     MCUCR = _BV(SE);            // Initialize Timer Hardware
  15.     TCNT0 = TCNT0_INIT;
  16.     TCCR0 = CK1024;
  17.     TIMSK = _BV(TOIE0);         // Enable Timer overflow interrupt

  18.     AvrXRunTask(&task1Tcb);
  19.     AvrXRunTask(&task2Tcb);
  20.     AvrXRunTask(&task3Tcb);

  21.     Epilog();                   // Switch from AvrX Stack to first task
  22.     while(1);
  23. }

  24. AVRX_SIGINT(SIG_OVERFLOW0)
  25. {
  26.     IntProlog();
  27.     TCNT0 = TCNT0_INIT;
  28.     AvrXTimerHandler();
  29.     Epilog();
  30. }

  31. NAKEDFUNC(task1)
  32. {
  33.     while(1)
  34.     {
  35.         PORTB ^= _BV(PORTB0);
  36.         AvrXDelay(&timer1, 500);
  37.     }
  38. }


  39. NAKEDFUNC(task2)
  40. {
  41.     while(1)
  42.     {
  43.         PORTB ^= _BV(PORTB1);
  44.         AvrXDelay(&timer2, 750);
  45.     }
  46. }

  47. NAKEDFUNC(task3)
  48. {
  49.     while(1)
  50.     {
  51.         PORTB ^= _BV(PORTB2);
  52.         AvrXDelay(&timer3, 1000);
  53.     }
  54. }
คัดลอกไปที่คลิปบอร์ด
- version ล่าสุด  http://202.28.49.186/download/AVR/AVRx2.6g.rar

- การวาง directory ของ project C:\AVRx2.6g\TestCases\AVRx.aps

- กรณีที่ต้องการใช้ MCU เบอร์ อื่นเข้าไปแก้ C:\AVRx2.6g\avrx\makefile ให้ถูกเบอร์แล้วทำการ make libary ใหม่
  1. # MCU name
  2. MCU = atmega128        # เลือก MCU ให้ถูก
  3. # Output format. (can be srec, ihex, binary)
  4. FORMAT = ihex
  5. # Target file name (without extension).
  6. TARGET = libavrx   # สำคัญ เปลี่ยนชื่อเป็น libavrx จะได้ output ออกมาเป้น libavrx.a  ชื่อต้องขึ้นต้นด้วย libxxx.aเท่านั้น ไม่งั้นจะมีปัยหาการ add libary
คัดลอกไปที่คลิปบอร์ด
สั่ง make  libary โดยต้องข้า

>> cd C:\AVRx\avrx
>> make

จากนั้น ก็ add libary เข้าทาง AVRSTUDIO ได้เลย โดยการเลือก parth ที่เก็บ libavrx.a ใน linker option หรือ  copy ไปไว้ที่ c:\winavr\avr\lib จะมองเห็นโดย อัตโนมัติไม่ต้อง add เข้า

>> copy C:\AVRx\avrx\libavrx.a   c:\winavr\avr\lib

อ้างอิง กระทู้เก่าครับ  .. วิธีแก้ปัยหา libary AVRx

http://www.electoday.com/cgi-bin/yabb2/YaBB.pl?num=1225386887
1

ผู้ให้คะแนน

  • ucLive

ปั่นยอด 100 FP , มา Like ให้ซ่ะดีๆ คนล่ะจึก.. สองจึก  


อ้าย wlasoi ครับ หากว่าเราจะ interface กับ GLCD128x64 และ GPS และ uart ติดต่อกับ PC เราต้องสร้าง task ขึ้นมาใช้งานใช่หรือไม่ครับ task ใดๆ สำหรับงานนั้นๆใช่ไหมครับ
เว็บ Blog ส่วนตัวครับ >>> http://www.10Logic.com
เรื่องของ LCD กับ UART ถ้าเป็นไปได้ควรจะอยู่ task ของใครของมันครับในกรณีที่เป็น Preemptive Scheduling ด้วยเหตุผลที่ว่า Preemptive Scheduling นั้น task ที่มี Priority สูงกว่าสามารถ interrupt task ที่มี Priority ต่ำกว่าได้ถ้าหากนำส่วนของการส่งข้อมูลออก UART หรือ LCD ไปไว้ในหลายๆ task อาจจะทำให้ข้อมูลนั้นออกมาแบบลักษณะที่ไม่ต้องการได้ ลองนึกสภาพดูครับ UART มี chanel เดียว task1 ยังส่งไม่เสร็จ task0 ดัน interrupt task1 เพื่อส่งเหมือนกันจะเกิดอะไรขึ้น ?

แต่ถ้าหากมีความจำเป็นจริงๆ ที่จะต้องเอาไปไว้ task อื่นๆด้วยแนะนำให้ใช้การ disable interrupt ก่อนส่ง แล้ว enable interrupt หลังจากส่งเสร็จ ซึ่งป้องกันการ interrupt ระหว่าง task ได้ เพราะ Preemptive Scheduling การ Switch Task เกิดจากกลไกลของ interrupt แต่ก็ไม่ได้เป็นวิธีที่ดีนัก  

โดยส่วนตัวแล้วคิดว่า Preemptive Scheduling เกือบทุกตัวน่าจะมีกลไกลของ Semaphore ซึ่งใช้ในการแก้ไขปัญหาที่กล่าวมาแทนการ disable interrupt ซึ่งเป็นวธีที่มีประสิธิภาพสูง แนะนำให้ลองศึกษากลไกลตัวนี้ดูครับหากต้องการนำไปไว้หลายๆ task

Concept พื้นฐานของ Semaphore ก็คือ Task ไหนที่เข้ามาทำการจอง Semaphore ก่อนก็มีสิทธิ์ที่จะได้ใช้ resource ของ Semaphore ตัวนั้นๆ หาก Task อื่นๆพยายามเข้ามาจอง Semaphore ที่ถูกจองไปแล้ว Task นั้นจะถูก Suspend ไปชั่วคราว เพื่อรอให้ Task แรก ใช้ resource จนเสร็จแล้วทำการคืน Semaphore ให้กับระบบก่อน กลไกลของการคืน Semaphore ก็จะหาว่ามี Task ที่ต้องการ Semaphore ตัวนี้อีกหรือไม่หากมีก็จะทำการ Run Task ที่ถูก Suspend ไปตอนแรกให้กลับมาใช้ resource นั้นได้อีกครัง ดังนั้นจะเห็นว่าช่วยป้องกันปัญหาข้างต้นได้โดยที่ไม่ต้อง disable interrupt
1

ผู้ให้คะแนน

  • ucLive

Many embedded systems run for years without rebooting. Reliable products must never contain fragile code.
อ้าย wlasoi ครับ หากว่าเราจะ interface กับ GLCD128x64 และ GPS และ uart ติดต่อกับ PC เราต้องสร้าง task ขึ้นมาใช้งานใช่หรือไม่คร ...
ต้นฉบับโพสโดย akiraten เมื่อ 2009-8-12 23:57
ต้องแยก Task ของใครของมัน ซึ่งสามารถจัดลำดับการทำงานได้โดยใช้ semaphoe หรือ ตัวแปร ที่ทำหน้าที่เป็น Flag ทุก task สามารถมองเห็น สามารถ wait/set/clear ได้เหมือนกันหมด  function อาจจะแยกไปเอยะแหละแต่ Task ที่จะทำงานจะเอาเฉพาะ function มารรวมกันอีกทีนึง ไม่ใช้มี 100 function แล้วต้องสร้าง task มาทั้ง 100 task .. บ่ แม่น.. 100 function รวมกันแล้วอาจจะทำงานแค่ 1-2 task แค่นั้นเอง

ใจเย็นๆ กำลังอยู่ในช่วงดำเนินการ  LCD + 4*4KeyPad + UART FIFO เดี่ยวจะ ลองกับ AVRX นี่แหละ จะทำเป็น plat form ไว้ให้ เพราะ  UART FIFO ที่ใช้ทุกวันมันก็เป็นแบบ  interrupt แบบ fifo อยุ่แล้วสามารถปรับใช้กับ RTOS ได้สบาย ..

RTOS ไม่ยากครับ.. มันเป็นเหมือน ปรัชญา.. ถ้าเข้าถึงวิชาเคล็ดวิชา หรือ กระบวนท่า หรือ การทำงานของมัน แล้ว..ง่ายนิดเดียว ..(พูดซ่ะเวอร์   บ้ากำลังภายใน)  ง่ายกว่าเขียน program แบบ ธรรมดาๆ ซ่ะอีก.. พี่ก็แค่พอเข้าใจ ได้แค่ขั้น 1-2 ไฟกระพริบเทพ.. ยังอธิบายได้ไม่ดี รอสักพัก เดี่ยวให้ลองทำ project เล้กๆ สักตัวก่อน กะว่าจะเอา  LCD + 4*4KeyPad + UART FIFO นี่แหละ.. ทุกปัญหาครบสมบูรณ์ ในตัว ..

1. delay ของ LCD ปัญหาหลัก
2. debounce ของ keypad แถมต้องส่งค่า + semaphore ออกนอก task
3. interrupt ของ uart รวมสารพัดปัญหา
4. การส่งตัวแปรระหว่าง task ไปหากัน    LCD <> KeyPAD <> UART

แค่ 3 อย่างนี่แหละ ดูเหมือนง่าย แต่ขอบอกว่า ฮาแน่ๆ   ลองหาหนังสืออ่านก่อนครับ อธิบาย คำศัพท์ ให้ได้ก่อน จำเป็น ไม่ว่าจะใช้ RTOS ยี่ห้อไหนๆ ส่วนมาก API มันจะใช้ จะเรียกเหมือนๆกัน.. ยกเว้น BeRTOS ข้างบน จ้าก..มันทำอะไรๆ  แปลกๆ แบบ.. งง

- Task , Task priority
- Contex Switch , Task-Yield
- Schedual
- Cooperative กับ Preemtive  แยกให้ออก... มันมีจุดสังเกตุแบบ ง่ายๆ และ test ด้วยการ debug
- Semaphore
- Messages , Queues

วิธีเรียนรู้ให้ไว..ทุกวันนี้สบายมาก debug เอา..ครับ  จะแยกๆตัวอย่างไว้ให้ ทีล่ะ step ๆ  ง่ายๆเริ่มที่ Cooperative สำหรับพวก 8bit ก่อน พวก preemtive ไปว่ากันที่ ARM7, Cobtex , AVR32 เพราะมันกินแรมเยอะ ระดับ ram แค่ 2-4K สำหรับ MCU 8bit อาจจะพอสำหรับ OS แบบ preemtive แต่ อาจจะไม่พอสำหรับงานที่เหลือ อาจจะมีปัญหา ตามมา เลยไม่แนะนำ พวก preemtive ค่อยไปว่ากันกับ FreeRTOS , ucOS-II ครับ รับรอง เดิ้นสุดยอด.. มี gui มา analyse ให้พร้อม อลังการงานสร้างสุดๆ.. ใจเย้นๆ เอาพื้นฐานให้แน่นก่อน
1

ผู้ให้คะแนน

  • ucLive

ปั่นยอด 100 FP , มา Like ให้ซ่ะดีๆ คนล่ะจึก.. สองจึก  


แก้ไขล่าสุด kookie_jung เมื่อ 2009-8-13 15:25

คุณ wlasoi ครับผมลองเอา cocoos มาใช้กับ cpu atmega32 แล้วโดยใช้ IAR ครับ ผมปรับแก้ code จนมันใช้งานทั่วไปได้แล้วครับแต่มันมีปัญหาในบางส่วนครับของตัว code ครับ
  1. #define OS_WAIT_MULTIPLE_EVENTS( waitAll, args...)OS_WAIT_MULTIPLE_EVENTS_( waitAll, args...)
  2. #define OS_WAIT_MULTIPLE_EVENTS_( waitAll, args...)        do {\                        os_wait_multiple(waitAll, args, 0);\                                        OS_SCHEDULE;\
  3.         } while (0)
คัดลอกไปที่คลิปบอร์ด
ใน function  OS_WAIT_MULTIPLE_EVENTS นี้ผมใช้ไม่ได้ครับมัน complie ไม่ผ่านอะครับผมไม่รู้ว่า IAR มันสามารถ define แบบ agrument หลายๆตัวในลักษณะ args... ได้หรือป่าวครับ หรือพอมีวิธีแก้ code เป็นแบบอื่นไหมครับ
กลับไปหน้ารายชื่อกระทู้