intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình hệ thống nhúng

Chia sẻ: Nguyen Lan | Ngày: | Loại File: PDF | Số trang:14

304
lượt xem
57
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

hệ thống nhúng nó dành cho những công việc phức tạp lúc đó viết trên hệ điều hành của nó sẽ đơn giản hơn là mình lập trình thông thường. mình lấy ví dụ đơn giản như khi lập trình giao diện đồ họa trên C sẽ khó khăn hơn là lập trình giao diện đồ hoạ trên C# vì nó hỗ trợ nhiều hơn lập trình nhúng cũng như vậy

Chủ đề:
Lưu

Nội dung Text: Lập trình hệ thống nhúng

  1. L P TRÌNH H TH NG NHÚNG BÙI QU C B O Concurrency (Tác v ch y ñ ng th i) M t h th ng có th có 2 hay nhi u tác v ch y ñ c l p nhau. VD: M t h th ng dùng 8051 ñ : B t/T t 1 LED g n vào P1.0 sau chu kỳ 500 ms. Cho 3 LED vàng-xanh-ñ l n lư t sáng-t t sau chu kỳ 500 ms Chia 2 tác v trên thành 2 máy tr ng thái SM ñ ng b v i chu kỳ 500 ms 2 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 1
  2. LED SHOW Blink LED Period: 500 ms LEDON LEDOFF Rotate LED Period: 500 ms GREEN_ON YELLOW_ON RED_ON 3 BM K Thu t ði n T - ðH Bách Khoa TP.HCM enum BLState_t {OFF_STATE,ON_STATE} BLState; enum RTState_t {YELLOW_STATE, GREEN_STATE, RED_STATE} RTState; unsigned char timerFlag = 0; void TimerISR() { timerFlag = 1; } void BL_Update() { … } void RT_Update() { … } 4 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 2
  3. void main(void) { outputInit(); timerInit(); BLStateInit(); STStateInit(); while (1) { while (!timerFlag); BL_Update(); RT_Update(); timerFlag = 0; } } 5 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Shared variable (bi n dùng chung) Ho t ñ ng c a m t h th ng có th ñư c chia thành nhi u tác v ñ c l p m c dù chúng có liên quan t i nhau. VD: M t h th ng phát hi n chuy n ñ ng s d ng 1 sensor k t n i vào chân P1.0. M t chuy n ñ ng ñư c phát hi n khi sensor b ng 1 trong 2 l n lâý m u liên ti p cách nhau 200ms. LED1 (nôí vào P1.1) ñư c nh p nháy sau v i chu kỳ 200ms trong th i gian phát hi n chuy n ñ ng. LED2 (nôí vào P1.2) ñư c b t khi phát hi n chuy n ñ ng và t t 10s sau khi chuy n ñ ng không còn b phát hi n. 6 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 3
  4. Shared variable (bi n dùng chung) !P1.0 !P1.0 P1.0 P1.0 P1.0 S0 S1 S2 mnt mnt = 0 mnt = 1 !P1.0 !mnt && (cnt < 50) !mnt mnt mnt !mnt T0 T1 T2 cnt = 0 cnt++ !mnt && !(cnt < 50) 7 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Shared variable (bi n dùng chung) Chú ý: Ch có 1 tác v ghi vào bi n chung. Nhi u tác v có th cùng ñ c m t bi n chung. VD V máy tr ng thái cho h th ng làm vi c sau: B t lò ñ t b ng cách set P1.0 khi nhi t ñ ño ñư c (ñ c vào t P2) nh hơn 100. Trong khi b t lò, ch p nháy LED n i vào P1.1 v i chu kỳ 500ms ñ báo cho ngư i dùng bi t là lò ñang b t. 8 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 4
  5. Máy tr ng thái có chu kỳ khác nhau Các tác v v i chu kỳ khác nhau có th ñư c ch y b ng cách s d ng m t bi n ñ ñ m s l n c timerFlag ñư c b t (Timer tick) và th c thi khi bi n ñó ñ t ñ n giá tr mong mu n. VD: Vi t chương trình ñ 8051 ch p LED g n vào P1.0 v i chu kỳ 600 ms, và cho 3 LED xanh, vàng, ñ l n lư t sáng sau kho ng th i gian 1s. 9 BM K Thu t ði n T - ðH Bách Khoa TP.HCM enum blState_t {LEDON, LEDOFF} BLState; enum blState_t {GREEN, YELLOW,RED} RTState; static unsigned char timerFlag = 0; void timerISR(void) { timerFlag = 1; } void BLUpdate { … } void RTUpdate { … } 10 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 5
  6. void main(void) while (1) { { unsigned char BLTickCount = 0; While (!timerFlag); unsigned char RTTickCount = 0; BLTickCount++; unsigned char RTTickCount++; BLTickPeriod = 3; If (BLTickCount == BLTickPeriod ) unsigned char { RTTickCount = 5; BLUpdate(); BLTickCount = 0; timerPeriodSet(200); } BLInit(); If (RTTickCount == RTTickCount ) RTInit(); { runTimer(); RTUpdate(); RTTickCount = 0; } } } 11 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Task Scheduler Trong chương trình có nhi u tác v ch y song song, ño n chương trình quy t ñ nh xem tác v nào s ñư c ch y g i là 1 scheduler. M t scheduler g m: Hàm kh i t o. Hàm c p nh t các thông s c a các tác v , th c thi trong ng t timer. M t hàm th c thi tác v ñ n th i ñi m ñư c ch y (dispatcher). M t hàm thêm tác v vào scheduler 12 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 6
  7. Task Structure M i tác v (task) ñ u có các thông s sau: (ví d tác v ch p led) Tên tác v (BLUpdate) H ng s ch a th i gian gi a 2 l n th c thi (BLTickPeriod ). Bi n ñ m s l n timer tick. M t c báo tác v ñu c cho phép ch y. typedef data struct { void (code * ptask) (void); unsigned char period ; unsigned char count ; unsigned char runMe; } taskStructType; 13 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Simple scheduler void main (void) { schedulerInit(); //kh i t o scheduler /*Thêm tác v BLLED vào scheduler, tác v này ñ o LED sau 1000 l n timer tick*/ schedulerAddTask(BLLed, 1000, 0); schedulerStart(); while (1) { schedulerDispatch(); } } void schedulerUpdate(void) interrupt 1 using 0 { //update tasks } 14 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 7
  8. Scheduler.h #ifndef SCHEDULER_H #define SCHEDULER_H #include #ifndef SCHEDULER_GLOBAL #define SCHEDULER_GLOBAL extern #else #define SCHEDULER_GLOBAL #endif #define SUCCEES (0) #define ERROR_TOO_MANY_TASK (1) #define SCHEDULER_MAX_TASK (3) 15 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Scheduler.h typedef data struct { void (code * ptask) (void); unsigned char period ; unsigned char count ; unsigned char runMe; } taskStructType; void schedulerGotoSleep(void); void schedulerInit(void); void schedulerStart(void); unsigned char schedulerAddTask(void (code * pfunction)() , const unsigned char period, const unsigned char count ); void schedulerDispatch(void); #endif 16 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 8
  9. Scheduler.c #define SCHEDULER_GLOBAL #include "scheduler.h" unsigned char errorCode; 17 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Kh i t o scheduler void schedulerInit() { unsigned char i; for (i=0;i> 8); TL0 = ((65536 - 50000) &0xFF); ET0 = 1; TR0 = 1; } 18 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 9
  10. C p nh t tr ng thái tác v void schedulerUpdate(void) interrupt 1 using 0 { unsigned char i; TR0 = 0; TF0 = 0; TH0 = ((65536 - 50000) >> 8); TL0 = ((65536 - 50000) &0xFF); TR0 = 1; for (i=0; i< SCHEDULER_MAX_TASK; i++) if (schedulerTask[i].ptask) { if (--schedulerTask[i].count == 0) { schedulerTask[i].runMe += 1; schedulerTask[i].count = schedulerTask[i].period; } } } 19 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Thêm tác v vào scheduler unsigned char schedulerAddTask(void (code * pfunction)() , const unsigned char period, const unsigned char count ) { unsigned char i; while ((schedulerTask[i].ptask != 0) && (i < SCHEDULER_MAX_TASK)) i++; if (i == SCHEDULER_MAX_TASK) { errorCode = ERROR_TOO_MANY_TASK; return SCHEDULER_MAX_TASK; } schedulerTask[i].ptask = pfunction; schedulerTask[i].period = period; schedulerTask[i].count = count + 1; schedulerTask[i].runMe = 0; return i; } 20 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 10
  11. Dispatcher void schedulerDispatch() { unsigned char i; for (i=0;i 0) { (*schedulerTask[i].ptask)(); schedulerTask[i].runMe -= 1; } } schedulerGotoSleep(); } 21 BM K Thu t ði n T - ðH Bách Khoa TP.HCM void schedulerStart() { EA = 1; } void schedulerGotoSleep() { PCON |= 0x01; } 22 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 11
  12. main.c #include "scheduler.h" void BlinkLED() { P1 ^= 0x01; } void main(void) { schedulerInit(); schedulerAddTask(BlinkLED,20,0); schedulerStart(); while (1) { schedulerDispatch(); } } 23 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Triggered task ðôi khi, m t tác v ñư c cho phép b i 1 tác ñ ng t bên ngoài. VD: ðèn giao thông có th ñư c ñi u khi n b ng tay dùng các nút b m. Tác v có th ñư c thi t k b ng cách l y m u tín hi u vào m i khi ñư c g i. ð tăng t c ñ ñáp ng h th ng, tác v có th ñư c cho phép ch y b ng cách dùng ng t (trong trư ng h p này là ng t ngoài). 24 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 12
  13. Triggered task void extISR0(void) interrupt 0 using 0 { schedulerTask[0].runMe = 1; schedulerTask[0].count = schedulerTask[0].period; } 25 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Non-preemptive kernel Nh ng h ñi u hành gi ng như trên g i là non- preemptive kernel. Tác v ph i t tr quy n ñi u khi n CPU cho h ñi u hành. Các “event” b t ñ ng b ñư c ñi u khi n b i ISR. M t ISR có th làm 1 tác v có ñ ưu tiên cao s n sàng ch y nhưng ch khi nào tác v hi n hành ch m d t, tác v này m i ñư c ch y. 26 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 13
  14. Non-preemptive kernel 27 BM K Thu t ði n T - ðH Bách Khoa TP.HCM Question S a scheduler trên như th nào ñ h tr m c ñ ưu tiên cho tác v ? 28 BM K Thu t ði n T - ðH Bách Khoa TP.HCM 14
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2