กันยายน 15, 2019, 01:38:28 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

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

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


ShadowWares


| |
« เมื่อ: ธันวาคม 23, 2011, 11:02:56 pm »

<a href="http://www.youtube.com/v/yrmyNBCZHVI&amp;rel=0" target="_blank">http://www.youtube.com/v/yrmyNBCZHVI&amp;rel=0</a>

หลังจากได้พัฒนา OS หรือ Kernel สำหรับ PIC16xxx เสร็จไปเมื่อนานมาแล้ว แต่ยังไม่มีเวลาได้ทำ Tutorial วันนี้ว่างๆ เลยเขียน Kernel และ Function พื้นฐานสั่ง Compile เป็น Libraries เก็บไว้รอเรียกใช้ตอนงานเข้า เพื่อให้เป็นเนื้อเป็นหนังมากพอที่จะเป็น Demo ได้จึงไปนำวงจรที่เคยเสนอไปในหัวข้อ Digital Circuit and Design Technique มาใช้ประโยชน์ และเพื่อเป็นการทดสอบประสิทธิภาพของตัว Kernel เนื่องจากการแสดงผล 7-Segment ถือว่าเป็นเรื่องที่ท้าทาย เพราะในส่วนของการเปลี่ยนจากตัวเลขใดๆ เป็น code ของการแสดงผลใช้หน่วยความจำและเวลาไม่น้อย (ในที่นี้ใช้เวลานานกว่า OS Time Tick) บวกกับการสื่อสารข้อมูลแบบ SPI ที่ต้องควบคุมจังหวะอ่านเขียนข้อมูล จึงเป็นวงจรที่ดีสำหรับการทดสอบ Kernel ในส่วนของ share resource, critical section, context switching, stack depth รวมไปถึง Task priority และส่วนอื่นๆ

การสร้าง Kernel ตัวนี้ขึ้นมา ต้อง Optimize code กันเต็มๆ โดยเฉพาะการใช้งาน RAM เพราะตระกูลนี้มี RAM มากกสุดคือ 128 bytes เท่านั้น (เบอร์ PIC12F683 และ PIC12F675 ส่วนเบอร์อื่นๆ มีเพียง 38 bytes และ 64 byte ทั้งนี้เท่าที่จำได้) RAM แค่ 128 bytes จะเอา Kernel จับยัดลงไป ไม่ง่ายเลย แต่ความยาก ถือเป็นความท้าทาย และต้องทำลายให้สิ้น

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




Code: (c)
/**************************************************************/  
/* FILE:     main.c                                           */  
/* CPU:      PIC12xxx                                         */  
/* XTAL:     8MHz                                             */  
/* IDE:      MPLAB IDE v8.70                                  */  
/* COMPILER: HI-TECH PIC-C Compiler v9.71a, v9.81             */  
/* AUTHOR:   SANTI NURATCH @ SHADOWWARES.COM                  */  
/* DATE:     23 December, 2011                                */  
/* DESCRIPTION: Demostrate the SDW-Kernel for PIC12 Family    */  
/**************************************************************/  
#include "SDW-Kernel.h"
#include "SDW-Libraries.h"

//static volatile unsigned int OSTicks = 0;

/**************************************************************/
/*       This function is called directly by OS every 1mS     */
/**************************************************************/
void OS_CallbackFunction(void){
   //OSTicks++;      
}            

/**************************************************************/
/*              Scan 7-Segment display, 4ms/digit             */
/**************************************************************/
void Task_Display(void){
   DSP_Scan();   
}

/**************************************************************/
/*    Read ADC and convert to 7-Segment display code, 200mS   */
/**************************************************************/
void Task_ReadADC(void){
   INV_BIT(GPIO, 5);         // Toggle LED
   DSP_Convert(ADC_Read()*5);   // (0-1023)*5 for test   
}

/**************************************************************/
/*          Main function, Initial and OS-Scheduler           */
/**************************************************************/
void main(void){
   IO_Init();                     // Initial IO
   ADC_Init();                     // Initial ADC
   SPI_Init();                     // Initial SPI
   OS_Init(&OS_CallbackFunction);      // Initial OS
   OS_CreateTask(4, &Task_Display);   // Create Task_Display
   OS_CreateTask(200, &Task_ReadADC);   // Create Task_ReadADC
   while(1){                     // Call an OS's Scheduler manually
      OS_Scheduler();               // to save hardware stask    
    }      
}   

// END


ผลการ Compile:
Code:
HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode)  V9.81
Copyright (C) 2010 Microchip Technology Inc.
Serial number: HCPICP-xxxxxx(PRO)

Memory Summary:
    Program space        used   25Fh (   607) of   400h words   ( 59.3%)
    Data space           used    26h (    38) of    40h bytes   ( 59.4%)
    EEPROM space         used     0h (     0) of    80h bytes   (  0.0%)
    Configuration bits   used     1h (     1) of     1h word    (100.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)

และนั่นคือความสะดวกของการใช้ Kernel ใครมีไว้ในมือ และศึกษาการใช้อย่างแตกฉานแล้วอาจจะทำงานได้เร็วขึ้นอย่างน้อยๆ 20-30 เท่าตัวเลยทีเดียว และยิ่งถ้าได้พัฒนา Libraries เก็บไว้ความเร็วของการจัดการกับงานอาจจะเร็วขึ้นนับ 100 เท่าตัว
เลือกที่จะพัฒนาเอง เลือกที่จะใช้ของที่มีอยู่ นั่นเป็นหน้าที่ตัดสินใจของใครของมัน แต่ถ้าไม่อยากเลือกแบบผม ก็ใช้ของเขาไปพร้อมๆกับพัฒนาเก็บไว้เป็นของตัวเอง เมื่อนำทั้งสองส่วนมารวมกันได้อย่างลงตัวนั่นถือเป็นที่สุด
แล้วเจอกันใน Online Tutorial เร็วๆ นี้ครับ
 azn


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

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: