Lập trình hệ thống nhúng
lượt xem 58
download
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
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Lập trình hệ thống nhúng
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Giáo trình thực hành Lập trình hệ thống - Nguyễn Hứa Duy Khang vs Trần Hữu Danh
39 p | 1511 | 624
-
Giáo trình Hệ thống nhúng
28 p | 1294 | 414
-
Giáo trình Lập trình hệ thống máy tính - Phạm Hùng Kim Khánh
130 p | 649 | 215
-
Bài giảng Lập trình hệ thống nhúng sử dụng vi điều khiển MSP430 - TS. Lê Mạnh Hải
120 p | 312 | 53
-
Lập trình hệ thống nhúng - Bùi Quốc Bảo
22 p | 249 | 39
-
Giáo trình Hệ thống nhúng: Phần 2
43 p | 118 | 29
-
Bài giảng Lập trình hệ thống nhúng - Bùi Quốc Bảo
34 p | 167 | 24
-
Đề tài Lập Trình Hệ Thống
6 p | 238 | 21
-
Lập trình hệ thống nhúng: delay sử dụng vòng lặp lệnh
11 p | 134 | 19
-
Bài giảng hệ thống nhúng - ĐH Kỹ Thuật Công Nghiệp
0 p | 135 | 18
-
Bài giảng Hệ thống nhúng: Phần 1 - Đậu Trọng Hiển
109 p | 62 | 16
-
Lập trình hệ thống nhúng: Top-down design
12 p | 133 | 15
-
Giáo trình Kiến trúc máy tính và quản lý hệ thống máy tính: Phần 1
104 p | 73 | 13
-
Bài giảng Lập trình hệ nhúng: Chương 7 - Phạm Ngọc Hưng
13 p | 81 | 10
-
Kỹ thuật điện tử và lập trình C: Phần 2
256 p | 12 | 9
-
Bài giảng Hợp ngữ và lập trình hệ thống: Chương 1 - Phạm Công Hòa
95 p | 99 | 6
-
Lập trình hệ thống mạng (Nguyễn Hữu Thể) - Mạng máy tính
17 p | 101 | 6
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn