Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình

Tổng quan

• Mô hình vs Ngôn ngữ

• Mô hình trạng thái

– FSM/FSMD

– HCFSM và ngôn ngữ biểu đồ

– Mô hình trạng thái lập trình (Program-State Machine (PSM) Model)

• Mô hình quá trình đồng thời

– Truyền thông

– Đồng bộ

– Thực hiện

• Mô hình luồng dữ liệu

• Các hệ thời gian thực

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 1

Trang 1

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 2

Trang 2

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 3

Trang 3

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 4

Trang 4

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 5

Trang 5

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 6

Trang 6

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 7

Trang 7

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 8

Trang 8

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 9

Trang 9

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 33 trang xuanhieu 980
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình

Bài giảng Thiết kế hệ thống nhúng - Chương 4: Kỹ thuật lập trình nhúng - Bài 8: Biểu diễn trạng thái và mô hình hóa quá trình
 nghi hay thay đổi
 • Phải đầu tƣ
• Hai phƣơng pháp để mô tả mô hình trạng thái máy với ngôn ngữ lập trình tuần tự
 – Phƣơng pháp công cụ hỗ trợ
 • Công cụ bổ sung đƣợc cài đặt để hỗ trợ ngôn ngữ trạng thái máy
 – Đồ họa
 – Có thể hỗ trợ mô phỏng đồ họa
 – Tự động tạo ra code trong ngôn ngữ lập trình tuần tự là đầu vào cho các công cụ phát triển chính
 • Hạn chế: phải hỗ trợ các công cụ bổ sung (giá bản quyền, nâng cấp, đào tạo, vv.)
 – Phƣơng pháp ngôn ngữ tập con
 • Phƣơng pháp thông dụng nhất...
 16
 Phƣơng pháp ngôn ngữ tập con
• Tuân theo các quy tắc (mẫu) để mô tả 
 cấu trúc trạng thái máy trong cấu trúc #define IDLE0
 ngôn ngữ tuần tự tƣơng đƣơng #define GOINGUP1
 #define GOINGDN2
• Đƣợc sử dụng với phần mềm (VD: C) #define DOOROPEN3
 và ngôn ngữ phần cứng (VD: VHDL) void UnitControl() {
 int state = IDLE;
• Mô tả trạng thái máy UnitControl bằng while (1) {
 switch (state) {
 C IDLE: up=0; down=0; open=1; timer_start=0;
 – Liệt kê các trạng thái (#define) if (req==floor) {state = IDLE;}
 if (req > floor) {state = GOINGUP;}
 – Khai báo các biến trạng thái, khởi tạo if (req < floor) {state = GOINGDN;}
 giá trị đầu (IDLE) break;
 GOINGUP: up=1; down=0; open=0; timer_start=0;
 – Câu lệnh chuyển mạch đơn rẽ nhánh if (req > floor) {state = GOINGUP;}
 tới trạng thái hiện tại if (!(req>floor)) {state = DOOROPEN;} 
 – Mỗi trƣờng hợp có các hoạt động break;
 GOINGDN: up=1; down=0; open=0; timer_start=0;
 • up, down, open, timer_start if (req < floor) {state = GOINGDN;}
 – Mỗi trƣờng hợp kiểm tra điều kiện if (!(req<floor)) {state = DOOROPEN;} 
 chuyển để xác định trạng thái tiếp theo break;
 DOOROPEN: up=0; down=0; open=1; timer_start=1;
 • if() {state = ;} if (timer < 10) {state = DOOROPEN;}
 if (!(timer<10)){state = IDLE;}
 break;
 }
 }
 }
 Trạng thái máy UnitControl trong ngôn ngữ lập trình tuần tự
 17
 Mẫu chung
#define S0 0
#define S1 1
...
#define SN N
void StateMachine() {
 int state = S0; // or whatever is the initial state.
 while (1) {
 switch (state) {
 S0: 
 // Insert S0’s actions here & Insert transitions Ti leaving S0:
 if( T0’s condition is true ) {state = T0’s next state; /*actions*/ }
 if( T1’s condition is true ) {state = T1’s next state; /*actions*/ }
 ...
 if( Tm’s condition is true ) {state = Tm’s next state; /*actions*/ }
 break;
 S1:
 // Insert S1’s actions here
 // Insert transitions Ti leaving S1
 break;
 ...
 SN:
 // Insert SN’s actions here
 // Insert transitions Ti leaving SN
 break;
 }
 }
}
 18
 HCFSM và ngôn ngữ biểu đồ trạng thái
• Mô hình trạng thái máy phân 
 cấp/đồng thời 
 (Hierarchical/concurrent state Without hierarchy With hierarchy
 A
 machine model - HCFSM) A1 z
 A1 z
 x w
 – Mở rộng mô hình trạng thái máy để y B x
 y w B
 hỗ trợ phân cấp và đồng thời A2 z
 A2
 – Các trạng thái có thể tách thành các 
 trạng thái máy khác
 – Các trạng thái có thể thực hiện đồng Concurrency
 thời
 B
• Biểu đồ trạng thái C D
 – Ngôn ngữ đồ họa để mô tả HCFSM C1 D1
 x y u v
 – timeout: chuyển trạng thái với giới 
 hạn thời gian nhƣ là một điều kiện C2 D2
 19
 UnitControl với FireMode
 req>floor
 UnitControl • FireMode 
 u,d,o = 1,0,0 GoingUp
 !(req>floor)
 req>floor – Khi fire đúng, di chuyển thang 
u,d,o = 0,0,1 timeout(10) st
 Idle DoorOpen u,d,o = 0,0,1 máy tới tầng 1 và mở cửa
 req==floor fire
 req<floor !(req<floor) fire
 fire – w/o hierarchy: Getting messy!
u,d,o = 0,1,0 FireGoingDn u,d,o = 0,1,0
 GoingDn fire
 floor==1 u,d,o = 0,0,1 – w/ hierarchy: Simple!
 req1 FireDrOpen
 !fire fire Có phân cấp
 Không phân cấp UnitControl
 req>floor NormalMode
 u,d,o = 1,0,0 GoingUp
 !(req>floor)
 req>floor
 ElevatorController u,d,o = 0,0,1
 Idle DoorOpen u,d,o = 0,0,1
 UnitControl RequestResolver req==floor timeout(10)
 reqfloor)
 NormalMode
 u,d,o = 0,1,0 GoingDn
 ...
 !fire fire req<floor
 FireMode
 fire FireMode
 FireGoingDn u,d,o = 0,1,0
 !fire
 floor==1 u,d,o = 0,0,1
 Xử lý đồng thời với floor>1 FireDrOpen
 RequestResolver fire
 20
 Mô hình trạng thái máy – chƣơng trình 
 (PSM): HCFSM + mô hình lập trình tuần tự
• Các hoạt động của trạng thái chƣơng trình có thể ElevatorController
 int req;
 là FSM hoặc chƣơng trình tuần tự UnitControl RequestResolver
 – Ngƣời thiết kế chọn kiểu thích hợp nhất NormalMode
 up = down = 0; open = 1; ...
• Phân cấp hạn chế hơn HCFSM sử dụng trong while (1) { req = ...
 while (req == floor); ...
 biểu đồ trạng thái open = 0;
 if (req > floor) { up = 1;}
 – Chỉ chuyển trạng thái giữa các trạng thái cạn kề, else {down = 1;}
 đầu vào đơn while (req != floor);
 open = 1;
 – Trạng thái – chƣơng trình có thể “hoàn thiện” delay(10);
 • Đạt đến cuối của chƣơng trình tuần tự, hoặc }
 !fire} fire
 • FSM chuyển tới trạng thái con hoàn thiện FireMode
 • PSM có hai kiểu chuyển up = 0; down = 1; open = 0;
 – Chuyển trực tiếp (TI): xảy ra bất kể trạng thái của while (floor > 1);
 chƣơng trình nguồn up = 0; down = 0; open = 1;
 – Chuyển khi hoàn thành (TOC): xảy ra nếu điều kiện 
 đúng và chƣơng trình nguồn kết thúc
 – Biểu đồ đặc biệt: mở rộng của VHDL để mô tả 
 mô hình PSM
 – C đặc biệt: mở rộng của C để mô tả mô hình PSM
 21
 Vai trò của việc chọn ngôn ngữ và mô hình thích 
 hợp
• Tìm mô hình thích hợp để biểu diễn hệ nhúng là một bƣớc quan trọng
 – Mô hình sẽ ảnh hƣởng đến cách chúng ta nhìn hệ thống
 • Ban đầu chúng ta nghĩ về chuỗi các hoạt động, viết chƣơng trình tuần tự
 – Trƣớc tiên đợi lệnh gọi tầng 
 – Sau đó, đóng cửa
 – Sau đó, di chuyển lên hay xuống đến tầng yêu cầu
 – Rồi mở cửa
 – Rồi lặp lại tuần tự này
 • Để tạo ra trạng thái máy, chúng ta nghĩ theo khía cạnh các trạng thái và sự chuyển đổi giữa chúng
 – Khi hệ phải phản ứng lại với các đầu vào thay đổi, trạng thái máy là mô hình tốt nhất
 • HCFSM mô tả FireMode một cách dễ dàng và rõ ràng
• Ngôn ngữ nên mô tả mô hình dễ dàng
 – Về lý tƣởng, nên có các đặc điểm mô tả trực tiếp cấu trúc của mô hình
 – FireMode sẽ rất phức tạp trong chƣơng trình tuần tự
 • Xem lại code
 – Các yếu tố khác có thể ảnh hƣởng đến việc chọn lựa mô hình
 • Các kỹ thuật cấu trúc có thể sử dụng để thay thế
 – VD: Các nhãn để mô tả trạng thái máy trong chƣơng trình tuần tự
 22
 Mô hình quá trình đồng thời
 • Mô tả chức năng của hệ theo khía cạnh của hai hoặc 
 nhiều tác vụ thực hiện đồng thời
 ConcurrentProcessExample() {
 x = ReadX() • Nhiều hệ thống dễ hơn để mô tả với mô hình quá 
 y = ReadY()
 Call concurrently: trình đồng thời bởi vì tính chất đa tác vụ của nó
 PrintHelloWorld(x) and 
 PrintHowAreYou(y)
 } • Ví dụ đơn giản:
 PrintHelloWorld(x) {
 while( 1 ) { – Đọc hai số X và Y
 print "Hello world."
 delay(x); – Hiển thị “Hello world.” sau mỗi X giây
 } 
 } – Hiển thị “How are you?” sau mỗi Y giây
 PrintHowAreYou(x) {
 while( 1 ) {
 print "How are you?" 
 delay(y);
 } Enter X: 1
 } Enter Y: 2
 Hello world. (Time = 1 s)
 PrintHelloWorld
 Hello world. (Time = 2 s)
Ví dụ quá trình đồng thời đơn giản ReadX ReadY How are you? (Time = 2 s)
 Hello world. (Time = 3 s)
 PrintHowAreYou
 How are you? (Time = 4 s)
 Hello world. (Time = 4 s)
 time ...
 Chương trình thực hiện Đầu vào và đầu ra mẫu
 23
Quá trình đồng thời và các hệ thời gian thực
 24
 Quá trình đồng thời
• Xem xét hai ví dụ có các Heartbeat Monitoring System
 Task 1: Task 2:
 B[1..4]
 Read pulse If B1/B2 pressed then
 tác vụ chạy độc lập If pulse < Lo then Lo = Lo +/– 1
 Activate Siren If B3/B4 pressed then
 nhƣng chia sẻ dữ liệu If pulse > Hi then Hi = Hi +/– 1
 Heart-beat Activate Siren Sleep 500 ms
 pulse Sleep 1 second Repeat
• Khó để viết sử dụng mô Repeat
 hình lập trình tuần tự
• Mô hình quá trình đồng 
 thời dễ hơn Set-top Box
 Task 1: Task 2:
 – Các chƣơng trình tuần tự Read Signal Wait on Task 1
 Separate Audio/Video Decode/output Audio Video
 Send Audio to Task 2 Repeat
 riêng cho các tác vụ Input Send Video to Task 3
 Signal Repeat Task 3: Audio
 – Các chƣơng trình trao đổi Wait on Task 1
 Decode/output Video
 thông tin với nhau Repeat
 25
 Quá trình
• Một chƣơng trình tuần tự, thƣờng là vòng lặp vô hạn
 – Thực hiện đồng thời với các quá trình khác
 – Chúng ta đang bƣớc vào thế giới “lập trình đồng thời”
• Các hoạt động chính của quá trình
 – Khởi tạo và kết thúc
 • Khởi tạo giống một thủ tục gọi, nhƣng bên gọi không đợi
 – Quá trình đƣợc khởi tạo có thể chính nó tạo ra các quá trình mới
 • Kết thúc chấm dứt một quá trình, loại bỏ các dữ liệu
 • Trong ví dụ HelloWord/HowAreYou, chúng ta chỉ khởi tạo quá trình
 – Dừng và phục hồi
 • Dừng là đƣa quá trình vào trạng thái giữ, lƣu trữ trạng thái cho việc thực 
 hiện sau đó
 • Phục hồi khởi đầu lại quá trình từ điểm nó đƣợc dừng
 – Liên kết
 • Một quá trình dừng cho đến khi một quá trình con đƣợc kết thúc
 26
 Thông tin giữa các quá trình
• Các quá trình cần trao đổi dữ liệu và tín hiệu Encoded video 
 để giải quyết vấn đề tính toán của chúng packets
 processA() {
 – Các quá trình không thông tin là các chƣơng trình // Decode packet
 // Communicate packet 
 độc lập giải quyết các vấn đề độc lập to B
 }
• Ví dụ cơ bản: producer/consumer }
 – Quá trình A tạo ra dữ liệu, quá trình B sử dụng 
 chúng Decoded video 
 – VD: A giải mã các gói video, B hiển thị các gói packets
 void processB() {
 đƣợc giải mã trên màn hình // Get packet from A
 // Display packet
• Làm thế nào để đạt đƣợc quá trình thông tin }
 này?
 – Hai phƣơng pháp cơ bản
 • Chia sẻ bộ nhớ To display
 • Chuyển tin
 27
 Chia sẻ bộ nhớ
• Các quá trình đọc và ghi các biến đƣợc chia sẻ 01: data_type buffer[N];
 02: int count = 0;
 – Không mất thời gian, dễ thực hiện 03: void processA() {
 04: int i;
 – Nhƣng hay bị lỗi 05: while( 1 ) {
 06: produce(&data);
• Ví dụ: Producer/consumer với một lỗi 07: while( count == N );/*loop*/
 – Chia sẻ buffer[N], count 08: buffer[i] = data;
 09: i = (i + 1) % N;
 • count = # số dữ liệu trong buffer
 10: count = count + 1;
 – processA tạo dữ liệu và lƣu trong buffer 11: }
 • Nếu buffer đầy, phải đợi 12: }
 13: void processB() {
 – processB sử dụng dữ liệu trong buffer 14: int i;
 • Nếu buffer trống, phải đợi 15: while( 1 ) {
 – Lỗi xảy ra khi cả hai quá trình cập nhật count đồng thời (dòng 10 và 19) và 16: while( count == 0 );/*loop*/
 tuần tự thực hiện sau xảy ra. “count” là 3. 17: data = buffer[i];
 18: i = (i + 1) % N;
 • A nạp count (count = 3) từ bộ nhớ vào thanh ghi R1 (R1 = 3) 19: count = count - 1;
 • A tăng R1 (R1 = 4) 20: consume(&data);
 • B nạp count (count = 3) từ bộ nhớ vào thanh ghi R2 (R2 = 3) 21: }
 • B giảm R2 (R2 = 2) 22: }
 23: void main() {
 • A lƣu R1 trở lại count trong bộ nhớ (count = 4) 24: create_process(processA); 
 • B lƣu R2 trở lại count trong bộ nhớ (count = 2) 25: create_process(processB);
 – count có giá trị không đúng là 2 26: }
 28
 Chuyển tin
• Chuyển tin
 void processA() {
 – Dữ liệu đƣợc gửi thẳng từ một quá trình tới while( 1 ) {
 produce(&data)
 quá trình khác send(B, &data);
 /* region 1 */
 • Quá trình gửi thực hiện hoạt động đặc biệt, receive(B, &data);
 consume(&data);
 send }
 }
 • Quá trình thu thực hiện hoạt động đặc biệt, 
 void processB() {
 receive, để thu dữ liệu while( 1 ) {
 receive(A, &data);
 transform(&data)
 • Cả hai hoạt động phải chỉ ra quá trình nào gửi send(A, &data);
 /* region 2 */
 hoặc nhận }
 • Thu theo gói, gửi có thể hoặc không thể theo }
 gói
 – Mô hình này an toàn hơn, nhƣng kém linh 
 hoạt
 29
 Mô hình quá trình đồng thời: 
 Thực hiện
• Có thể sử dụng bộ xử lý chức năng đơn hay chung 
 (SPP/GPP)
• (a) Nhiều bộ xử lý, mỗi bộ xử lý thực hiện một quá Processor A
 Process1
 trình Processor B
 Process2
 – Đa nhiệm đúng nghĩa (xử lý song song) (a) Process3 Processor C
 – Bộ xử lý chức năng chung Process4
 Processor D
 • Sử dụng ngôn ngữ lập trình nhƣ C và biên dịch thành các Bus Communication
 lệnh cho bộ xử lý
 • Đắt, trong nhiều trƣờng hợp không cần thiết
 – Bộ xử lý chức năng đơn chuyên dụng Process1
 Process2
 • Hay dùng hơn General Purpose 
 (b) Process3 Processor
• (b) Một bộ xử lý chức năng chung chạy tất cả các Process4
 quá trình
 – Đa số các quá trình không sử dụng 100% thời gian của 
 bộ xử lý
 – Có thể chia sẻ thời gian của bộ xử lý và vẫn đạt đƣợc Processor A
 mục đích Process1
• (c) Kết hợp (a) và (b) Process2 General 
 (c) Process3 Purpose 
 – Nhiều quá trình chạy trên một bộ xử lý chức năng Process4 Processor
 chung trong khi đó một vài quá trình sử dụng bộ xử lý Bus Communication
 chức năng đơn chuyên dụng
 30
 Thực hiện
• Quá trình đƣa các chức năng của 
 Lựa chọn mô hình 
 hệ lên phần cứng của bộ xử lý: tính toán dựa trên 
 State Sequent. Data- Concurrent khả năng cho phép 
 – Mô tả sử dụng mô hình tính machine program flow processes ngƣời thiết kế mô 
 toán(s) tả hệ thống.
 – Viết bằng một số ngôn ngữ(s)
• Lựa chọn thực hiện độc lập với 
 Lựa chọn ngôn 
 lựa chọn ngôn ngữ ngữ dựa trên khả 
 Pascal C/C++ Java VHDL năng mô tả mô 
• Lựa chọn thực hiện dựa trên công hình tính toán 
 đƣợc sử dụng bởi 
 suất, kích thƣớc, chất lƣợng, thời ngƣời thiết kế.
 gian và giá thành yêu cầu
• Thực hiện cuối cùng cần đƣợc Lựa chọn thực hiện 
 dựa trên khả năng 
 kiểm tra tính khả thi về công suất, kích 
 Implementation A Implementation Implementation thƣớc, chất lƣợng, 
 – Là bản thử nghiệm cho việc sản B C giá thành yêu cầu.
 xuất hàng loạt sản phẩm cuối 
 cùng
 31
 Thực hiện: 
 Nhiều quá trình chia sẻ một bộ xử lý
• Có thể viết lại các quá trình nhƣ là một chƣơng trình tuần tự
 – Thực hiện đƣợc với các trƣờng hợp đơn giản, nhƣng rất khó với các trƣờng hợp phức tạp
 – Kỹ thuật tự động đã ra đời nhƣng không thông dụng
 – VD: cƣơng trình đồng thời Hello World có thể viết:
 I = 1; T = 0;
 while (1) {
 Delay(I); T = T + 1;
 if X modulo T is 0 then call PrintHelloWorld
 if Y modulo T is 0 then call PrintHowAreYou
 }
• Có thể dùng hệ điều hành đa nhiệm
 – Thông dụng hơn
 – Hệ điều hành lập lịch cho các quá trình, định vị bộ nhớ, giao diện ngoại vi, etc.
 – Hệ điều hành thời gian thực (RTOS) có thể thực hiện điều đó
 – Mô tả các quá trình đồng thời với ngôn ngữ có các quá trình built-in (Java, Ada, etc.) hoặc 
 một ngôn ngữ lập trình tuần tự với các thƣ viện hỗ trợ các quá trình (C, C++, etc)
• Có thể biến đổi các quá trình thành chƣơng trình tuần tự với lập lịch trong code
 – Ít tốn bộ nhớ (không cần OS)
 – Chƣơng trình phức tạp hơn
 32
 Tóm tắt
• Mô hình tính toán khác với ngôn ngữ
• Mô hình lập trình tuần tự là phổ biến
 – Ngôn ngữ phổ thông nhất nhƣ là C 
• Mô hình trạng thái máy tốt cho điều khiển
 – Các mở rộng nhƣ HCFSM cung cấp thêm nhiều chức năng
 – PSM kết hợp trạng thái máy và chƣơng trình tuần tự
• Mô hình quá trình đồng thời sử dụng cho các hệ thống nhiều tác 
 vụ
 – Tồn tại truyền thông và phƣơng pháp đồng bộ
 – Lập lịch là rất quan trọng
• Mô hình tuyến dữ liệu tốt cho xử lý tín hiệu
 33

File đính kèm:

  • pdfbai_giang_thiet_ke_he_thong_nhung_chuong_4_ky_thuat_lap_trin.pdf