Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 17: ARM Xử lý ngoại lệ và các ngắt mềm (SWI) của ARM

 

Phác thảo bài học
• Con trỏ khung và cấu trúc “backtrace”.
• Luồng chương trình bình thường so với các ngoại lệ.
– Các ngoại lệ so với ngắt.
• Các ngắt mềm
– SWI là gì?
– Điều gì xảy ra trên một SWI?
– Vector hóa các SWI.
– Điều gì xảy ra khi hoàn tất SWI?
– SWI thực hiện điều gì?
– Trình xử lý SWI đầy đủ.
– Trình xử lý C_SWI_Handler (được viết bằng C).
• Nạp bảng vector ngắt mềm (software interrupt vector tab

pdf 25 trang thamphan 27/12/2022 1560
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 17: ARM Xử lý ngoại lệ và các ngắt mềm (SWI) của ARM", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_giang_vi_xu_ly_nang_cao_phan_1_thiet_ke_cpu_risc_bai_17.pdf
  • pptLec17.ppt

Nội dung text: Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 17: ARM Xử lý ngoại lệ và các ngắt mềm (SWI) của ARM

  1. Bài giảng “Vi xử lý nâng cao” Phần 3: Giới thiệu chip ARM Bài 17: ARM Xử lý ngoại lệ và các ngắt mềm (SWI) của ARM Giới thiệu hệ thống nhúng 1
  2. Tóm tắt bài trước • Mô hình đối với người lập trình ARM. • Giới thiệu ngôn ngữ hợp dịch của ARM. • Mã hợp dịch từ các chương trình C (7 thí dụ). • Xử lý các cấu trúc. • Giao diện mã C với hợp ngữ của ARM. • Các thư viện ARM và armsd . Giới thiệu hệ thống nhúng 3
  3. Con trỏ khung address SP 0x90 • fp trỏ đến đỉnh của vùng stack đối với trước (saved) pc hàm hiện hành. FP hiện hành 0x8c – Hoặc bằng 0 nếu không được sử dụng. (saved) lr 0x88 • Bằng cách sử dụng con trỏ khung và (saved) sb 0x84 lưu con trỏ này ở cùng offset đối với mỗi (saved) ip 0x80 lời gọi hàm, con trỏ tạo ra danh sách (saved) fp 0x7c liên kết từng cái một của các bản ghi v7 0x78 kích hoạt (activation records). v6 – Thanh ghi fp trỏ đến cấu trúc backtrace 0x74 của stack đối với hàm hiện đang được v5 0x70 thực thi. v4 0x6c – Giá trị fp được lưu (saved fp) là (zero hoặc ) v3 0x68 con trỏ đến cấu trúc backtrace của stack được tạo ra bởi hàm, hàm này gọi hàm v2 0x64 hiện hành. v1 0x60 – Giá trị fp được lưu (saved fp) trong cấu a4 0x5c trúc này là con trỏ đến cấu trúc backtrace của stack đối với hàm gọi hàm a3 0x58 mà hàm này gọi hàm hiện hành, và tiếp a2 0x54 tục trở lại cho đến hàm đầu tiên. a1 0x50 SP hiện hành Giới thiệu hệ thống nhúng 5
  4. Tạo cấu trúc “backtrace” MOV ip, sp address STMFD sp!,{a1a4,v1v5,sb,fp,ip,lr,pc} SP trước 0x90 (saved) pc SUB fp, ip, #4 FP sau 0x8c (saved) lr 0x88 (saved) sb 0x84 LDMFD fp, {fp,sp,sb,pc} (saved) ip 0x80 (saved) fp 0x7c v7 0x78 v6 0x74 v5 0x70 v4 0x6c v3 0x68 v2 0x64 v1 0x60 a4 0x5c a3 0x58 a2 0x54 a1 0x50 SP hiện hành Giới thiệu hệ thống nhúng 7
  5. Các chế độ của bộ xử lý ARM • User : chế độ thực thi chương trình “bình thường”. • IRQ: được sử dụng cho việc xử lý ngắt mục đích tổng quát . • Supervisor : chế độ bảo vệ đối với hệ điều hành . –(còn có các chế độ Abort, FIQ và Undef). Tập thanh ghi của ARM • Các thanh ghi R0-R15 + CPSR (thanh ghi trạng thái chương trình hiện hành). – R13 : Con trỏ stack (stack pointer) (theo qui ước). – R14 : Thanh ghi liên kết (link register) (nối dây cứng). – R15 : Bộ đếm chương trình (program counter) trong đó các bit 0:1 được bỏ qua (nối dây cứng). Giới thiệu hệ thống nhúng 9
  6. SWI thực hiện điều gì ? • Các SWI ( thường được gọi là các bẫy mềm) cho phép chương trình của người sử dụng “gọi” OS nghĩa là, các SWI là cách thức mà các lời gọi hệ thống được thực hiện. • Khi các SWI thực thi , bộ xử lý thay đổi các chế độ (từ chế độ User thành Supervisor trên ARM), không cho phép các ngắt . • Các loại SWI trong ARM Angel ( axd hoặc armsd ) – SWI_WriteC(SWI 0) Ghi một byte đến kênh gỡ lỗi. – SWI_Write0(SWI 2) Ghi chuỗi kết thúc rỗng đến kênh gỡ lỗi. – SWI_ReadC(SWI 4) Đọc một byte từ kênh gỡ lỗi. – SWI_Exit(SWI 0x11) Dừng mô phỏng đây là cách thức một chương trình tồn tại. – SWI_EnterOS(SWI 0x16) Đặt bộ xử lý ở chế độ supervisor. – SWI_Clock(SWI 0x61) Trả về số 1/100 giây. – SWI_Time(SWI 0x63) Trả về số giây từ Jan. 1, 1970. • Đọc thêm chương 17 của sách JumpStart Reference Manual. – Xem các sách được khuyến cáo. Giới thiệu hệ thống nhúng 11
  7. Điều gì xảy ra trên một SWI? (2) • Không đủ không gian trong bảng (chỉ một lệnh cho một điểm nhập) để lưu toàn bộ mã cho hàm của trình xử lý SWI . • Mỗi lệnh này phải chuyển điều khiển đến trình xử lý SWI 2 thích hợp. • Vài tùy chọn được giới thiệu trong slide kế. Bảng vector (spring board ) bắt đầu ở 0x00 trong bộ nhớ. Chương trình USER 0x00 to R_Handler (Reset ADD r0,r0,r1 0x04 to U_Handler (Undef instr.) 2 Trình xử lý SWI SWI 0x10 0x08 to S_Handler (SWI) SUB r2,r2,r0 0x0c to P_Handler (Prefetch abort) 0x10 to D_Handler (Data abort) 0x14 (Reserved) 0x18 to I_Handler (IRQ) 0x1c to F_Handler (FIQ) Giới thiệu hệ thống nhúng 13
  8. Điều gì xảy ra khi hoàn tất SWI? • Vector hóa để S_Handler bắt đầu thực thi trình xử lý SWI. • Khi trình xử lý thực hiện xong , ta quay trở về chương trình ở lệnh theo sau SWI . • MOVS khôi phục CPSR ban đầu cũng như thay đổi pc.3 Bảng vector (spring board ) bắt đầu ở 0x00 trong bộ nhớ. Chương trình USER 0x00 to R_Handler (Reset Trình xử lý SWI ADD r0,r0,r1 0x04 to U_Handler (Undef instr.) (S_Handler ) SWI 0x10 0x08 to S_Handler (SWI) SUB r2,r2,r0 0x0c to P_Handler (Prefetch abort) 0x10 to D_Handler (Data abort) 0x14 (Reserved) 0x18 to I_Handler (IRQ) 0x1c to F_Handler (FIQ) 3 MOVS pc, lr Giới thiệu hệ thống nhúng 15
  9. Khuôn dạng lệnh của SWI • Thí dụ: SWI 0x18 31 28 27 24 23 0 cond 1 1 1 1 Trường “comment” 24-bit (bộ vi xử lý bỏ qua) SWI number Giới thiệu hệ thống nhúng 17
  10. Sử dụng SWI # để nhảy đến “trình phục vụ” Trên SWI, bộ xử lý cond 1 1 1 1 24-bit “comment” field (ignored by processor) • (1) sao chép CPSR đến SPSR_SVC • (2) thiết lập các bit chế độ CPSR đến chế độ supervisor. • (3) thiết lập CPSR IRQ để không cho phép. • (4) lưu giá trị (PC + 4) vào trong LR_SVC. • (5) buộc PC đến 0x08. Bảng vector (spring board ) bắt đầu ở 0x00 trong bộ nhớ. Trình xử lý SWI Chương trình USER 0x00 to R_Handler (Reset S_Handler ADD r0,r0,r1 0x04 to U_Handler (Undef instr.) ( ) SWI 0x 10 0x08 to S_Handler (SWI) LDR r0,[lr,#4] SUB r2,r2,r0 0x0c to P_Handler (Prefetch abort) BIC r0,r0,#0xff000000 0x10 to D_Handler (Data abort) 0x14 (Reserved) switch (r0){ case 0x00: service_SWI1(); 0x18 to I_Handler (IRQ) case 0x01: service_SWI2(); 0x1c to F_Handler (FIQ) case 0x02: service_SWI3(); } MOVS pc, lr Giới thiệu hệ thống nhúng 19
  11. Trình xử lý SWI đầy đủ S_Handler SUB sp,sp, #4 ; dành khoảng trống trên stack cho SPSR. STMFD sp!, {r0r12, lr} ; lưu các thanh ghi gp của người sử dụng. MRS r2, spsr[_csxf] ; đưa SPSR vào trong các thanh ghi gp. STR r2, [sp, #14*4] ; lưu SPSR bên trên các thanh ghi gp. MOV r1, sp ; con trỏ đến các thông số trên stack . LDR r0, [lr, #4] ; trích số của SWI (SWI number). BIC r0,r0,#0xff000000 ; lấy SWI # bằng cách lập mặt nạ bit. BL C_SWI_handler ; đi đến trình xử lý (xem slide kế). LDR r2, [sp, #14*4] ; khôi phục SPSR (NOT “sp!”) MSR spsr_csxf, r2 ; các cờ csxf ( xem XScale QuickRef Card) LDMFD sp!, {r0r12, lr} ; đưa các thanh ghi của người sử dụng ra khỏi stack. ADD sp, sp, #4 ; giải phóng không gian dùng lưu SPSR . MOVS pc, lr ; trở về từ trình xử lý. SPSR được lưu bên trên các thanh ghi gp vì gp = mục đích tổng quát các thanh ghi này có thể chứa các thông số của lời gọi hệ thống (sp trong r1 ). Giới thiệu hệ thống nhúng 21
  12. Nạp bảng vector /* For 18-349, the Vector Table will use the ``LDR PC, PC, * offset'' springboard approach */ unsigned Install_Handler(unsigned int routine, unsigned int *vector) { unsigned int pcload_instr, old_handler, *soft_vector; pcload_instr = *vector; /* read the Vector Table instr (LDR ) */ pcload_instr &= 0xfff; /* compute offset of jump table entry */ pcload_instr += 0x8 + (unsigned)vector; /* == offset adjusted by PC and prefetch */ soft_vector = (unsigned *)pcload_instr; /* address to load pc from */ old_handler = *soft_vector; /* remember the old handler */ *soft_vector = routine; /* set up new handler in jump table */ return (old_handler); /* return old handler address */ } /* end Install_Handler() */ Called as Install_Handler ((unsigned) C_SWI_Handler, swivec); where, unsigned *swivec = (unsigned *) 0x08; Giới thiệu hệ thống nhúng 23
  13. Tóm tắt bài học • Các ngắt mềm (SWI) – SWI là gì ? – Điều gì xảy ra trên một SWI? – Vector hóa các SWI. – Điều gì xảy ra khi hoàn tất SWI? – SWI thực hiện điều gì ? – Trình xử lý SWI đầy đủ. – C_SWI_Handler (được viết bằng C). • Nạp các vector ngắt mềm (software interrrupt vector). Giới thiệu hệ thống nhúng 25