Embedded OS

Started by tha, September 11, 2014, 05:05:26 AM

Previous topic - Next topic

zero

ขอตามติดด้วยคน  :)
น่าสนใจดีครับ

Lastman

คุณ THA จะเปิดคอร์สเมื่อไหร่ครับ  :)

tha

แปลมาจากหนังสือ The Definitive Guild to Cortex-M3,M4 นั่นแหละ ก็ดาวน์โหลดมาจากเว็บนี้แหละลองหาดู กะว่าจะแปลให้จบบทเลย ต่อเลยดีกว่า

3.2 ภาพรวมของ Inter-thread communication
  ส่่วนมากแล้วแอพลิเคชั่นที่ใช้งาน RTOS จะมีการกระทำซึ่งกันและกันระหว่าง thread ทั้งหลาย แทนที่จะใช้การ shared data และ polling loop เพื่อเช็คสถานะของ task อื่นๆ หรือ passing information เราควรใช้ inter-thread communication features ที่มีให้ใน OS เพื่อทำให้การทำงานมีประสิทธิภาพมากขึ้น มิฉะนั้นแล้ว a thread ที่กำลังคอยอินพุทจาก thread อื่นอยู่จะอยู่ใน READY คิวเป็นเวลานานและนี่จะทำให้กินเวลา processing time เป็นจำนวนมาก
  RTOS สมัยใหม่ปกติแล้วจะจัดให้มีวิธีการที่จะรองรับการติดต่อระหว่าง thread ใน CMSIS-RTOS วิธีการที่รองรับมีดังนี้ :
  • Signal events
  • Semaphores
  • Mutex
  • Mailbox/message
นอกจากนี้ยังมี feature อื่นอีกที่รองรับบางวิธีการติดต่ออย่างเช่น memory pool management feature ซึ่งจะใช้บ่อยๆใน mailbox

3.3 Signal event communication
  ใน CMSIS-RTOS แต่ละ thread สามารถมี signal event ได้มากถึง 31 signal event (ขึ้นอยู่กับการคอนฟิคทาง macro ที่เรียกว่า osFeature_Signals ใน RTX) thread เข้าสู่ WAIT state เมื่อมันปฏิบัติฟังชั่น osSignalWait หนึ่งในอินพุทพารามิเตอร์เรียกว่า signal (32 bit value) เป็นตัวกำหนด signal event ที่ต้องการที่จะทำให้ thread กลับมาสู่ READY state แต่ละ bit(นอกเหนือจาก MSB) ของ signal จะเป็นพารามิเตอร์กำหนด signal event ที่ต้องการ และถ้าพารามิเตอร์ถูกเซตให้เป็น 0 ของแต่ละ signal event สามารถที่จะทำให้ thread นั้นกลับมาสู่ READY state ตาราง 19.9 เป็นรายละเอียดของ CMSIS_RTOS function สำหรับ signal event communications
  The signal event functions osSignalSet, osSignalClear, and osSignalGet จะคืนค่า 0x80000000 ในกรณีที่พารามิเตอร์ไม่ถูกต้อง
  โดยปกติ "cmsis_os.h" ใน RTX จะกำหนดค่าเริ่มต้น osFeature_Signals เป็น 16 ดังนั้นมันสามารถทำงานได้กับ 16 signal events (from 0x00000001 to 0x00008000)
  กรุณาบันทึกไว้ว่า signal flag ที่ใช้อย่าง event เพื่อปลุก thread ออกจาก WAITING state จะเคลียร์โดยอัตโนมัติ จากตัวอย่างนี้ event flag 0x0001 ถูกใช้เพื่อเอนาเบิล led_thread1 thread ให้ส่ง signal ไปให้  led_thread2 thread ที่รอรับ signal event flag นี้อยู่ (ปฏิบัติฟังชั่น  osSignalWait  อยู่) เพื่อทำงานต่อไป

http://www.mediafire.com/download/kp3mnfy3frcygai/RTX_RTOS_Signal.rar


tha

3.4 Mutual Exclusive (Mutex)  (กันเอาไว้เฉพาะ
  Mutual Exclusive หรือที่เรียกอีกอย่างหนึ่งว่า Mutex คือ feature ที่จัดการทรัพยากรที่ใช้ร่วมกัน มีอยู่ใน OS ทุกชนิด ส่วนมากทรัพยากรที่มีอยู่ใน processor system สามารถที่จะถูกใช้ได้เพียง thread เดียว ณ เวลาหนึ่งๆ ตัวอย่างเช่น "printf" output communication channel (ที่แสดงในรูปที่ 19.10)
  ก่อนที่จะใช้ Mutex เราจะต้องกำหนด Mutex object โดยใช้ "osMutexDef(name)." เป็นอย่างแรก เมื่ออ้างอิงถึง Mutex โดยใช้ CMSIS-RTOS Mutex API เราจะต้องใช้ "osMutex(name)" macro แต่ละ Mutex จะมีค่า ID ที่จะต้องการใช้ในบาง Mutex functions อีกด้วย ตารางที่ 19.10 เป็นรายการของ CMSIS-RTOS functions for Mutex operations
ตัวอย่างนี้ จะใช้จะมี 2 thread ซึ่งทั้งคู่จะใช้ usart1 ในการส่งข้อความ ไฟล์ printf.c ได้แก้ใขให้ส่งข้อความออกทาง usart1 โดยใช้ฟังชั่น "printf"

void PrintChar(char c)
{
/* Send a char like:
   while(Transfer not completed);
   Transmit a char;
*/
//SH_SendChar(c);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);   // Wait until transmition ready
USART_SendData(USART1,(uint16_t)c);   // Send character
}

ตัวอย่างนี้ใช้ CMSIS-RTOS ไฟล์ แทนการใช้ library(.a) มีการ define __Cortex_M3, __CMSIS_RTOS เพิ่มเติม(configuration->compile->defined Symbols->add) เนื่องจากไปใช้ตัวอย่างตามหนังสือซึ่งเป็น CMSIS-RTOS เวอร์ชั่นเก่า  แล้วไปใช้ osMutexWait ก่อนที่จะสตาร์ทเคอร์เนล osKernelStart (); ซึ่งมีใน CMSIS-RTOS เวอร์ชั่นใหม่ เวลาคอมไพล์จะผ่านแต่เวลาดีบักถึง osMutexWait จะเกิด HardFault ผมเลยเปลี่ยนโค้ดมาเป็นรูปแบบนี้เนื่องจากแก้ไม่ถูกจุด จนกระทั่งมีพรายกระซิบ(อีกแล้ว)มาบอกว่าเป็นที่จุดนี้ไม่งั้นคงคิดว่าเป็นบักไปอีกนาน  :'(
http://www.mediafire.com/download/2uik9j8kh8cbbbu/RTX_RTOS_Mutex.rar

tha

แก้ใขที่ startup_stm32f10x_md.c ลด stack size ลงมา แกผิดจุดยังไม่ได้แก้กลับครับ

#define STACK_SIZE       0x00000100      /*!< The Stack size suggest using even number     */

ที่ไฟล์ RTX_Conf_CM3.c ก็แก้กลับด้วย เดี๋ยวจะเปลืองแรม

#ifndef OS_STKSIZE
#define OS_STKSIZE     50
#endif

//   <o>Main Thread stack size [bytes] <64-32768:8><#/4>
//   <i> Defines stack size for main thread.
//   <i> Default: 200
#ifndef OS_MAINSTKSIZE
#define OS_MAINSTKSIZE 50
#endif

tha

มาใช้ library(.a) เหมือนเดิม http://www.mediafire.com/download/pk3342cew8vbj8d/RTX_RTOS_Mutex_1.rar
ถ้ากำหนด os stack size = 50 จะเกิด os error stack overflow เลยเพิ่ม os stack size = 100 ถึงจะไม่เกิด error

#ifndef OS_STKSIZE
#define OS_STKSIZE     100
#endif

tha

ลองเอา printf ออกทาง semi-hosting ตอน debug
http://www.mediafire.com/download/js9gi3wof1jhwlv/RTX_RTOS_Mutex_2.rar
Configuration->Debuger->Advance->Semi-hosting Enable

tha

3.5 Semaphore
  ในบางกรณีเราต้องการจำกัดจำนวน thread ยอมให้เข้าถึงทรัพยากรที่มีอยู่จำนวนหนึ่ง ตัวอย่างเช่น DMA controller ตัวหนึ่งอาจจะสามารถรองรับ DMA channel ได้หลายชาแนล หรือ embedded server แบบง่ายๆอาจจะสามารถรองรับการร้องขอขึ้นพร้อมกันในจำนวนที่จำกัดจำนวนหนึ่งเนื่องจากขนาดของ memory ที่มีอยู่บังคับไว้ ในกรณีเช่นนี้เราสามารถใช้ semaphore แทนการใช้ mutex
  semaphore feature จะเหมือนกับ mutex มาก ขณะที่ mutex ยอมให้มี thread เพียง thread เดียวเข้าถึงทรัพยากรที่ใช้ร่วมกัน ณ เวลาหนึ่งๆ semaphore สามารถที่จะยอมให้ thread จำนวนที่คงที่จำนวนหนึ่งเข้าถึงทรัพยากรที่ใช้ร่วมกันกลุ่มหนึ่ง ดังนั้น mutex ก็คือ semaphore ในกรณีพิเศษ ที่มีจำนวน token มากที่สุดเท่ากับ 1
  semaphore object ต้องการที่จะถูกตั้งต้นด้วยจำนวนที่มากที่สุดของ token ที่มีให้ใช้ (available tokens) และแต่ละครั้งที่ thread ต้องการใช้ทรัพยากรที่ใช้ร่วมกัน มันจะใช้ semaphore ดึงเอา token ตัวหนึ่งออกและเมื่อ thread ใช้ทรัพยากรเสร็จแล้วก็จะส่งคืน token กลับ ถ้าจำนวน token ลดลงมาถึง 0 เมื่อทรัพยากรทั้งหมดถูกเอาไปใช้จนหมดแล้วและ thread ต่อไปที่ต้องการใช้ทรัพยากรจะต้องรอ token มีเสียก่อนถึงจะใช้ทรัพยากรได้
  ในตัวอย่างต่อไปนี้เราสร้าง thread จำนวน 8 thread แต่ละ thread จะติดดับ LED และใช้ semaphore จำกัดจำนวน LED ที่ติด(active) เท่ากับ 4
  Semaphore objects ถูกกำหนดโดยใช้ "osSemaphoreDef(name)." เมื่ออ้างอิงถึง semaphore object โดยใช้ CMSIS-RTOS semaphore API เราต้องการใช้ "osSemaphore(name)" macro แต่ละ semaphore มีค่า ID ที่จะถูกต้องการโดยบางฟังชั่นของ semaphore ดังแสดงในตารางที่ 19.11
  ในตัวอย่างต่อไปนี้ program code จะมี 9 thread (รวม main() เข้าไปด้วย) ทั้ง 8 thread จะติดดับ LED และ semaphore จะถูกใช้ในการจำกัดจำนวน LED ที่ติด ณ เวลาหนึ่งๆ ให้เท่ากับ 4 หรือน้อยกว่า
http://www.mediafire.com/download/57m2zr4yapxuaz5/RTX_RTOS_Semaphore.rar