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

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

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


ShadowWares


| |
« เมื่อ: ธันวาคม 27, 2011, 09:56:26 pm »

SDW-SoftwareTimer Library User's Guide


:: This library is developed and provided as a freeware for ShaDowWares students who are studying in Advanced Embedded Programming course of the ShaDowWares School ::

ที่มา
บทความนี้เป็นบทความเฉพาะสำหรับคนที่ได้ผ่านการเรียนรู้การเขียนโปรแกรมไมโครคอนโทรลเลอร์โดยใช้ RTOS สำหรับไมโครคอนโทรลเลอร์ขนาดเล็ก เขียนขึ้นเพื่อเป็นข้อมูลอ้างอิงให้กับคนที่กำลังเรียน หรือได้เรียนเทคนิคการเขียนโปรแกรมไมโครคอนโทรลเลอร์ขั้นสูง (Advanced Embedded Programming) กับทาง ShaDowWares School  ในส่วนของการใช้งาน RTOS และเทคนิคการเขียนโปรแกรมภายใต้ทรัพยากรของระบบอันจำกัด มุ่งเน้นไปที่การใช้ RAM, ROM และเวลาในการประมวลผล ให้น้อยที่สุดเท่าที่เป็นไปได้ รายละเอียดในบทความนี้ไม่ได้พูดถึงเทคนิคดังกล่าว แต่จะพูดถึงการใช้งานฟังก์ชั่นที่เกี่ยวกับ Software Timer (SDWSoftwareTimerTiny v1.1) แบบสรุปรวบยอด

รายละเอียดและคุณสมบัติเบื้องต้น
Library ตัวนี้พัฒนาภายใต้ชื่อ SDWSoftwareTimerTiny v1.1 ได้ถูกดัดแปลงมาจาก SDW-Kernel v2.2 ที่ทำงานแบบ RTOS เต็มรูปแบบ ออกแบบสำหรับใช้กับ MCU ที่มีขนาดของหน่วยความจะขนาดใหญ่ (256 Bytes ขึ้นไป) และทำงานได้เต็ม 100% เมื่อใช้กับ Compiler ที่มีความสามารถในส่วนของ Dynamic memory allocation
เนื่องจาก SDWSoftwareTimerTiny  ออกแบบมาสำหรับ MCU ที่มีหน่วยความจำขนาดเล็ก 64 Bytes ลงไป และใช้งานกับ Compiler ที่ไม่รองรับ Dynamic memory allocation จึงได้ทำการตัดทุกสิ่งที่ไม่จำเป็นออกไป เพื่อรักษาไว้ซึ่งขนาดของหน่วยความจำ ทั้ง RAM และ ROM รวมไปถึงลดเวลาในการประมวลผลที่ไม่จำเป็น ถึงแม้ว่าหลายความสามารถจะถูกตัดออกไป แต่ Library ตัวนี้ยังคงรักษาความเป็น Library ที่รองรับการทำงานแบบ Dynamic และกระทำกับ Object ใดๆ โดยการส่งผ่าน pointer to object นั้นไปให้ฟังก์ชั่นที่ต้องการได้ทันที นั่นหมายความว่าไม่มีความจำเป็นจะต้องทำการ Compile ตัว source code ใหม่ เพราะ Linker สามรพเชื่อมโยงฟังก์ชั่นต่างๆของ Library ตัวนี้กับ User Program ได้ทันที
ดังที่เกริ่นไปว่า Library ออกแบบมาสำหรับ Compiler ที่ไม่รองรับ Dynamic memory allocation ดังนั้น User จะต้องคิดวางแผนว่าต้องการใช้ Software Timer กี่ตัว และทำการ define จำนวนขอ Software Timer ที่ต้องการ ซึ่งสามารถสร้างได้สูงสุด 4 ตัว แต่ละตัวต้องการหน่วยความจำ 4 Bytes กับ 2 Bits เท่านั้น
ที่ออกแบบให้ใช้งานได้สูงสุด 4 ตัวนั้น มีเหตุผลหลักอยู่ 2 กรณีคือ
  1) ใช้ตัวแปรขนาด 8-bit เป็นตัวกำหนดสถานะของ Software Timer แต่ละตัว (ตัวหนึ่งใช้ 2 bits จึงรองรับได้สูงสุด 4 ตัว)
  2) MCU ขนาดเล็กไม่ได้ออกแบบมาให้ทำงานที่มีความซับซ้อนสูง การใช้ Software Timer 1-2 ตัวถือว่ามากพอ และการที่ Library ตัวนี้รองรับได้ 4 ตัว ถือว่ามากเกินพอ


การใช้งาน
เพื่อลดการใช้งานหน่วยความจำ จึงกำหนดให้ User ต้องทำการสร้าง Object ขึ้นมา โดยที่ Object แต่ละตัวสามารถมี Software Timer ได้มากที่สุด 4 ตัว ในแต่ละ Object ต้องการตัวแปรสถานะ (Status) ของ Software Timer 1 ตัว นั่นหมายความว่าหากต้องการสร้าง Timer 5 ตัวจะต้องสร้าง Object ขึ้นมา 2 ตัว โดยที่ตัวแรกมี Software Timer อยู่ 4 ตัว และ Object ตัวที่ 2 มี Software Timer อยู่ 1 ตัวนั่นเอง และต้องมีตัวแปร Status 2 ตัวเช่นกัน ในกรณีนี้จะใช้ RAM ในส่วนของ Object และ Status ไปทั้งสิน (4x4)+(1x4)+2 = 22 Bytes นั่นเอง

การกำหนดจำนวนของ Software Timer
การกำหนดจำนวนของ Software Timer สามารถทำได้โดยการ define จากโปรแกรมด้านล่างจะเห็น #define SDW_TIMER_N 2 นั่นหมายความว่าต้องการใช้ Software Timer จำนวน 2 ตัว


Code: (c)
#define SDW_TIMER_N         2

#define SDW_TIMER_0         0
#define SDW_TIMER_1         1      
#define SDW_TIMER_2         2
#define SDW_TIMER_3         3   

#define SDW_TIMER_CALLBACK_RETURN far void
#define SDW_TIMER_CALLBACK_PARAM  void
typedef struct _SDW_TIMER_OBJ{
   BYTE   upper;
   BYTE   lower;   
   SDW_TIMER_CALLBACK_RETURN (*callback)(SDW_TIMER_CALLBACK_PARAM);   
}SDW_TIMER_OBJ;   

#define SDW_TIMER_STS       BYTE
static SDW_TIMER_OBJ       _TimerObject[SDW_TIMER_N];
static SDW_TIMER_STS       _TimerStatus;

จากโปรแกรมด้านบน ตัวแปร _TimerObject และ _TimerStatus คือ Object และ Status ที่ได้กล่าวถึงไปแล้วก่อนหน้า ชื่อของตัวแปรนี้สามารถเปลี่ยนแปลงได้ตามความต้องการ แต่ตอนเรียกใช้จะต้องอ้างให้ตรงกัน

รายละเอียดของฟังก์ชั่น

Code: (c)
void SDWTimerCreate(SDW_TIMER_OBJ *pTimer, BYTE TimerID, BYTE TimerPeriod, 
                  SDW_TIMER_CALLBACK_RETURN (*TimerCallback)(SDW_TIMER_CALLBACK_PARAM))

สร้างและกำหนดค่าเริ่มต้นให้กับ Software Timer
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE TimerID: หมายเลขของ Software Timer ใน Timer Object (0-SDW_TIMER_N)
BYTE TimerPeriod: เวลาในการเกิด Overflow ของ Software Timer (0-255 x TickTime)
 far void(*TimerCallback): ฟังก์ชั่นที่ต้องการให้ทำงานเพื่อ Software Timer เกิดการ Overflow หากไม่ต้องการให้กำหนดเป็น NULL หรือ (void *) หรือ 0


Code: (c)
void SDWTimerProcess(SDW_TIMER_OBJ *pTimer, BYTE nTimer)

Core-Function ของ Software Timer จะต้องเรียกฟังก์ชั่นนี้ด้วยเวลาที่แม่นยำตามค่า TimeTick (Ticks per Second) ที่ต้องการ
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE nTimer: จำนวนของ Software Timer ที่ใช้ (SDW_TIMER_N)
** ฟังก์ชั่นนี้จะต้องถูกเรียกทุกๆ ระยะเวลา TimeTick **


Code: (c)
void SDWTimerScheduler(SDW_TIMER_OBJ *pTimer, BYTE nTimer)

ทำการตรวจสอบการ Overflow และเรียก Function ที่ระบุโดย pointer to function ผ่านทาง callback ของ Software Timer
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE nTimer: จำนวนของ Software Timer ที่ใช้ (SDW_TIMER_N)
** ฟังก์ชั่นนี้จะต้องถูกเรียกใน Infinite loop ใน main function **


Code: (c)
void SDWTimerSetCallback(SDW_TIMER_OBJ *pTimer, BYTE TimerID, 
                                 SDW_TIMER_CALLBACK_RETURN (*TimerCallback)(SDW_TIMER_CALLBACK_PARAM))

กำหนด Callback Function ให้กับ Software Timer
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE TimerID: หมายเลขของ Software Timer ใน Timer Object (0-SDW_TIMER_N)
BYTE TimerPeriod: เวลาในการเกิด Overflow ของ Software Timer (0-255 x TickTime)
SDW_TIMER_CALLBACK_RETURN (*TimerCallback)(SDW_TIMER_CALLBACK_PARAM)): ฟังก์ชั่นที่ต้องการให้ทำงานเพื่อ Software Timer เกิดการ Overflow หากไม่ต้องการให้กำหนดเป็น NULL หรือ (void *) หรือ 0


Code: (c)
void SDWTimerSetPeriod(SDW_TIMER_OBJ *pTimer, BYTE TimerID, BYTE TimerPeriod)

กำหนดระยะเวลาการเกิดการ Overflow ให้กับ Software Timer
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE TimerID: หมายเลขของ Software Timer ใน Timer Object (0-SDW_TIMER_N)
BYTE TimerPeriod: เวลาในการเกิด Overflow ของ Software Timer (0-255 x TickTime)


Code: (c)
void SDWTimerReset(SDW_TIMER_OBJ *pTimer, BYTE TimerID)

ทำการ Reset Software Timer
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE TimerID: หมายเลขของ Software Timer ใน Timer Object (0-SDW_TIMER_N)


Code: (c)
void SDWTimerSuspend(SDW_TIMER_OBJ *pTimer, BYTE TimerID)

หยุดการทำงานของ Software Timer ชั่วคราว จนกว่าจะเรียกใช้ฟังก์ชั่น SDWTimerResume()
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE TimerID: หมายเลขของ Software Timer ใน Timer Object (0-SDW_TIMER_N)


Code: (c)
void SDWTimerResume(SDW_TIMER_OBJ *pTimer, BYTE TimerID)

ให้ Software Timer กลับมาทำงานอีกครั้ง หากก่อนหน้านี้ถูกสั่งให้หยุดโดยฟังก์ชั่น SDWTimerSuspend()
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE TimerID: หมายเลขของ Software Timer ใน Timer Object (0-SDW_TIMER_N)


Code: (c)
void SDWTimerStart(SDW_TIMER_OBJ *pTimer, BYTE TimerID)

สั่งให้ Software Timer เริ่มทำงาน ฟังก์ชั่นนี้จะ Reset ส่วนต่างๆของ Software Timer ก่อนที่จะให้ Software Timer เริ่มทำงาน
SDW_TIMER_OBJ *pTimer: Pointer to Timer Object ที่ต้องการอ้างถึง
BYTE TimerID: หมายเลขของ Software Timer ใน Timer Object (0-SDW_TIMER_N)



ตัวอย่าง Callback Function
Code: (c)
static void Callback_A(void){
   DoSomething();
}


ตัวอย่างการใช้งาน
Code: (c)
void main(void){
   Init();
   SDWTimerCreate(_TimerObject, SDW_TIMER_0, 50, &Callback_A);
   SDWTimerStart(_TimerObject,  SDW_TIMER_0);
   while(1){
      SDWTimerScheduler(_TimerObject, SDW_TIMER_N);   
   }      
}

โปรแกรมนี้ ฟังก์ชั่น Callback_A() จะถูกเรียกให้ทำงานทุกๆ 50mS
** ฟังก์ชั่น SDWTimerProcess() ถูกเรียกจาก Interrupt function ของ Hardware Timer ทุกๆ TimeTick **
บันทึกการเข้า

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

กระทู้: 29


| |
« ตอบ #1 เมื่อ: มีนาคม 13, 2016, 02:08:43 pm »

หาอ่านข้อมูลเกี่ยวกับมัลติทาคกิ้งอ่านไม่เข้าใจครับอาจารย์
ว่ามัลติทาคกิ้งมันไปทำอะไรกับรีจิสเตอร์ไหนของซีพียูครับ angel
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

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


ShadowWares


| |
« ตอบ #2 เมื่อ: มีนาคม 22, 2016, 09:20:20 am »

multitask ไม่ได้เกี่ยวข้องกับ register โดยตรงครับ มันเป็นรูปแบบการเขียน และการทำงานของโปรแกรม
ของหาข้อมูลโดยใช้คำค้น Introduction to Multitasking ดูครับ จะเข้าใจมากขึ้นว่ามันคืออะไร
บันทึกการเข้า

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

กระทู้: 1


| |
« ตอบ #3 เมื่อ: กันยายน 11, 2018, 04:22:22 pm »

น่าสนค้ะ
 cheesy
บันทึกการเข้า

เกมส์ผ่อนคลายแก้เหงา sbobet หรือ แทงบอลออนไลน์
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: