ธันวาคม 13, 2017, 02:39:42 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

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

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


ShadowWares


| |
« เมื่อ: มีนาคม 10, 2012, 07:46:15 pm »



สำหรับ layer-0 (core) เป็น pure asm ละ pre-processor แฉไปเห็นจะเรื่องยาว
ที่สำคัญตัวนี้มีเจ้าของเสียแล้ว ไม่สามารถแฉหมดเปลือกได้ (ด้วยจรรยาบรรณวิชาชีพ)

Code: (c)
#define OS_CreateTask(Prio, TaskName){      \
   OS_TempDefine();                     \
   asm("movlw high _"#TaskName);         \
   asm("movwf _addrH");               \
   asm("movlw low _"#TaskName);         \
   asm("movwf _addrL");               \
   iCurTask = Prio;                  \
   OS_SaveAddr();                     \
}   

#define OS_SavePC(){                  \
   OS_TempDefine();                     \
   asm("movf 0x0a, w");               \
   asm("movwf _addrH");               \
   asm("movlw low($+13)");               \
   asm("movwf _addrL");               \
   OS_SaveAddr();                     \

}   

#define OS_LoadPC(){                  \
   OS_TempDefine();                     \
   OS_LoadAddr();                     \
   asm("movf _addrH, w");               \
   asm("movwf 0x0a");                  \
   asm("movf _addrL, w");               \
   asm("movwf 0x02");                  \
}


มาดูตัวอย่างการใช้งานกันสักหน่อย
Code: (c)
#include "rtos.h"
void Task0(void){
   while(1){
      PORTA = (PORTA)?(PORTA<<1):(0x01);
      OS_Yield(); /* Unconditional Context Switching */
   }      
}

void Task1(void){
   while(1){
      PORTB = (PORTB)?(PORTB<<1):(0x01);
      OS_Yield();
   }   
}

void Task2(void){
   while(1){
      PORTC = (PORTC)?(PORTC<<1):(0x01);
      OS_Yield();
   }   
}

void main(void){
   OS_Init("SDW-RTOS"); /* Unlock code */
   OS_CreateTask(0, Task0);
   OS_CreateTask(1, Task1);
   OS_CreateTask(2, Task2);
   OS_Start();
}

/* DO NOT forget to add rtos_core.llp in to the project */


Task Control Block ของแต่ละ Task ใช้เพียง 2 ไบต์
Global Variable of OS ใช้เพียง 1 ไบต์
Scheduler (Round-Robin, No preemption)  และ Context Switching รวมกัน ใช้เพียง 58 Instruction Cycles เท่านั้น
ถึงจะออกแบบมาให้รองรับ baseline และ mid-range แต่ทำงานได้เต็ม 100% กับทุกเบอร์ของ Microchip

พร้อมท้าดวนชนกับทุกค่ายแล้ววันนี้
 angry
บันทึกการเข้า

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

กระทู้: 1


| |
« ตอบ #1 เมื่อ: มีนาคม 14, 2014, 04:03:57 pm »

โค๊ดที่สุดยอดมากๆเลย
บันทึกการเข้า

gooddeeyo
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 1


| |
« ตอบ #2 เมื่อ: เมษายน 26, 2014, 10:35:53 am »

ยอดเยี่ยมไปเลยครับ
บันทึกการเข้า

Bird
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 8


| |
« ตอบ #3 เมื่อ: มกราคม 29, 2015, 06:44:28 pm »

ยอดเยี่ยมตรงใหน สุดยอดอย่างไรครับ  angel(ผมไม่รู้จริงๆครับ)
แล้วมันมีกี่ layer ? ครับ
บันทึกการเข้า
Sinderfolt
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 3


| |
« ตอบ #4 เมื่อ: กรกฎาคม 05, 2017, 11:41:48 am »

รับทราบครับผม
บันทึกการเข้า

หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: