ตุลาคม 19, 2017, 12:36:45 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: SDW Kernel&Library for PIC-Mid-Range  (อ่าน 10507 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« เมื่อ: พฤษภาคม 19, 2011, 12:35:34 pm »

SDW Kernel&Library for PIC-Mid-Range
ตั้งใจจะทำ Tutorials เรื่องการเขียนโปรแกรมไมโครคอนเลอร์แนว Real-time and Multitasking มานาน แต่ก็หาเวลาว่างๆ ยากพอสมควร
พูดถึงการเขียนโปรแกรมแนว Real-time and Multitasking หลายคนคงนึกไปถึง MCU เบอร์ใหญ่ๆ ที่ความสามารถล้นเหลือ ไม่ว่าจะเป็น
ARM, dsPIC และตระกูลอื่นๆ ที่เปี่ยมไปด้วยความเร็ว และหน่วยความจำ แน่นอนงานที่ซับซ้อน ก็ต้องคู่กับ MCU ความสามารถสูง ถึงจะ
สมน้ำสมเนื้อกัน หลายคนจึงอยากจะจับ MCU ความสามารมารถสูงมาใช้สอยกัน นั่นเป็นเรื่องปรกติ ไม่ว่าจะเป็นเรื่องความสะดวก รวมไปถึง
ราคา ที่นับวันจะถูกลงเรื่อยๆ ตามกลไกของตลาด

ผมเป็นคนนึงที่ชอบติดตามวิวัฒนาการของ MCU แทบทุกค่าย แต่ไม่ได้ใช้ทุกเบอร์ โดยเฉพาะเบอร์ที่มีความสามารถสูงๆ เพราะบ่อยครั้ง
ก็มองไม่เห็นความจำเป็นว่าทำไมต้องใช้ MCU เบอร์ใหญ่ๆ กับงานเล็กๆ และงานทั่วๆไป MCU ความสามารถระดับล่าง หรือระดับกลางก็
ยังคงทำงานได้ไม่แพ้ MCU ความสามารถสูงๆ ใครที่อยู่ในวงการ Microcontroller หรือมีประสบการณ์ในงานด้านนี้ ผมเชื่อว่ามากกว่า 90%
งานที่เช้ามาในชีวิตเขาเขาเหล่านั้นมีไม่ถึง 10% ที่จะต้องแก้งานด้วย ARM หรือด้วย DSP มองในทางกลับกันนักเรียนนักศึกษา หรือผู้เริ่มต้น
ศึกษา จะใช้ MCU ความสามารถสูงเกินงานหรือเกินขอบเขตของการเรียนรู้อยู่บ่อยๆ นั่นเป็นเรื่องปรกติ และไม่ใช่ประเด็นว่าจะใช้อะไรดี อะไรไม่ดี
เพราะทุกอย่างดีมากน้อยแตกต่างกันออกไป ความดีของ MCU ไม่ได้ลดน้อยถอยลง หรือเพิ่มพูนขึ้นแต่อย่างใด มันเป็นของมันอยู่เช่นนั้น
แต่เราจะเค้นเอาความดี ความโดดเด่น ความสามารถของ MCU ตัวนั้นๆ ออกมาได้มากน้อยแค่ไหน ด้วยวิธีการอะไร นั่นคือประเด็นที่ผมจะนำเสนอ
ใน Tutorial ชุดนี้

ก่อนที่จะว่ากันในตอนต่อไป (ซึ่งไม่รู้เมื่อไร่จะได้เขียน) มาดูตัวอย่างโปรแกรมแนว Real-time and Multitasking ที่มีความซับซ้อนระดับล่างในมุมมองทั่วไป
แต่น่าจะเป็นความซับซ้อนระดับกลาง เมื่อเทียบกับงานที่ MCU เบอร์ PIC16F887 ทำอยู่ในตอนนี้ (ตาม VDO)


<a href="http://www.youtube.com/v/2vjTLOkXIls" target="_blank">http://www.youtube.com/v/2vjTLOkXIls</a>


สิ่งที่เห็นนั้นเป็นการใช้งานตัว Kernel และ Library (ส่วนหนึ่ง) ที่ผมได้พัฒนาไว้ รายละเอียดของ Kernel และ Library คงต้องพูดกันยาว ขอละไว้ก่อน
ตอนนี้มาดูโปรแกรมในส่วนของ main กันหยาบๆก่อน ดังนี้:

Code: (c)
/**************************************************************/
/* FILE:     Test.c                                           */
/* CPU:      PIC16F887                                        */
/* XTAL:     8MHz                                             */
/* IDE:      MPLAB IDE v8.63                                  */
/* COMPILER: HI-TECH PIC-C Compiler v9.71a, v9.81             */
/* AUTHOR:   SANTI NURATCH @ SHADOWWARES.COM                  */
/* DATE:     14 March, 2011                                   */
/* DESCRIPTION: Demostrate the SDW Kernel                     */
/**************************************************************/
#include <stdio.h>
#include "SDWConfig.h"

#define TASK_0      0
#define TASK_1     1
#define TASK_2      2
#define TASK_3      3
#define TASK_4      4
#define TASK_5      5
#define TASK_6      6
#define TASK_7      7

#define NUM_TSAK   4

OS_TASK T0 , T1, T2, T3;

BYTE Switch = 0x00;

void HardwareInit(void);

//double MyValue = -0.12345;

BYTE move_up = 1, move_down = 0;

/*----------------------------------------------------*/

BYTE DispBuff[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D,   \
             0x7D, 0x07, 0x7F, 0x6F, 0x00, 0x77,   \
                0x7C, 0x39,0x5E,0x79,0x71,0,0,0,0,0,0   \
            };

void OSCallbackFunction(BYTE Params){
   static BYTE idx=0,k=0;
   if(++k<3)return;
   k=0;
   PORTD = 0x00;
   PORTE = idx;
   PORTD = DispBuff[idx];
   if(PORTC&0x01){
      Switch |= 1<<idx;   
   }
   if(++idx>=6)idx=0;   
}   

void Task0(BYTE Params){      /* Update Display Value       */
   BYTE buff[10];
   UINT16 adc; static BYTE cnt=0;
   adc = ADCRead(11);
   FloatToStr((double)adc/10.230f, buff);
   StrTo7Seg(buff, buff);      /* Convert to 7-Seg, Auto-Range */
   LCD_Goto(0, 1); LCD_String("ADC="); LCD_Hex(adc, 3, 1);
   LCD_Goto(11, 1);LCD_String("CNT="); LCD_Dec(cnt, 3, 0);
   LCD_HorBar(0, 2, 1, 3, cnt);
   LCD_VerBar(19, 3, 1, 4, cnt/3);   
   if(cnt++>80){
      cnt=0;
      LCD_Clear_Line(2);
      LCD_Goto(19, 0); LCD_String(" ");
      LCD_Goto(19, 1); LCD_String(" ");
      LCD_Goto(19, 2); LCD_String(" ");
      LCD_Goto(19, 3); LCD_String(" ");   
   }   
}

void Task1(BYTE Params){
   BYTE ClockStr[16], ii;
   BYTE ValueStr[16];
   UINT16 adc; double v;
   CLOCK Clock;
   
   adc = ADCRead(13);
   v = (double)adc/10.230f;
   FloatToStr(v, ValueStr);
   ValueStr[8] = 0;
   
   OSEnterCriticalSection();
   ClockCopy(&OSClock, &Clock);
   OSExitCriticalSection();

   ClockToStr(&Clock, ClockStr);
   LCD_Goto(0, 3);
   LCD_String("Time: ");
   LCD_String(ClockStr);
   
   UART_Write("Time: ");   
   UART_Write(ClockStr);
   UART_Write("   ADC: ");
   UART_Write(ValueStr);
   UART_Write("%\r\n\0");
   
   if(Switch>0){
      for(ii=0;ii<6; ii++){
         if(Switch & (1<<ii)){
            Switch &= ~(1<<ii);
            UART_Write("   >>> Switch: ");
            IntToStr(ii, ValueStr);
            UART_Write(ValueStr);
            UART_Write(" ON\r\n\0");
         }
      }
   }
   if(RCIF){
      RCIF = 0;
      if(RCREG == 'u'){
         move_up   = 1;
         move_down = 0;   
      }
      else if(RCREG == 'd'){
         move_up   = 0;
         move_down = 1;   
      }
      else if(RCREG == 's'){
         move_up   = 0;
         move_down = 0;   
      }            
   }   
}

void Task2(BYTE Params){
   BYTE buff[10];
   UINT16 adc; static BYTE cnt=0;
   static BYTE ii=0, SWLabelCounter=0;

   adc = ADCRead(11);
   FloatToStr((double)adc/10.230f, buff);
   StrTo7Seg(buff, buff);      /* Convert to 7-Seg, Auto-Range */
   
   OSEnterCriticalSection();
   BufferCopy(buff, DispBuff, 6);   /* Copy to Display Buffer       */
   OSExitCriticalSection();
   
}   

void Task3(BYTE Params){
   static BYTE line=0;
   BYTE PE = PORTE;
   BYTE PD = PORTD;
   PORTE = 0xFF;
   if(move_up == move_down)
      return;
   if(move_up){
      if(line>0x3F) line=0;
      GLCD_SideSelect(GLCD_SIDE_LEFT);
      
      OSEnterCriticalSection();
      GLCD_WriteComd(0xC0+line);
      OSExitCriticalSection();
      
      GLCD_SideSelect(GLCD_SIDE_RIGHT);
      
      OSEnterCriticalSection();
      GLCD_WriteComd(0xC0+line);   
      OSExitCriticalSection();
         
      line++;
   }
   else if(move_down){
      if(line<=0) line=0x3F;
      GLCD_SideSelect(GLCD_SIDE_LEFT);
      
      OSEnterCriticalSection();
      GLCD_WriteComd(0xC0+line);
      OSExitCriticalSection();
      
      GLCD_SideSelect(GLCD_SIDE_RIGHT);
      
      OSEnterCriticalSection();
      GLCD_WriteComd(0xC0+line);   
      OSExitCriticalSection();
      line--;   
   }
   PORTE = PE;
   PORTD = PD;   
}   


BYTE Buff1[] = {"Rotate Right...\0"};
BYTE Buff2[] = {"Rotate Left...\0"};

void main(void){
   BYTE k=0;
   OSCallbackFunction(0xFF);
   
   OSInit(KERNEL_CODE_VERSION);
   OSAssignCallbackFunction(OSCallbackFunction);
   //OSCreateTask(&T0, &Task0, 20);
   //OSCreateTask(&T1, &Task3, 20);
   //OSCreateTask(&T2, &Task2, 100);
   //OSCreateTask(&T3, &Task1, 100);
   
   UtilsCodeVersion(UTILS_CODE_VERSION);
   BufferCodeVersion(BUFFER_CODE_VERSION);
   ClockCodeVersion(CLOCK_CODE_VERSION);

   HardwareInit();
   ADCInit();
   LCD_Init();
   LCD_StringAt(0, 0, "SDWKernel&Libraries");
   
   UART_Init();
   //UART_Queue_Init();
   UART_Write("DEMO: SDWKernel & Utilities\r\n\0");
   UART_Write("www .shadowwares. com\r\n\0");
   UART_Write("\r -Add functions to control display devices.\r\n\0");
   UART_Write(" -Increase Kernel Core speed, reduce code size.\r\n\0");
   printf("\rSystem is running...\r\n\0");
   
   ClockSet(&OSClock, 21, 59, 55, 0);

   TRISC |= 0x81;   // Switches
   TRISC &= 0b11000001;
   TRISB |= 0x30;
   TRISB &= 0b00111111;
   TRISA &= 0b11111110;
   
   GLCD_Reset();
   GLCD_DrawImage(&IMG,1);
   //DispBuff[2]|=0x80;
   OSStart(0);
/*
   while(1){
      
      if(!(k%2)){
         BufferRotate(Buff1, StrLength(Buff1), 1);
         LCD_StringAt(3, 2, Buff1);
      }
      
      if(!(k%4)){
         BufferRotate(Buff2, StrLength(Buff2), 0);
         LCD_StringAt(3, 3, Buff2);
      }
      if(1){
         OSEnterCriticalSection();
         BufferRotate(DispBuff, 23, (k>127));
         OSExitCriticalSection();
      }
      __delay_ms(100);
      k+=1;
      Task3(0);
      
      CLOCK Clock;
      BYTE ClockStr[16];
      OSEnterCriticalSection();
      ClockCopy(&OSClock, &Clock);
      OSExitCriticalSection();
   
      ClockToStr(&Clock, ClockStr);
      LCD_Goto(1, 1);
      LCD_String("Time: ");
      LCD_String(ClockStr);
      
   }// while   

   //OSStart(0);
   while(1){
      OSScheduler();   
   }*/         
}

โปรแกรมดูเหมือนยาว ไม่แปลกครับ เพราะผมไม่ได้ Optimize อะไร นอกจากนี้ยังแทรกคำสั่งหลายคำสั่งไว้แกล้ง MCU เพื่อจะได้มั้นใจว่า Kernel ของผมเจ๋งจริงหรือเปล่า
แต่ถ้ามองไปที่การทำงานของโปรแกรม ผมว่ามันเป็นโรแกรมที่สั้นมาก


แล้วเจอกันในตอนต่อไปครับ!  :D
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
kissubin
Newbie
*
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 27



| |
« ตอบ #1 เมื่อ: ตุลาคม 13, 2011, 12:04:46 am »

Real-time และ Multitasking และ freeRTOS
1. แต่ละคำคืออะไรครับ ช่วยขยายความหน่อยครับ
2. การเขียนโปรด้วยพวกนี้ ดีกว่าการเขียนแบบบ้านๆ ยังไงครับ (จำเป็นขนาดไหน)
3. ทั้งหมดที่พี่พูดมาภาษา Assembly ดีกว่าหรือด้อยกว่าพวกนี้
บันทึกการเข้า

CH.E22
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« ตอบ #2 เมื่อ: ตุลาคม 13, 2011, 06:47:42 am »

อ้างถึง
Real-time และ Multitasking และ freeRTOS
1. แต่ละคำคืออะไรครับ ช่วยขยายความหน่อยครับ
Real-time เป็นระบบที่ทำงานทันตามเวลาที่กำหนดทุกกรณี หรือตอบสนองต่อสิ่งต่างๆ ได้อย่างทันท่วงที
Real-time มีสองแบบหลักๆ คือ Hard Real-time และ Soft Real-time
Hard Real-time หากตอบสนอง หรือทำงานไม่ทันตามเวลาที่กำหนด ถือว่าระบบล้มเหลว (ส่งการบ้านไม่ทัน ไม่ต้องส่ง อีกแล้ว ได้ 0 คะแนนไปรอบนี้)
Soft Real-time เป็นระบบที่มีมากกว่า Hard Real-time เพราะใช้ทรัพยากรต่างๆของระบบน้อยกว่า ไม่มีการกำหนดเส้นตายของเวลาไว้ ระบบทำงานช้าไปบ้างก็ไม่ถือว่าล้มเหลว อย่างเช่น Windows ที่เราใช้อยู่เป็น Soft Real-time บางทีคลิกแล้วก็ได้เลย บางทีคลิกแล้วนิ่งไปพักนึง แต่ถ้าคลิกแล้วไม่ทำงานเลย ถือว่าล้มเหลว (ส่งการบ้านไม่ทัน ก็มาส่งวันหลัง อาจจะถูกหักคะแนนวันละแต้ม หรือไม่หักเลย แต่จะต้องส่งไม่เช่นนั้นตก)
Multitasking ระบบที่ทำงานหลายๆอย่างได้ในเวลาเดียวกัน เช่น Windows สามารถเล่น Internet ดูหนัง เล่นเกมส์ได้ในเวลาเดียวกัน
FreeRTOS เป็นชื่อของ Real-Time OS ตัวนึง ที่สามารถนำมาให้งานได้ฟรี http://www.freertos.org/



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

อ้างถึง
3. ทั้งหมดที่พี่พูดมาภาษา Assembly ดีกว่าหรือด้อยกว่าพวกนี้
ภาษา Assembly กับเรื่องพวกนี้มันคนละเรื่องกันเทียบกันไม่ได้ แต่ภาษา Assembly มีความจะเป็นสำหรับคนที่เขียนโปรแกรมเชิงลึกในแนวนี้

ลองหาข้อมูลเพิ่มเติมศึกษาดูครับ มามากมายใน Internet


บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
kissubin
Newbie
*
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 27



| |
« ตอบ #3 เมื่อ: ตุลาคม 13, 2011, 09:32:17 pm »

ขอบคุณสำหรับคำตอบด้านบนครับ

1. ถ้าจะเอา FreeRTOS ไปเขียนโปรแกรมให้มีในลักษณะในการควบคุมแบบด้านล่างนี้ จำเป็นหรือไม่ครับ

Ratio Control
Cascade Control
PID Control  (P Action, I Action, D Action)
Feed-Forward Control
Sequence Control

2. การเขียนโปรแกรมในลักษะใดบ้างที่จะบอกว่าจำเป็นจะต้องใช้ FreeRTOS แล้ว ในการเขียนโปรแกรม?
3. FreeRTOS เขียนอยู่พื้นฐานของภาษาซีมาตรฐาน ถ้าเปรียบกับการทำงานกับ Assembly อะไร จะไวและตอบสนองได้ดีกว่ากันครับ?


บันทึกการเข้า

CH.E22
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« ตอบ #4 เมื่อ: ตุลาคม 13, 2011, 10:13:03 pm »

อ้างถึง
1. ถ้าจะเอา FreeRTOS ไปเขียนโปรแกรมให้มีในลักษณะในการควบคุมแบบด้านล่างนี้ จำเป็นหรือไม่ครับ

Ratio Control
Cascade Control
PID Control  (P Action, I Action, D Action)
Feed-Forward Control
Sequence Control
ก่อนอื่นต้องเข้าใจก่อนว่า FreeRTOS รวมไปถึง OS ทุกตัว มันทำหน้าที่เป็นระบบปฏิบัตการ มองง่ายๆ ว่ามันคือ Windows ที่เราใช้อยู่นี่แหละครับ แต่มันทำงานอยู่บนโลกของ Embedded System หรือไมโครคอนโทรลเลอร์ของเรา ความสามารถของตัว OS เหมือนคลังเครื่องมือ เราต้องเลือกใช้ให้ถูก เพื่อควบคุมการทำงานของระบบให้ถูกต้อง

กลับมาที่ความสำคัญของ OS กับ Control Algorithm ถามว่าจำเป็นหรือไม่ ก็ต้องตอบว่าถ้าต้องการแค่ใส่ Algorithm ลงไปในตัวไมโครคอนโทรลเลอร์ก็ไม่มีความจำเป็นใดๆ แต่ทันที่ที่ระบบเริ่มมีปุมกด เริ่มมีการแสดงผล เริ่มมีการสื้อสารกับอุปกรณ์อื่นๆ เข้ามาเกี่ยวข้อง การเขียนโปรแกรมจะเปลี่ยนไป จะต้องใช้รูปแบบของโปรแกรมที่เรียกว่า Multitasking เข้ามาช่วย และควบคู่กันมา หากมีการให้ความสำคัฯเชิงเวลาจะต้องเพิ่มความเป็น Real-time เพียงเท่านี้ ยังไม่มีความจำเป็นต้องใช้ OS ของจริง สามารถใช้ความสามารถของ MCU และ คนเขียนโปรแกรมจัดการได้ แต่จะเริ่มลำบากเรื่องการบริการจัดการ และทันทีที่โปรแกรมเมอร์ตีความของงานว่างานนั้นๆ ประกอบไปด้วย  Real-time, Multitasking และมีการใช้ทรัพยากรของระบบที่ซับซ้อน OS จะถูกเลือก เพราะมันจะทำให้งานง่ายขึ้นหลายเท่าตัว และเปี่ยมไปด้วยประสิทธิภาพ


อ้างถึง
2. การเขียนโปรแกรมในลักษะใดบ้างที่จะบอกว่าจำเป็นจะต้องใช้ FreeRTOS แล้ว ในการเขียนโปรแกรม?
โปรแกรมซับซ้อน ทุกรูปแบบ อย่างเช่นเครื่อง PLC ข้างในคือ MCU ที่มีการทำงานด้วย OS โทรศัพท์ เครื่องใช้ต่างๆ ที่บันเจิดหน่อย มีการเขียนโปรแกรมแบบ Real-time Multitasking แทบทั้งสิ้น

อ้างถึง
3. FreeRTOS เขียนอยู่พื้นฐานของภาษาซีมาตรฐาน ถ้าเปรียบกับการทำงานกับ Assembly อะไร จะไวและตอบสนองได้ดีกว่ากันครับ?
วัดกันที่การตอบสนอง หรือความเร็ว สรุปได้ยาก ต้องอยู่ที่ว่าหลัง Compile จาก C เป็น Machine code แล้ว มันต้องใช้จำนวน Machine cycle เท่าไร่ในการประมวลผลส่วนนั้น อาจจะช้ากว่าเร็วกว่าหรือเท่ากันกับ ASM ก็ย่อมเป็นไปได้ ต้องพึงระลึกไว้ว่า ภาษาไหนก็ตาม หากคนเขียนเขียนแบบไม่รู้เท่าทัน มันก็กลายเป็นโปรแกรมที่เยิ้นเย้อ ส่งผลให้ช้าเช่นกัน
หากจะวัดความเร็วกันหมัดต่อหมัด cycle ต่อ cycle ภาษา ASM กินขาดเรื่องเวลาในการประมวลผล แต่ถ้าโปรแกรมซับซ้อนการเขียนด้วย ASM จะเป็นไปได้เฉพาะผู้เชี่ยวชาญเท่านั้น และต้องใช้เวลากันยาวนานแสนนาน เมื่อเทียกับ C โปรแกรมเมอร์ผู้เชี่ยวชาญด้าน Embedded System เขาเลือกที่จะเขียนด้วย C และส่วนไหนที่ถูกประเมินว่า C ทำไม่ได้ ก็จะแทรก ASM ลงไป คนที่เชื่อมความสัมพันธ์ระหว่า C กับ ASM และเข้าใจพฤติกรรมของ Compiler สามารถทำให้ C ใช้จำนวน Machine cycle เท่า ASM ได้ในหลายกรณี ยิ่ง Compiler สมัยใหม่มีความสามารถด้านการ Optimization หลากหลาย การจะเลือกเดินสาย ASM แต่เพียงอย่างเดียวเห็นแววชัดเจนว่าไม่รุ่ง และคนที่ทิ้ง ASM ไปจากชีวิต ก็จบไม่สวยเช่นกัน
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
kissubin
Newbie
*
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 27



| |
« ตอบ #5 เมื่อ: ตุลาคม 14, 2011, 12:25:47 am »

ขอบคุณสำหรับคำตอบด้านบนครับ ชัดเจน ตรงประเด็น
จากข้อที่หนึ่ง หมายถึงเราจะเขียนโปรแกรมภาษาซี ให้เป็นไปในเชิงระบบปฎิบัติการที่ใส่ใจในเรื่องของเวลา ลงสู่ mcu อย่างนั้นใช่ไหมครับ?
จากข้อที่สาม พี่พูดว่า "และเข้าใจพฤติกรรมของ Compiler สามารถทำให้ C ใช้จำนวน Machine cycle เท่า ASM ได้ในหลายกรณี" พี่กำลังจะบอกว่า 1 Machine cycle ของ C ทำงานไม่เท่ากับ 1 Machine cycle ของ ASM อย่างนั้นหรอครับ?เช่นว่า 1 Machine cycle ของ C ทำ 1 statement แต่ 1 Machine cycle ของ ASM ทำงาน 2 3 หรือ มากๆd Statement อย่างนั้นหรอครับ?

1. Real time operating system ของเว็บ FreeRTOS มันมีของฟรีในเชิงไหนครับ เช่น ไลบรารี? ตัวอย่างฟรี? etc.?
2. แล้วแบบที่ไม่ฟรีมีที่เว็บไหนครับ มีอะไรพิเศษกว่าเหนือกว่าขอฟรีครับ?
3. Kernel คือแก่นซึ่งเป็นส่วนที่สำคัญของระบบปฏิบัติการ โดยภายในเคอร์เนล จะประกอบไปด้วยโมดูล (Module) ต่างๆ และบางครั้งเราอาจจะเรียกโมดูลเหล่านี้ว่า ไดรเวอร์ (Driver) ซึ่งมีหน้าที่เป็นตัวกลางในการติดต่อกันระหว่างแอพพลิเคชันหรือ ระบบปฏิบัติการกับอุปกรณ์ฮาร์ดแวร์ทั้งหมด ทั้งภายในและนอกเครื่องถูกไหมครับ? มันไปอยู่ส่วนไหนของโปรแกรมที่พี่เขียนจากตัวอย่างด้านบนครับ? บรรทัดไหนถึงบรรทัดไหน? และจำเป็นจะต้องเขียนเองไหม? หรือมีฟรี?
4. RTOS ใช้แรมของ MCU เยอะไหมครับเมื่อเทียบกับการเขียนโปรแกรมบบธรรมดา
5. การใช้ Real time operating systems กับ Middleware อะไรดีกว่ากัน

บันทึกการเข้า

CH.E22
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8267


ShadowWares


| |
« ตอบ #6 เมื่อ: ตุลาคม 14, 2011, 07:01:34 am »

อ้างถึง
ขอบคุณสำหรับคำตอบด้านบนครับ ชัดเจน ตรงประเด็น
จากข้อที่หนึ่ง หมายถึงเราจะเขียนโปรแกรมภาษาซี ให้เป็นไปในเชิงระบบปฎิบัติการที่ใส่ใจในเรื่องของเวลา ลงสู่ mcu อย่างนั้นใช่ไหมครับ?
ใส่ใจเรื่องของเวลา ประสิทธิภาพ ของการบริการจัดการทรัพยากรต่างๆของระบบ ไม่ว่าจะเป็น CPU time, Memory และ IO ต่างๆ แน่นอนโปรแกรมสำหรับ MCU ก็ต้องลงสู่ MCU

อ้างถึง
จากข้อที่สาม พี่พูดว่า "และเข้าใจพฤติกรรมของ Compiler สามารถทำให้ C ใช้จำนวน Machine cycle เท่า ASM ได้ในหลายกรณี" พี่กำลังจะบอกว่า 1 Machine cycle ของ C ทำงานไม่เท่ากับ 1 Machine cycle ของ ASM อย่างนั้นหรอครับ?เช่นว่า 1 Machine cycle ของ C ทำ 1 statement แต่ 1 Machine cycle ของ ASM ทำงาน 2 3 หรือ มากๆd Statement อย่างนั้นหรอครับ?
ไม่ใช่ครับ คำว่า "N Machine cycle" จะภาษาอะไรก็มีความหมายเหมือนกัน เพราะมองกันที่จำนวน clock ที่ CPU ทำการประมวลผลคำสั่งในระดับ Machine code Mnemonic code ของ ASM หรือ Statement ของ C หรือมาภาษาอื่นๆ
1 Statement แปลเป็น ASM แล้วอาจจะเป็นหลายคำสั่ง ในนำนองเดียวกัน 1 คำสั่ง ASM แปลเป็น Machine code แล้ว CPU อาจจะต้องใช้เวลาประมวลผลมากกว่า 1 Machine cycle


อ้างถึง
1. Real time operating system ของเว็บ FreeRTOS มันมีของฟรีในเชิงไหนครับ เช่น ไลบรารี? ตัวอย่างฟรี? etc.?
ณ เวลานี้ฟรีทั้งหมดครับ

อ้างถึง
2. แล้วแบบที่ไม่ฟรีมีที่เว็บไหนครับ มีอะไรพิเศษกว่าเหนือกว่าขอฟรีครับ?
เข้าไปที่ google แล้วพิมพ์คำว่า RTOS ลงไป มีมากมายหลายตัว อย่างเช่น uC/OS, RTX51 ความพิเศษ ความด้อยกว่า ความเหนือกว่า ย่อมแตกต่างกัน ต้องอ่านในรายละเอียดของแต่ละตัว บางตัวก็ดีเกินไปสำหรับบางงาน บางตัวก็ไม่รองรับ ไม่ไม่อำนวยความสะดวกให้กับบางงาน

อ้างถึง
3. Kernel คือแก่นซึ่งเป็นส่วนที่สำคัญของระบบปฏิบัติการ โดยภายในเคอร์เนล จะประกอบไปด้วยโมดูล (Module) ต่างๆ และบางครั้งเราอาจจะเรียกโมดูลเหล่านี้ว่า ไดรเวอร์ (Driver) ซึ่งมีหน้าที่เป็นตัวกลางในการติดต่อกันระหว่างแอพพลิเคชันหรือ ระบบปฏิบัติการกับอุปกรณ์ฮาร์ดแวร์ทั้งหมด ทั้งภายในและนอกเครื่องถูกไหมครับ? มันไปอยู่ส่วนไหนของโปรแกรมที่พี่เขียนจากตัวอย่างด้านบนครับ? บรรทัดไหนถึงบรรทัดไหน? และจำเป็นจะต้องเขียนเองไหม? หรือมีฟรี?
ถูกครับ
มันไม่ได้อยู่ในโปรแกรมตัวอย่างนั่น โปรแกรมทุกบรรทัดในนั้นเป็นแค่การเรียกใช้ความสามารถของ OS ไม่ได้แสดงรายละเอียกของ code ของ OS เอาไว้ user ที่ไม่มีความรู้เรื่องภาษาซีชั้นสูง และไม่เข้าใจการทำงานเชิงลึกของ CPU อ่าน code เหล่านี้ได้ยากครับ
ไม่จำเป็นต้องเขียนเอง มีของฟรี


อ้างถึง
4. RTOS ใช้แรมของ MCU เยอะไหมครับเมื่อเทียบกับการเขียนโปรแกรมบบธรรมดา
เยอะครับ งานง่ายๆ ไม่คุ้มที่จะนำ RTOS มาใช้

อ้างถึง
5. การใช้ Real time operating systems กับ Middleware อะไรดีกว่ากัน
ทั้งสองตัวถูกสร้างมาด้วยจุดประสงค์ที่แตกต่างกัน เทียบกันไม่ได้ว่าอะไรดีกว่า
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
kissubin
Newbie
*
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 27



| |
« ตอบ #7 เมื่อ: ตุลาคม 14, 2011, 12:04:03 pm »

ขอบคุณครับมากๆ ครับ ผมหวังว่ากระทู้นี้จะเป็นประโยชน์แก่ผู้ที่ผ่านมา ผ่านไปนะครับ
บันทึกการเข้า

CH.E22
harmut
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 1


| |
« ตอบ #8 เมื่อ: พฤษภาคม 29, 2012, 10:13:58 am »

ครับ ผ่านมาเจอคนเขียนแบบนี้พอดีครับ  ต้องขอบคุณจริงๆ  cheesy
บันทึกการเข้า
PSimon23
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 1


| |
« ตอบ #9 เมื่อ: กรกฎาคม 07, 2012, 08:28:29 pm »

Similar matter has already been discussed at yahoo answers. I can post the link if needed
บันทึกการเข้า

I'm on Twitter and my essay
tachakorn
Jr. Member
**
ออฟไลน์ ออฟไลน์

กระทู้: 57


| |
« ตอบ #10 เมื่อ: เมษายน 14, 2015, 01:57:02 am »

กำลังศีกษาอยู่ครับ ขอบคุณสำหรับคำตอบที่เป็นแนวทางในการศึกษาระบบ RTOS ครับ และขอบคุณผู้ตั้งคำถามเพื่อได้คำตอบดีๆเช่นกันครับ cheesy
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: