T - Kernel - Tổng quan

Tài liệu T - Kernel - Tổng quan: T-KERNEL - TỔNG QUAN 102 Chương 1 TỔNG QUAN VỀ T-KERNEL 1.1 Vị trí của T-Kernel Vị trí của T-Kernel trong hệ thống T-Engine được mô tả như hình 1.1 phía dưới Hình 1.1: Vị trí của T-Kernel T-Kernel một cách tổng quát thì gồm có T-Kernel Operating System(T-Kernel/OS) , T-Kernel System Manager(T-Kernel/SM) và T-Kernel Debugger Suppor (T-Kernel/DS). Nhưng trong một số trường hợp(theo nghĩa hẹp) thì T-Kernel được hiểu là T-Kernel/OS. T-Kernel Operating System (T-Kernel/OS) cung cấp một số hàm chức năng sau: • Hàm điều khiển task • Hàm giao tiếp giữa các task • Hàm quản lý bộ nhớ • Hàm quản lý các Exception/interrupt • Hàm quản lý thời gian • Hàm quản lý Subsystem T-Kernel System Manager ( T-Kernel/SM) cung cấp một số hàm chức năng sau: • Hàm quản lý bộ nhớ của hệ thống • Hàm quản lý không gian địa chỉ • Hàm quản lý các thiết bị • Hàm quản lý các Interrupt • Hàm hỗ trợ truy xuất I/O • Hàm quản lý nguồn • Hàm quản lý các thông tin cấu hình của hệ ...

pdf179 trang | Chia sẻ: Khủng Long | Lượt xem: 998 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu T - Kernel - Tổng quan, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
T-KERNEL - TỔNG QUAN 102 Chương 1 TỔNG QUAN VỀ T-KERNEL 1.1 Vị trí của T-Kernel Vị trí của T-Kernel trong hệ thống T-Engine được mô tả như hình 1.1 phía dưới Hình 1.1: Vị trí của T-Kernel T-Kernel một cách tổng quát thì gồm có T-Kernel Operating System(T-Kernel/OS) , T-Kernel System Manager(T-Kernel/SM) và T-Kernel Debugger Suppor (T-Kernel/DS). Nhưng trong một số trường hợp(theo nghĩa hẹp) thì T-Kernel được hiểu là T-Kernel/OS. T-Kernel Operating System (T-Kernel/OS) cung cấp một số hàm chức năng sau: • Hàm điều khiển task • Hàm giao tiếp giữa các task • Hàm quản lý bộ nhớ • Hàm quản lý các Exception/interrupt • Hàm quản lý thời gian • Hàm quản lý Subsystem T-Kernel System Manager ( T-Kernel/SM) cung cấp một số hàm chức năng sau: • Hàm quản lý bộ nhớ của hệ thống • Hàm quản lý không gian địa chỉ • Hàm quản lý các thiết bị • Hàm quản lý các Interrupt • Hàm hỗ trợ truy xuất I/O • Hàm quản lý nguồn • Hàm quản lý các thông tin cấu hình của hệ thống GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - TỔNG QUAN 103 T-Kernel Debugger Support (T-Kernel/DS) cung cấp các hàm chức năng được sử dụng cho quá trình debugging: • Hàm tham khảo các trạng thái bên trong của Kernel • Trace 1.2 Scalability T-Kernel là một real-time kernel được sử dụng bởi các hệ thống nhúng , và có phạm vi ứng dụng rộng rãi từ các hệ thống lớn đến các hệ thống nhỏ. Mục tiêu nhắm tới của T-Kernel là nâng cao khả năng “khả chuyển” của các phần mềm như device driver và middleware. T-Kernel được thiết kế để có thể áp dụng được trên các hệ thống có qui mô lớn. Cách tiếp cận với những hệ thống được chỉ ra trước không còn được áp dụng nữa và việc định ra các hàm cụ thể cho các hệ thống như vậy sẽ gây ra nhiều khó khăn cho tính “khả chuyển” của device driver , middleware và các phần mềm khác.T-Kernel thì không đi theo cách tiếp cận như vậy và về mặt nguyên lý thì các hệ điều hành tương thích với T-Kernel thì phải hiện thực tất cả các đặc tả kĩ thuật của T-Kernel . Tuy nhiên, ở một hệ thống nào đó mà nó không cần tất cả các hàm của hệ điều hành thì các hàm đó có thể không cấn phải được hiện thực. Điều quan trọng ở đây là người sử dụng sẽ quyết định hàm nào sẽ không cần được hiện thực chứ không phải nhà cung cấp. - Đối với nhà cung cấp T-Kernel : • Tất cả những đặc tả kĩ thuật phải được hiện thực nhưng việc hiện thực “Scale- down” cho một hệ thống đích cụ thể thì được phép. “Scale-down” có nghĩa là nó không cung cấp tổng thể các hàm đặc tả của T-Kernel nhưng nó vẫn không có cách cư xử bất thường (return error , ) khi một hàm nào đó không được hiện thực mà được gọi . • Cung cấp cho người sử dụng các phương tiện cho phép người sử dụng có thể bỏ qua sự hiện thực các hàm không cần thiết - Đối với nhà cung cấp Middleware: • Middleware phải thiết kế để thỏa mãn tất cả các yêu cầu của T-Kernel . Nó không thể bị giới hạn bởi sự đặc tả của hệ thống đích nhưng nó phải có khả năng thích hợp với các hệ thống khác biệt nhau. • Cung cấp cho người sử dụng các phương tiện cho phép người sử dụng có thể bỏ qua sự hiện thực các hàm không cần thiết. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 104 Chương 2 NHỮNG KHÁI NIỆM CƠ BẢN CỦA T-KERNEL 2.1 Ý nghĩa của một số thuật ngữ cơ bản 2.1.1 Task, invoking task Đơn vị luận lí cơ bản của một chương trình đang thực thi được gọi là “task”. Những chương trình mà gán cho 1 task thì được thực thi một cách tuần tự còn những chương trình mà gán cho nhiều task thì được thực thi một cách song song. Khái niệm xử lý đồng thời chỉ tồn tại ở góc nhìn của người dùng , và thực sự thì các task này được thực hiện theo cơ chế time-sharing dưới sự điều khiển của kernel. Một task mà triệu gọi một hàm “system call” thì được gọi là “invoking task” 2.1.2 Dispatch, dispatcher Chuyển đổi sự thực thi giữa các task được thực thi bởi processor được gọi là “dispatching”. Cơ chế của kernel mà nó thực hiện quá trình dispatching được gọi là “dispatcher”. 2.1.3 Scheduling , scheduler Quá trình xử lý để xác định task nào sẽ được thực thi kế tiếp được gọi là “scheduling” (định thời) .Cơ chế của kernel để xác định quá trình scheduling được gọi là “scheduler”. Nhìn chung , một “scheduler” được hiện thực bên trong quá trình xử lý của các hàm “system call” hay một “dispatcher”. 2.1.4 Context Môi trường mà trong đó một chương trình thực thi được gọi chung là “context” (hay ngữ cảnh). Trong một ngữ cảnh thì phải đồng nhất , ít nhất là chế độ hoạt động của processor và vùng stack phải giống nhau. Chú ý rằng , ngữ cảnh là một khái niệm quan trọng từ cách nhìn của ứng dụng , ngay cả khi quá trình xử lý được thực thi độc lập với ngữ cảnh. Trong thực tế thì sự hiện thực của cả 2 loại ngữ cảnh trên thì đôi lúc lại xử dụng cùng chế độ hoạt động của processor và cùng stack. 2.1.5 Precedence Mối liên hệ giữa các yêu cầu xử lý khác nhau mà nó xác định thứ tự thực thi thì được gọi là “precedence” (độ ưu tiên ). Khi một process có độ ưu tiên cao hơn chuyển sang trạng thái ready trong khi task có độ ưu tiên thấp hơn đang thực thi thì như một qui luật chung task có độ ưu tiên cao hơn sẽ chuyển sang trạng thái thực thi còn task đang thực thi phải chuyển sang trạng thái ready. Độ ưu tiên là một thông số được gán cho các task bởi 1 ứng dụng để điều khiển thứ tự thực thi giữa các task hay để xử lý các quá trình gởi thông điệp. Nói cách khác thì độ ưu tiên là một khái niệm được dùng để làm rõ thứ tự mà trong đó các task thực thi. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 105 2.2 Trạng thái của task và các qui luật về định thời 2.2.1 Trạng thái của task Trạng thái của task được phân làm 5 loại chính được liệt kê bên dưới. Trong đó thì trạng thái WAIT được phân làm 3 loại nhỏ hơn. (a) RUN state Một task đang ở trạng thái RUN state có nghĩa là task đó hiện thời đang được thực thi. Khi mà một task độc lập với ngữ cảnh (Task-independent portion) được thực thi thì task mà thực thi ngay trước khi bắt đầu sự thực thi của Task-independent portion được nói là đang ở trong trạng thái Run state. (b) READY state Task mà đã hoàn tất quá trình chuẩn bị cho sự thực thi nhưng chưa chuyển sang trạng thái RUN được vì task có độ ưu tiên cao hơn đang thực thi. Trong trường hợp này , thì task sẽ được thực thi bất cứ khi nào nó trở thành task có độ ưu tiên cao nhất giữa các task trong trạng thái READY (c) WAIT states Task không thể được thực thi bởi vì những điều kiện cho sự thực thi chưa có sẵn. Nói cách khác là task đang chờ đợi những điều kiện cho sự thực thi được thỏa mãn. Trong khi một task đang ở trạng thái WAIT thì các giá trị trong các thanh ghi và của program counter cũng như một số thông tin khác của chương trình đang đươc thực thi sẽ được lưu lại. Khi task được đánh thức để tiếp tục thực thi từ trạng thái này thì các thông tin được lưu lại sẽ được phục hồi như trước khi task đi vào trạng thái WAIT. Trạng thái này được chia làm 3 trạng thái nhỏ hơn. (c.1) WAIT state Sự thực thi sẽ bị ngừng lại bởi vì task đang thực thi vừa mới triệu gọi một hàm system call . Và sự thực thi chỉ có thể tiếp tục khi hàm system call này hoàn thành. (c.2) SUSPEND state Sự thực thi buộc phải ngưng lại bởi vì một task khác. (c.3) WAIT-SUSPEND state Task cùng lúc vừa ở trong trạng thái WAIT vừa ở trạng thái Suspend. WAIT- SUSPEND là kết quả khi một task nào đó yêu cầu Suspend một task đã ở trong trạng thái WAIT .T-Kernel phân biệt rõ ràng giữa 2 trạng thái WAIT và SUSPEND. Một task thì không thể tự nó đi vào trạng thái SUSPEND. (d) DORMANT state Task mà chưa được bắt đầu sự thực thi hay đã hoàn thành sự thực thi rồi. Trong khi một task đang ở trạng thái DORMANT thì tất cả thông tin thể hiện sự thực thi của nó sẽ không được lưu lại. Khi một task bắt đầu sự thực thi của nó từ trạng thái DORMANT thì sự thực thi của nó sẽ bắt đầu tại địa chỉ bắt đầu của task. Ngoại trừ những đặc tả khác thì giá trị của thanh ghi sẽ không được lưu lại. (e) NON-EXISTENT state Đây là một trạng thái ảo trước khi task được tạo ra , hoặc sau khi nó bị deleted hoặc chưa được đăng kí với hệ thống. Phụ thuộc vào sự hiện thực mà ở đây có thể có thêm 1 số trạng thái tạm thời khác mà không thuộc vào bất kì trạng thái nào trong 5 trạng thái được liệt kê ở trên. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 106 Khi một task chuyển sang trạng thái READY mà có độ ưu tiên cao hơn task đang thực thi hiện tại thì quá trình “dispatching” có thể xảy ra ngay khi task chuyển sang trạng thái READY và sau đó nó sẽ chuyển sang trạng thái RUN. Trong trường hợp này thì task mà đang thực thi cho tới thời điểm “dispatching” xảy ra được nói là nó đã bị tước đoạt quyền thực thi bởi task mới. Một task được nói là bắt đầu sự thực thi có nghĩa là nó chuyển từ trạng thái DORMANT sang trạng thái READY. Do đó mà khi nói một task đã thực thi có nghĩa là task đang ở trong một trạng thái bất kì nào đó ngoài trạng thái DORMANT hay NON-EXISTENT . Và một task được nói là thoát khỏi sự thực thi có nghĩa là task đã đi đến trạng thái DORMANT. Một task được nói là đã được giải phóng khỏi trạng thái “wait” có nghĩa là nếu task đang ở trạng thái WAIT thì sẽ chuyển sang trạng thái READY , còn nếu task đang ở trạng thái WAIT- SUSPEND thì sẽ chuyển sang trạng thái SUSPEND. Sự tiếp tục thực thi của một task ở trạng thái “suspend” có nghĩa là nếu task đang ở trạng thái SUSPEND thì sẽ chuyển sang trạng thái READY, và nếu như task đang ở trạng thái WAIT-SUSPEND thì sẽ chuyển sang trạng thái WAIT. Sự chuyển trạng thái giữa cac task được mô tả như trên hình 2.1 Hình 2.1 : Sơ đồ chuyển trạng thái GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 107 Phụ thuộc vào sự hiện thực mà ở đây có thể có thêm một số trạng thái khác ngoài những trạng thái được chỉ ra ở đây. Một đặc điểm của T-Kernel đó là nó có sự phân biệt rất rõ ràng giữa sự tác động của các hàm system call lên task đã triệu gọi nó và các task khác (bảng 2.1 ). Lí do cho sự phân biệt này là nó sẽ làm cho sơ đồ chuyển trạng thái của task trở nên rõ ràng hơn cũng như tạo thuận lợi cho việc hiểu rõ hơn về các hàm system call. Sự phân biệt sự tác động của các hàm system call lên các task đã triệu gọi nó và các task khác cũng được xem như là sự phân biệt giữa sự chuyển trạng thái từ trạng thái RUN và sự chuyển trạng thái từ các trạng thái khác. Bảng 2.1 : Phân biệt sự chuyển trạng thái giữa “invoking task” và các task khác Trạng thái WAIT và SUSPEND có mối quan hệ trực giao , trong đó bất kì những yêu cầu nào cho sự chuyển tới trạng thái SUSPEND cũng không gây ảnh hưởng tới điều kiện cho sự giải phóng task khỏi trạng thái WAIT. Điều đó cũng có nghĩa là những điều kiện để giải phóng task khỏi trạng thái WAIT thì giống nhau khi task đang ở trạng thái WAIT hay WAIT-SUSPEND. Do đó, ngay cả khi một yêu cầu chuyển sang trạng thái SUSPEND được đưa ra đối với 1 task mà nó đang ở trong trạng thái chờ đợi tài nguyên (semaphore , memory block ,.) thì nó sẽ chuyển sang trạng thái WAIT-SUSPEND và điều kiện để cấp phát tài nguyên cho nó vẫn không có gì thay đổi so với khi nó bị yêu cầu chuyển sang trạng thái SUSPEND. Lí do để T-Kernel làm sự phân biệt rõ ràng giữa trạng thái WAIT (gây ra bởi sự triệu gọi một hàm system call) và trạng thái SUSPEND ( gây ra bởi 1 task khác) là những trạng thái này đôi khi lại có sự trùng lắp lên nhau. Bằng sự phân biệt rõ ràng trạng thái mà chúng trùng lắp lên nhau WAIT-SUSPEND, sơ đồ chuyển trạng thái sẽ rõ ràng hơn và các hàm system call sẽ trở nên dễ hiểu hơn. 2.2.2 Các qui luật định thời T-Kernel định thời dựa trên độ ưu tiên giữa các task và theo cơ chế “preemptive”. Nếu có nhiều task mà chúng có thể thực thi được thì chỉ task có độ ưu tiên cao nhất được chuyển sang trạng GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 108 thái RUN , các task còn lại phải chuyển sang trạng thái READY. Những task có cùng độ ưu tiên sẽ được định thời theo qui tắc FCFS (First Come First Served). Theo cơ chế định thời của T-Kernel thì task có độ ưu tiên cao nhất sẽ được thực thi , các task còn lại thì đơn giản là sẽ không được thực thi. Và nếu như task có độ ưu tiên cao nhất không đi vào trạng thái WAIT , hay vì những lí do nào đó mà nó không được thực thi thì các task khác cũng không được thực thi.Đây chính là sự khác nhau cơ bản so với cách định thời trong hệ thống chia sẽ thời gian (Time Sharing System - TSS) , trong hệ thống TSS thì các task được đối xử một cách bình đẳng với nhau. Tuy nhiên chúng ta cũng có thể dùng các hàm system call để thay đổi thứ tự thực thi giữa các task có cùng độ ưu tiên .Do đó một ứng dụng có thể dùng các hàm system call để định thời theo cơ chế round-robin , đó cũng là một kiểu định thời của TSS. Hình 2.2 : Thứ tự thực thi ở trạng thái khởi tạo Hình 2.2 và các hình bên dưới sẽ minh họa rõ cho chúng ta thấy cách mà các task được thưc thi khi mà chúng có độ ưu tỉên giống nhau cũng như những task có độ ưu tiên khác biệt nhau. Ở hình 2.2 chỉ ra thứ tự thực thi giữa các task sau khi task A có độ ưu tiên là 1, task E có độ ưu tiên là 3 và task B, C , D có cùng độ ưu tiên là 2 được bắt đầu. Task với độ ưu tiên cao nhất A sẽ được chuyển sang trạng thái RUN. Sau khi task A kết thúc thì task B với độ ưu tiên cao nhất sẽ chuyển sang trạng thái RUN (hình 2.3) Hình 2.3 : Thứ tự thực thi sau khi task B chuyển sang trạng thái RUN Khi task A lại bắt đầu sự thực thi của mình lần nữa thì task B sẽ bị tước quyền thực thi và sẽ chuyển sang trạng thái READY. Nhưng bởi vì task B là task chuyển sang trạng thái RUN sớm hơn task C, D nên nó vẫn còn có quyền thực thi cao nhất giữa các task có cùng độ ưu tiên và thứ tự thực thi giữa các task vẫn giống hình 2.2. Bây giờ chúng ta hãy xem điều gì sẽ xảy ra nếu như task B chuyển sang trạng thái WAIT khi mà các task đang ở trong trạng thái đụơc miêu tả trong hình 2.3. Vì là thứ tự thực thi giữa các task được định nghĩa cho các task mà nó có thể được thực thi nên thứ tự thực thi giữa các task bây giờ giống như sự mô tả của hình 2.4. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 109 Hình 2.4 : Thứ tự thực thi sau khi task B chuyển sang trạng thái WAIT Do đó sau khi mà task B được giải phóng khỏi trạng thái WAIT thì nó sẽ chuyển sang trạng thái RUN sau task C và D . Ở đây task B đã nhận quyền thực thi thấp nhất giữa các task có cùng độ ưu tiên (hình 2.5). Hình 2.5 : Thứ tự thực thi khi task B được giải phóng khỏi trạng thái WAIT Tóm lại khi mà một task chuyển từ trạng thái READY sang RUN rồi quay về trạng thái READY thì nó có quyền thực thi cao nhất giữa các task có cùng độ ưu tiên nhưng sau khi task chuyển từ RUN sang WAIT , và khi mà trạng thái WAIT được giải phóng thì nó sẽ có quyền thực thi thấp nhất giữa các task có cùng độ ưu tiên. Chú ý rằng khi một task chuyển từ trạng thái SUSPEND sang trạng thái READY thì nó phải có quyền thực thi thấp nhất giữa các task có cùng độ ưu tiên. Trong một hệ thống có sử dụng bộ nhớ ảo thì khi mà một task phải chờ đợi sự thay trang thì nó bị chuyển sang trạng thái SUSPEND và trong những hệ thống như vậy thì sự thay đổi thứ tự thực thi giữa các task như là một kết quả của quá trình chờ đợi sự thay trang. 2.3 Xử lý các interrupt Interrupt trong T-Engine bao gồm cả interrupt bên ngoài do các thiết bị gây ra hay những interrupt bên trong do CPU gây ra. Một trình xử lý interrupt có thể được định nghĩa cho một số interrupt. Mỗi chương trình quản lý interrupt có thể được gán cho một địa chỉ thực thi trực tiếp mà không cần có sự can thiệp của hệ điều hành hoặc được gán cho một địa chỉ thực thi của một chương trình con được viết bằng ngôn ngữ cấp cao. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 110 2.4 Xử lý các ngoại lệ của task T-Kernel cho phép định nghĩa hàm xử lý những ngoại lệ của task. Cần chú ý là ngoại lệ là những gì mà không được CPU xem như interrupt. Khi một task đang thực thi mà có một ngoại lệ nào đó xảy ra thì sẽ kích khởi sự thực thi của trình xử lý những ngoại lệ của task đó và khi đó thì task đang thực thi buộc phải ngưng lại. Khi mà trình xử lý ngoại lệ thực thi xong thì task sẽ tiếp tục sự thực thi của mình. Một trình xử lý ngoại lệ của task cho mỗi task có thể được đăng kí cho một ứng dụng nào đó. 2.5 Các trạng thái của hệ thống 2.5.1 Các trạng thái của hệ thống khi một Nontask-portion thực thi Khi mà một task được lập trình để chạy trên T-Engine thì các trạng thái của task có thể được theo dõi bằng cách quan sát lược đồ chuyển trạng thái của task. Tuy nhiên , trong trường hợp nó là các chương trình xử lý interrupt hay các hàm quản lý các dịch vụ mở rộng ( extended SVC handler) thì người sử dụng phải thực hiện quá trình lập trình ở mức độ gần với kernel hơn là với task Và trong trường hợp này thì điều mà chúng ta cần quan tâm đó là trạng thái của hệ thống trong khi Nontask-portion thực thi, đó là lí do mà tại sao mà các trạng thái của hệ thống sẽ được làm rõ ở đây. Hình 2.6 : Phân loại các trạng thái của hệ thống Các trạng thái của hệ thống được phân loại như trên hình 2.6. Trong đó trạng thái “transient state” là trạng thái mà hệ điều hành đang thực thi ( ví dụ như các hàm system call) . Điều này rất quan trọng vì từ quan điểm của người dùng thì khi mà các hàm system call được triệu gọi thì quá trình thực thi của chúng sẽ không chia nhỏ và các trạng thái bên trong sẽ không được thấy bời người sử dụng. Bời vì lí do này mà khi OS thực thi thì được xem như là “trasient state” và những gì bên trong nó sẽ được xem như là một hộp đen. Tuy nhiên , những trường hợp dưói đây thì khi thực thi các “transient state” có thể bị chia nhỏ: -Khi bộ nhớ được cấp phát hay được giải phóng trong trường hợp các hàm system call thực hiện quá trình “get” hay “release” bộ nhớ ( trong khi một hàm quản lý bộ nhớ của T- Kernel/SM được gọi). -Trong các hệ thống sử dụng bộ nhớ ảo, khi mà bộ nhớ không thường trú bị truy xuất trong quá trình thực thi của các hàm system call Khi mà một task ở trong trạng thái “transient state”giống như trên thì hoạt động của hàm system call tk_ter_tsk dùng để kết thúc sự thực thi của một task thì không được bảo đảm. Ngoài ra ,hàm GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 111 dùng để suspend một task tk_sus_tsk có thể gây ra deadlock hay những vấn đề khác do khi ngừng sự thực thi của một task mà không xóa khỏi trạng thái trasient state. Do đó , mà như một qui luật các hàm tk_sus_tsk và tk_ter_tsk sẽ không được sử dụng trong những chương trình như vậy. Những hàm system call này chỉ được sử dụng trong những hệ thống con như hệ thống có bộ nhớ ảo hay trong chương trình debug mà sự thực thi của nó thì gần với hệ điều hành và đôi lúc được xem như một phần của hệ điều hành. Task-independent portion và quasi-task portion là những trạng thái của hệ thống trong khi một trình xử lý các interrupt hay những ngoại lệ của task thực thi . Phần của trình xử lý mà nó thực thi trong ngữ cảnh của task thì được gọi là quasi-task portion , còn phần mà thực thi độc lập với ngữ cảnh của task thì được gọi là Task-independent portion. Một trình xử lý các hàm system call mở rộng của hệ thống do người dùng định nghĩa là một quasi-task portion, ngược lại thì trình xử lý các interrupt hay các hàm xử lý các sự kiện về thời gian được kích khởi bởi các interrupt bên ngoài là một Task-independent portion. Trong quasi-task portion, những task này có sự chuyển trạng thái giống như một task bình thường và các hàm system call có thể được gọi ngay cả khi nó đang ở trạng thái WAIT. Trasient state , Task-independent portion và quasi-task portion được gọi chung là nontask-portion . Trong một chương trình đang thực thi thì các task ngoài những trạng thái được liệt kê ở trên thì được gọi là task-portion. 2.5.2 Task-independent portion và quasi-task portion Một đặc điểm của Task-independent portion (interrupt handler, time event handler,) đó là việc xác định task nào đã thực thi ngay trước khi nó đi vào vùng task-independent là điều vô nghĩa và khái niệm “invoking task” là không tồn tại. Do đó mà khi một hàm system call đi vào trạng thái WAIT state hay một hàm system call được thiết kế cho “invoking task” sẽ không được gọi từ Task-independent portion. Ngoài ra, vì không thể định ra được task nào đang thực thi trước khi đi vào Task-independent portion do đó mà sẽ không có quá trình “dispatching”. Nếu như quá trình “dispatching” cần thiết phải thực hiện thì nó sẽ bị trì hoãn lại cho đến khi task-independent thực thi xong. Quá trình này được gọi là “delay dispatching”. Nếu như quá trình “dispatching” xảy ra trong lúc trình xử lý interrupt đang thực thi ( Task- independent portion) thì phần còn lại của trình xử lý phải bị hoãn lại cho đến khi một task nào đó được bắt đầu bởi quá trình “dispatching” này ,điều này sẽ gây ra sự lồng nhau giữa các interrupt và được minh họa trên hình 2.7.Trong ví dụ bên dưới thì interrupt X xảy ra khi mà task A đang thực thi và trong khi trình xử lý interrupt của nó đang thực thi thì có một interrupt Y có độ ưu tiên cao hơn đến. Trong trường hợp này thì nếu như interrupt Y kích khởi sự hoạt động của task B và task B sẽ bắt đầu sự thực thi của mình khi mà trình xử lý interrupt Y kết thúc và như vậy thì phần còn lại của quá trình xử lý interrupt X từ (2) đến (3) chỉ có thể được tiếp tục thực thi khi task A chuyển sang trạng thái RUN. Điều nguy hiểm ở đây là trình xử lý interrupt của A bị tước quyền thực thi không chỉ bởi trình xử lý interrupt của Y mà còn cả task B nữa. Điều này làm cho trình xử lý interrupt không còn độ ưu tiên cao nhất so với các task thông thường đó là lí do vì sao phải giới thiệu về quá trình trì hoãn dispatching. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 112 Hình 2.7: Interrupt lồng nhau và trì hoãn quá trình dispatching Khác với Task-independent portion thì quasi-task portion có thể định ra task nào đã thực thi ngay trước khi trạng thái của hệ thống đi vào quasi-task portion và do đó nó sẽ định ra được trạng thái của task ngay trước khi đi vào trạng thái này. Ngoài ra thì một task nằm trong quasi-task-portion thì có thể đi vào trạng thái WAIT. Do đó mà quá trình dispatching xảy ra bên trong quasi-task portion cũng giống như quá trình dispatching đối với các task bình thường khác. Và kết quả là mặc dù những phần mở rộng của hệ điều hành cũng như các quasi-task portion là các nontask portion nhưng sự thực thi của nó thì không cần có độ ưu tiên cao hơn tất cả các task thông thường . Điều này thì trái ngược với các trình xử lý interrupt, nó luôn có độ ưu tiên cao hơn so với tất cả các task thông thường khác. Hai ví dụ sau sẽ làm rõ sự khác biệt giữa Task- independent portion và quasi-task portion -Trong khi task A đang thực thi ( có độ ưu tiên là 8) thì có một intẹrrupt xảy ra , do đó sẽ kích hoạt trình xử lý interrupt của nó (Task-independent portion) thực thi. Và bên trong hàm xử lý interrupt lại gọi hàm tk_wup_tsk để đánh thức sự thực thi của task B (có độ ưu tiên là 2 cao hơn task A). Theo nguyên lý của việc trì hoãn quá trình dispatching thì quá trình dispatching sẽ không xảy ra ở thời điểm này mà thay vì vậy sau khi hàm tk_wup_tsk thực thi xong thì phần còn lại của trình xử lý interrupt sẽ được thực thi kế tiếp. Chỉ khi tk_ret_int được thực thi xong tại phần cuối của trình xử lý interrupt thì quá trình dispatching xảy ra làm cho task B chuyển sang trạng thái thực thi. -Một hàm mở rộng của system call được triệu gọi trong khi task A đang thực thi (có độ ưu tiên là 8 ) và trong trình xử lý của nó (quasi-task portion) có kích khởi sự thực thi của task B ( có đô ưu tiên là 2) bằng hàm tk_wup_tsk. Trong trường hợp này thì nguyên lý trì hoãn quá trình dispatching không được áp dụng và ngay sau khi tk_wup_tsk thực thi xong thì quá trình dispatching sẽ được xảy ra và task B sẽ chuyển sang trạng thái RUN còn task A phải chuyển sang trạng thái READY. Do đó mà phần còn lại của trình xử lý của hàm mở rộng của system call chỉ có thể được thực thi sau khi task A chuyển sang trạng thái RUN một lần nữa. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 113 2.6 Đối tượng Đối tượng (object) là một thuật ngữ chung dùng để chỉ những tài nguyên được quản lý bởi T- Kernel. Bên cạnh task thì đối tượng còn bao gồm memory pool , semaphores, các sự kiện , các cờ, mailbox và các cơ chế dùng để đồng bộ hay để giao tiếp cũng như là các trình xử lý các sự kiện về thời gian. Thuộc tính thì thường được thiết kế mỗi khi đối tượng được tạo ra. Thuộc tính sẽ xác định sự khác biệt cụ thể trong cách cư xử của đối tượng cũng như trạng thái khởi tạo của nó. Khi mà TA_XXXXX đựơc thiết kế cho 1 đối tương nào đó thì nó được gọi là đối tượng có thuộc tính TA_XXXXX. Nếu không có thuộc tính cụ thể nào được định nghĩa cho đối tượng thì TA_NULL (= 0) sẽ được tạo ra cho đối tượng đó. Một cách tổng quát thì T-Kernel không có cung cấp cách giao tiếp cho phép đọc các thuộc tính của đối tượng sau khi nó đã được đăng kí. Trong giá trị thuộc tính của một đối tượng hay của một trình xử lý thì các bit thấp chỉ ra các thuộc tính của hệ thống còn các bit cao chỉ ra các thuộc tính mà nó phụ thuộc vào cách hiện thực (implementation-dependent). Tuy nhiên, T-Kernel không chỉ rõ vị trí của bit nào được cho là cao hay thấp, mà như là một nguyên tắc thì các thuộc tính của hệ thống sẽ được bố trí từ bit ít có ý nghĩa nhất (least significant bit) đến bit có nhiều ý nghĩa nhất (most significant bit) còn các thuộc tính phụ thuộc vào cách hiện thực sẽ được bố trí theo chiều ngược lại. Những bit nào không được định nghĩa thuộc tính cho nó thì được xoá về 0. Trong một số trường hợp thì đối tượng có thể chứa thêm những thông tin mở rộng. Phần thông tin mở rộng này sẽ được thiết kế khi đối tượng được đăng kí. Những thông tin mà truyền cho đối tượng như những thông số khi đối tượng bắt đầu sự thực thi sẽ không ảnh hưởng tới các hoạt động của T-Kernel. Những phần thông tin mở rộng có thể được đọc bằng cách gọi hàm system call để tham khảo đến trạng thái của đối tượng đó. 2.7 Memory 2.7.1 Không gian địa chỉ Không gian bộ nhớ khả định địa chỉ được phân làm 2 loại đó là không gian bộ nhớ hệ thống và không gian bộ nhớ của các task. Không gian bộ nhớ của hệ thống có thể được truy xuất như nhau giữa tất cả các task, còn không gian địa chỉ của task thì chỉ được truy xuất bởi những task mà nó thuộc không gian bộ nhớ này. Trong một số trường hợp thì các task khác nhau có thể cùng thuộc về một không gian địa chỉ. Hình 2.8 : Không gian địa chỉ Không gian địa chỉ luận lý của task và của hệ thống phụ thuộc vào những giới hạn của CPU (hay MMU) do đó nó phụ thuộc vào sự hiện thực nhưng về nguyên tắc thì không gian của task nên GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 114 được gán cho không gian địa chỉ thấp còn không gian địa chỉ của hệ thống là không gian địa chỉ cao. Vì các trình xử lý interrupt và những phần mềm Task-independent portion không là các task nên chúng cũng sẽ không có không gian địa chỉ của task. Thay vì vậy, Task-independent portion sẽ có không gian địa chỉ task chính là không gian địa chỉ của task mà trước khi nó đi vào Task- independent portion. Điều này có thể được thực hiện bởi kết quả trả về của hàm system call tk_get_tid. Nếu như không có task nào đang ở trạng thái RUN thì không gian địa chỉ của task sẽ không được xác định. T-Kernel sẽ không tạo và cũng không quản lý không gian địa chỉ mà thông thường thì T-Kernel sẽ được sử dụng cùng với một hệ thống con nào đó để quản lý các không gian địa chỉ . Trong một hệ thống mà không có MMU hay không sử dụng MMU thì không gian địa chỉ của các task về bản chất là không tồn tại. 2.7.2 Bộ nhớ không thường trú Bộ nhớ thì có thể là thường trú hay không thường trú. Khi mà bộ nhớ không thường trú được truy xuất thì T-Kernel sẽ chép dữ liệu từ đĩa cũng như các thiết bị lưu trữ vào trong bộ nhớ chính của nó. Do đó mà nó yêu cầu một quá trình xử lý phức tạp giống như quá trình truy xuất đĩa bằng một đevice driver. Do đó mà khi truy xuất bộ nhớ không thường trú thì device driver, cũng như những thiết bị có liên quan phải ở trạng thái sẵn sàng hoạt động. Quá trình truy xuất sẽ không thể được thực hiện trong những trạng thái mà ở đó khộng cho phép quá trình “dispatch” hay “interrupt” hoặc trong Task-independent portion. Cũng tương tự như vậy thì bên trong quá trình xử lý của OS , điều cần thiết là phải nên né tránh việc truy xuất vào các vùng nhớ không thường trú khi mà quá trình xử lý đang nằm trong vùng tranh chấp (critical section). Một trường hợp cụ thể cho vấn đề này là khi truyền thông số cho các hàm system call mà thông số này lại trỏ đến một vùng nhớ không thường trú.. Việc cho phép hay không cho phép truyền các thông số kiểu như vậy thì còn phụ thuộc vào cách hiện thực cụ thể. Dữ liệu được chuyển từ đĩa hay các thiết bị khác tương tự như vậy và gây ra quá trình truy xuất các bộ nhớ không thường trú thì không được thực hiện bời T-Kernel. Mà thông thường T-Kernel được xử dụng cùng với một số hệ thống con mà các hệ thống này sẽ quản lý các vùng bộ nhớ ảo cũng như các quá trình xử lỳ khác. Trong một hệ thống mà không sử dụng bộ nhớ ảo thì thông số của các hàm system call cũng như các hàm khác tương tự như vậy mà trỏ đến các vùng nhớ không thường trú thì sẽ được bỏ qua, hoặc hệ thống đó sẽ xem tất cả các vùng nhớ đều là ở dạng thường trú. 2.7.3 Các mức độ bảo vệ T-Kernel cung cấp 4 mức độ bảo vệ bộ nhớ từ 0 đến 3: • Mức 0 có đặc quyền cao nhất còn mức 3 có đặc quyền thấp nhất. • Việc truy xuất vùng nhớ chỉ có thể được thực hiện ở vùng nhớ mà có mức độ bảo vệ hiện tại bằng hoặc tháp hơn. • Vịêc thay đổi mức độ bảo vệ sang một mức độ bảo vệ khác có thể được thực hiện bằng cách gọi hàm system call hoậc các hàm dịch vụ mở rộng (được định nghĩa thêm bởi người sử dụng) hoặc do interrupt hoặc các ngoại lệ của CPU. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG KHÁI NIỆM CƠ BẢN 115 Hình 2.9 : Các mức độ bảo vệ bộ nhớ. Một Nontask portion ( Task-independent portion ,quasi-task portion ,..) thì được thực thi ở mức độ bảo vệ là 0 . Chỉ duy nhất một task có thể chạy ở mức độ bảo vệ là từ 1 đến 3. Một task của người sử dụng cũng có thể được chạy ở mức độ bảo vệ là 0. Có một số MMU chỉ hỗ trợ có 2 mức bảo vệ là mức đặc quyền và mức độ người sử dụng. Và trong trường hợp này thì mức độ từ 0 đến 2 được gán cho chế độ đặc quyền còn mức độ 3 được gán cho chế độ người sử dụng. Còn trong những hệ thống mà không có MMU thì tất cả các mức độ bảo vệ từ 0 đến 3 đều được đối xử như nhau. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG ĐẶC TẢ CHUNG 116 Chương 3 NHỮNG ĐẶC TẢ CHUNG CỦA T-KERNEL 3.1 Kiểu dữ liệu 3.1.1 Các kiểu dữ liệu chung typedef char B ; /* số nguyên 8-bit có dấu */ typedef short H ; /* số nguyên 16-bit có dấu */ typedef int W ; /* số nguyên 32-bit có dấu */ typedef unsigned char UB ; /* số nguyên 8-bit không dấu */ typedef unsigned short UH ; /* số nguyên 16-bit không dấu */ typedef unsigned int UW ; /* số nguyên 32-bit không dấu */ typedef char VB ; /* 8-bit dữ liệu mà không có kiểu cố định */ typedef char VH ; /*16-bit dữ liệu mà không có kiểu cố định */ typedef char VW ; /*16-bit dữ liệu mà không có kiểu cố định */ typedef char *VP ; /*con trỏ dữ liệu mà không có kiểu cố định */ typedef volatile B _B ; /* đặc tả kiểu không ổn định*/ typedef volatile H _H ; typedef volatile W _W ; typedef volatile UB _UB ; typedef volatile UH _UH ; typedef volatile UW _UW ; typedef int INT; typedef unsigned int UINT; typedef int ID;/* ID tổng quát */ typedef int MSEC;/*thời gian tổng quát (milisecond) */ typedef void (*FP) ();/*địa chỉ hàm tổng quát */ typedef void (*FUNCP) ();/*địa chỉ hàm tổng quát */ #define LOCAL static /* đánh dấu sự định nghĩa cục bộ */ #define EXPORT /* đánh dấu sự định nghĩa toàn cục */ #define IMPORT extern /* đánh dấu sự tham khảo toàn cục */ /* * Những giá trị của kiểu Boolean GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG ĐẶC TẢ CHUNG 117 * Theo định nghĩa thì TRUE =1 nhưng bất kì giá trị nào khác 0 cũng được xem là TRUE. Do đó mà nên né tránh những câu lệnh như bool == TRUE mà thay vào đó ta sẽ dùng câu lệnh bool != FALSE. */ typedef INT BOOL; #define TRUE 1 /* True */ #define FALSE 0 /* False */ /* * Mã kí tự TRON */ typedef UH TC; /* mã kí tự TRON */ typedef TNULL ((TC)0); /* kí tự kết thúc chuỗi kí tự trong TRON*/ • VB, VH và VW cho ta biết được độ rộng của bit dùng để biểu diễn nhưng không cho ta biết được kiểu dữ liệu còn B,H,W thì chỉ rõ cho ta biết đó là kiểu số nguyên • Vì bộ xủ lý là 32 bit hoặc hơn nên kiểu INT và UINT cũng có độ rộng bit ít nhất là 32 bit Các thông số như stksz, wupcnt, và chiều dài của 1 message thì rõ ràng là các giá trị không âm nhưng về nguyên tắc thì nó được gán cho kiểu dữ liệu là kiểu số nguyên có dấu. Điều này cũng thể hiện như một qui tắc chung của TRON đó là các số nguyên nên được xem như là các số nguyên có dấu để có thể mở rộng khi cần thiết. Ví dụ như thông số thời gian timeout (TMO tmout ) thì được gán cho giá trị nguyên có dấu để có thể sử dụng TMO_FEVR ( = -1 ) để thể hiện 1 ý nghĩa đặc biệt của nó. Các thông số mà có kiểu dữ liệu là kiểu số nguyên không dấu thì được xem như các mẫu bit ( như các đối tượng, các thuộc tính , các cờ sự kiện, v.v..) 3.1.2 Các kiểu dữ liệu được định nghĩa khác Các tên được liệt kê bên dưới thì được sử dụng cho các kiểu dữ liệu khác mà nó xuất hiện thường xuyên hoặc có một ý nghĩa đặc biệt hoặc để làm rõ ý nghĩa của các thông số. typedef INT FN; /* Function code */ typedef INT RNO; /* Rendezvous number */ typedef INT ATR; /* Thuộc tính của đối tượng hoặc của các trình xử lý */ typedef INT ER; /* Mã lỗi */ typedef INT PRI; /* Độ ưu tiên */ typedef INT TMO; /*Thời gian timeout */ typedef UINT RELTIM; /* Thời gian tương đối */ typedef struct systim { /* Thời gian của hệ thống */ W hi; /* 32 bit cao */ UW lo; /* 32 bit thấp */ } SYSTIM; /* Các hằng chung */ GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG ĐẶC TẢ CHUNG 118 #define NULL 0 /* Con trỏ NULL */ #define TA_NULL 0 /* Cho biết không có thuộc tính đặc biệt */ #define TMO_POL 0 /* Polling */ #define TMO_FEVR (-1) /* Chờ đợi mãi mãi */ Kiểu dữ liệu có được bởi sự kết hợp của 2 hay nhiều kiểu dữ liệu khác thì được thể hiện bằng kiểu dữ liệu chính. Ví dụ như giá trị trả về của hàm tk_cre_tsk có thể là task ID hoặc mã lỗi nhưng vì giá trị chính của nó là task ID nên kiểu dữ liệu là task ID. 3.2 Các hàm system call 3.2.1 Định dạng của các hàm system call T-Kernel lấy C làm ngôn ngữ chuẩn cấp cao và T-Kernel cũng thực hiện chuẩn hóa sự giao tiếp với các hàm system call được viết bằng ngôn ngữ C. Cách thức thực hiện việc giao tiếp với các hàm system call ở mức độ ngôn ngữ Assembly là phụ thuộc vào sự hiện thực và không chuẩn hóa.Việc gọi các hàm system call thông qua cách thức của C thì được khuyến khích ngay cả với một chương trình được viết bằng Assembly. Bằng cách này thì sẽ bảo đảm được tính khả chuyển của các chương trình được viết bằng Assembly ngay cả khi hệ điểu hành thay đổi , miễn là CPU giống nhau. Những qui luật chung sau đây đươc thiết lập cho tất cả các hàm system call : • Tất cả các hàm system call được định nghĩa như những hàm của C. • Mã giá trị trả về của một hàm là 0 hay một số dương chỉ ra sự kết thúc bình thường , trong khi đó thì số âm được sử dụng cho các mã lỗi của hàm. Tất cả giao tiếp của các hàm system call được cung cấp như những hàm thư viện. Các macro được viết bằng C , inline functions, và inline assembly code thì không được phép sử dụng. Lí do của việc này đó là vì C macro và inline function chỉ có thể được sử dụng từ các chương trình C. Ngoài ra thì inline function và inline assembly không là đặc tính chuẩn của C, những chức năng này là phụ thuộc vào sự hiện thực của trình biên dịch và do đó sẽ hạn chế tính khả chuyển của các hàm system call. 3.2.2 Các hàm system call có thể được gọi từ Task-independent portion Các hàm system call liệt kê bên dưới thì được phép gọi từ một Task-independent portion hoặc từ một trạng thái không cho phép quá trình dispatch. Các hàm system call còn lại có được phép gọi từ Task-independent portion hay từ các trạng thái mà không cho phép quá trình dispatch hay không là phụ thuộc vào sự hiện thực. tk_sta_tsk Start task tk_wup_tsk Wakeup task tk_rel_wai Release wait tk_sus_tsk Suspend task tk_sig_sem Signal semaphore tk_set_flg Set event flag tk_sig_tev Send event to task tk_rot_rdq Rotate task queue tk_get_tid Get task ID GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG ĐẶC TẢ CHUNG 119 tk_sta_cyc Start cyclic handler tk_stp_cyc Stop cyclic handler tk_sta_alm Start alarm handler tk_stp_alm Stop alarm handler tk_ref_tsk Reference task status tk_ref_cyc Reference cyclic handler status tk_ref_alm Reference alarm hanlder status tk_ref_sys Reference system status tk_ret_int Return from interrupt handler 3.2.3 Giới hạn việc triệu gọi các hàm system call Mức độ bảo vệ mà tại đó hàm system call được triệu gọi có thể bị giới hạn. Trong trường hợp này nếu như một hàm system call được triệu gọi từ một task (task portion ) có mức độ bảo vệ thấp hơn mức độ bảo vệ được thiết kế cho hàm system call đó thì mã lỗi E_OACV sẽ được trả về. Các hàm dịch vụ mở rộng thì không có bất kì một giới hạn nào. Một hàm system call được triệu gọi ở mức độ bảo vệ thấp hơn 1 thì bị cấm do đó các task đang thực thi ở mức độ bảo vệ là 2 và 3 sẽ không được phép gọi các hàm system call. Các task này chỉ có thể triệu gọi các hàm dịch vụ mở rộng và được lập trình để sử dụng các hàm của hệ thống con. Việc giới hạn này được sử dụng khi T-Kernel được kết hợp với các hệ điều hành cao hơn, nhằm ngăn chặn việc gọi trực tiếp các hàm system call từ các task thuộc hệ điều hành cao hơn đó. Điều này cho phép T-Kernel được sử dụng như 1 microkernel. Việc giới hạn mức độ bảo vệ cho các hàm system call thì được thiết lập bằng cách sử dụng các hàm quản lý các thông tin cấu hình của hệ thống. 3.2.4 Chỉnh sửa một gói thông số Một số loại tham số khi truyền cho các hàm system call thì sử dụng định dạng kiểu gói. Những thông số mà có định dạng kiểu gói thì có 2 loại , hoặc là những thông tin đầu vào được truyền cho các hàm system call ( T_CTSK, ) hoặc là những giá trị trả về của các hàm system call (T_RTSK,). Những thông tin phụ có thể được thêm vào gói thông số nhưng đó là tùy thuộc vào cách hiện thực. Tuy nhiên, những thông tin phụ này sẽ không được phép thay đổi kiểu dữ liệu hoặc thứ tự những thông số mà đã được đặc tả theo 1 dạng chuẩn trước đó hoặc xóa bất kì thông tin nào đã có. Khi một thông tin phụ nào đó được thêm vào gói thông số thì nó phải ở vị trí sau những thông số đã được chuẩn hóa trước đó. Khi những hàm system call được gọi mà các thông tin được thêm vào gói thông số đầu vào của các hàm này chưa được khởi tạo giá trị cho nó ( nội dung ô nhớ của các thông tin này không được xác định ) thì các hàm system call này vẫn còn hoạt động bình thường giống như lúc chưa có những thông tin thêm vào này. Thông thường thì giá trị thuộc tính của cờ mà nó cho ta biết giá trị của các thông tin được thêm vào đã được thiết lập hay chưa thì phụ thuộc vào cách hiện thực. Khi mà giá trị của cờ được thiết lập (1) thì các thông tin được thêm vào được sử dụng , còn ngược lại thì các thông tin được thêm vào chưa được khởi tạo và những giá trị mặc định sẽ được sử dụng. Lí do của việc đăc tả này là GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG ĐẶC TẢ CHUNG 120 để bảo đảm khi một chương trình được phát triển trong sự đăc tả chuẩn thì sẽ có thể thực thi trên một hệ điều hành với một số hàm mở rộng bằng cách dịch lại chương trình đó mà thôi. 3.2.5 Function codes Function codes là những con số được gán cho các hàm system call và được sử dụng để định ra các hàm này. Function codes của các hàm system call sẽ không được đặc tả chi tiết ở đây nhưng sẽ được làm rõ ở phần hiện thực. Tham khảo thêm ở hàm tk_def_ssy trong các hàm dịch vụ mở rộng. 3.2.6 Mã lỗi Mã trả về của các hàm system call về nguyên tắc là các số nguyên có dấu. Khi một lỗi xảy ra thì một giá trị âm sẽ được trả về và nếu như sự thực thi kết thúc bình thường thì E_OK (= 0 ) hoặc một giá trị dương được trả về. Ý nghĩa giá trị trả về của việc kết thúc bình thường thì được đặc tả riêng cho từng hàm system call. Ở đây có một ngoại lệ đó là có 1 số hàm system call không có giá trị trả về khi đựơc gọi. Một hàm system call mà không có giá trị trả về thì được đặc tả trong C như những hàm không có giá trị trả về như hàm có kiểu void. Một mã lỗi thì bao gồm mã lỗi chính và mã lỗi phụ. 16 bit thấp của mã lỗi là giá trị của mã lỗi phụ và phần còn lại là giá trị của mã lỗi chính. Mã lỗi chính thì được phân thành các lớp lỗi khác nhau dựa trên sự cần thiết của việc phát hiện lỗi cũng như hoàn cảnh mà lỗi xảy ra hay những yếu tố khác Vì T-Kernel không sử dụng mã lỗi phụ nên những bit này sẽ được thiết lập giá trị là 0. #define MERCD(er) ( (ER)(er) >> 16) /* Mã lỗi chính */ #define SERCD(er) ( (H)(er) ) /* Mã lỗi phụ */ #defing ERCD(mer, ser) ( (ER)(mer ) << 16 | (ER) (UH) (ser) ) 3.2.7 Timeout Một hàm system call mà có thể đi vào trạng thái WAIT thì có nó một hàm timeout. Nếu quá trình xử lý chưa hoàn tất trong thời gian được thiết kế cho hàm timeout thì quá trình xử lý sẽ bị huỷ và hàm system call sẽ trả về mã lỗi là E_TMOUT. Theo nguyên lý trên thì một hàm system call sẽ không nên gây ra bất kì hiệu ứng lề nào nếu như hàm system call trả về một mã lỗi, và việc gọi hàm system call mà gây ra timeout thì về mặt nguyên tắc thì không nên thay đổi trạng thái của hệ thống. Một ngoại lệ xảy ra ở đây là khi một hàm system call giống như trên sẽ không thể trở về trạng thái ban đầu của nó nếu như quá trình thực thi bị huỷ. Điều này sẽ được chỉ rõ trong phần mô tả các hàm system call. Nếu khoảng thời gian timeout được thiết lập là 0 thì hàm system call sẽ không thể đi vào trạng thái WAIT ngay cả khi đó về mặt nguyên tắc thì nó phải đi vào trạng thái WAIT. Việc triệu gọi một hàm system call mà có thời gian timeout được thiết lập là 0 thì được gọi là polling và như vậy thì nếu một hàm system call thực hiện quá trình polling thì sẽ không bao giờ đi vào trạng thái WAIT. Như một qui luật thì khi mô tả hành vi của các hàm system call thì mặc định là không có thời gian timeout (có nghĩa là có thể đi vào trạng thái WAIT mãi mãi ). Do đó mà ngay cả khi các GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG ĐẶC TẢ CHUNG 121 hàm system call được nói là có thể đi vào trạng thái WAIT , nhưng nếu thời gian timeout được thiết lập và thời gian thực thi vượt qua thời gian timeout thì trạng thái WAIT sẽ được giải phóng và hàm system call sẽ trả về mã lỗi là E_TMOUT. Trong trường hợp polling thì hàm system call sẽ trả về giá trị E_TMOUT mà không đi vào trạng thái WAIT. Giá trị timeout ( có kiểu là TMO ) được thiết lập là một số dương hoặc TMO_POL (= 0) cho polling hoặc TMO_FEVER (= -1 ) cho vịêc chờ đợi mãi mãi. Nếu thời gian timeout được thiết lập thì quá trình xử lý timeout phải được bảo đảm thực hiện ngay sau khi hàm sysstem call được gọi. Vì một hàm system call thực hiện quá trình polling thì không thể đi vào trạng thái WAIT do đó mà không có bất kì sự thay đồi nào về độ ưu tiên đối với task gọi nó. Trong cách hiện thực tổng quát thì nếu thời gian timeout được thiết lập là 1 thì quá trình xử lý sẽ diễn ra trong thời gian 1giây kể từ khi hàm system call được gọi. Do thời gian timeout là 0 thì không được thiết kế (vì 0 được gán cho TMO_POL ) , vì vậy mà theo cách thiết lập thời gian timeout này thì timeout không thể xảy ra ngay lúc khởi tạo thời gian sau khi hàm system call được gọi. 3.2.8 Thời gian tương đối và thời gian hệ thống Khi thời gian xảy ra của một sự kiện được thiết lập liên quan tới thời gian của một sự kiện khác giống như thời gian timeout khi mà một hàm system call được gọi thì thời gian tương đối (có kiểu là RELTIM) được sử dụng đến. Nếu thời gian tương đối được sử dụng để chỉ ra thời gian xảy ra sự thực thi của một sự kiện thì nó phải đảm bảo là quá trình xử lý sự kiện đó phải được diễn ra sau khi khoảng thời gian được thiết kế trôi qua kể từ một mốc thời gian nào đó. Thời gian tương đối cũng được sử dụng trong trường hợp một sự kiện lặp lại quá trình xử lý sau 1 khoảng thời gian hay có những thiết kế khác cùng với thời gian xảy ra sự thực thi của sự kiện đó. Và trong mỗi trường hợp trên thì sẽ có một cách xác định thời gian tương đối riêng. Khi thời gian được thiết kế như thời gian tuyệt đối thì thời gian của hệ thống ( có kiểu là SYSTIM ) sẽ được sử dụng. T-Kernel có cung cấp một hàm dùng để thiết lập thời gian của hệ thống, nhưng ngay cả khi thời gian của hệ thống được thay đổi bằng chính hàm này thì không có bất kì sự thay đổi nào đối với thời gian của thế giới thực mà tại đó thời gian để xảy ra một sự kiện mà nó được thiết kế để sử dụng thời gian tương đối. • SYSTIM : thời gian của hệ thống Thời gian dựa trên 1 mili giây, có kiểu là số nguyên có dấu 64 bit typedef struct systim { W hi; /*32 bit cao */ UW lo; /*32 bit thấp */ }SYSTIM ; • RELTIM: thời gian tương đối Thời gian dựa trên 1 mili giây, có kiểu là số nguyên không dấu 32 bit hoặc nhiều hơn. typedef UINT RELTIM; • TMO : thời gian timeout GVHD : Phạm Tường Hải Thời gian dựa trên 1 mili giây, có kiểu là số nguyên có dấu 32 bit hoặc nhiều hơn. Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL - NHỮNG ĐẶC TẢ CHUNG 122 typedef INT TMO; Quá trình chờ mãi mãi có thể được thiết kế với TMO_FEVR (= -1 ) 3.3 Thường trình hỗ trợ ngôn ngữ cấp cao T-Kernel cũng cung cấp các thường trình hỗ trợ ngôn ngữ cấp cao nhằm tách rời quá trình xử lý gắn với hạt nhân và quá trình xử lý gắn với môi trường của ngôn ngữ trong quá trình xử lý một task hay một trình xử lý được viết bằng ngôn ngữ cấp cao. Có hay không việc sử dụng chương trình con hỗ trợ ngôn ngữ cấp cao được thực hiện bằng cách thiết lập biến thuộc tính TA_HLNG của các đối tượng hoặc của các trình xử lý. Khi mà TA_HLNG không được thiết lập thì task hay trình xử lý sẽ bắt đầu sự thực thi trực tiếp của nó tại địa chỉ mà nó truyền cho hàm tk_cre_tsk hoặc tk_def_??? và ngược lại nếu như TA_HLNG đã được thiết lập thì thường trình hỗ trợ ngôn ngữ cấp cao sẽ được thực thi trước tiên , và sau đó từ chương trình con này nó sẽ thực hiện nhảy giáng tiếp tới địa chỉ đã được truyền cho hàm tk_cre_tsk hoặc tk_def_???. Từ quan điểm của hệ điều hành thì địa chỉ bắt đầu sự thực thi của task hay của trình xử lý chính là các thông số trỏ tới thường trình hỗ trợ ngôn ngữ cấp cao này. Việc tách rời giữa quá trình xử lý gắn liền với hạt nhân và quá trình xử lý gắn với môi trường của ngôn ngữ làm cho T-Kernel có khả năng hỗ trợ nhiều ngôn ngữ khác nhau. Một lợi ích nữa của việc xử dụng thường trình hỗ trợ ngôn ngữ cấp cao đó là khi ta viết các task hay các trình xử lý bằng ngôn ngữ C thì hàm system call để thoát khỏi task hoặc trở về từ trình xử lý sẽ được thực thi một cách tự động bằng câu lệnh return hoặc ‘}’ trong C. Cách thức làm việc của thường trình hỗ trợ ngôn ngữ cấp cao sẽ được minh họa cụ thể trong hình 3.1 Hình 3.1 : Cách thức hoạt động của thường trình hỗ trợ ngôn ngữ cấp cao GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS 123 Chương 4 T-KERNEL / OS FUNTIONS Chương này mô tả chi tiết các hàm system call do T-kernel Operating System cung cấp (T- kernel/OS) GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 124 4.1 Quản lý Task Đây là các hàm system call cho phép ta thao tác hay tham khảo trực tiếp các trạng thái của Task. Những hàm được cung cấp để tạo và xoá một Task, khởi động và thoát, huỷ bỏ một yêu cầu khởi động Task, thay đổi độ ưu tiên, và tham khảo trạng thái của một Task. Mỗi Task được định danh bởi một số ID gọi là Task ID . Mỗi Task có một độ ưu tiên cơ bản và độ ưu tiên hiện tại để system kiểm soát thứ tự thực thi của các Task. Thông thường khi ta chỉ nói đến độ ưu tiên của Task mà không đề cập loại ưu tiên nào thì ta ngầm hiểu là độ ưu tiên hiện tại. Độ ưu tiên cơ bản của một Task được khởi tạo là độ ưu tiên khởi động khi khởi động một Task. Khi ta không sử dụng mutex thì độ ưu tiên hiện tại cũng chính là độ ưu tiên cơ bản, do vậy độ ưu tiên hiện tại được khởi tạo trực tiếp là độ ưu tiên khởi động của Task. Kernel không thực hiện công việc giải phóng các tài nguyên do Task yêu cầu (semaphore resources, memory blocks) khi thoát Task, công việc này là nhiệm vụ của ứng dụng. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 125 tk_cre_tsk Create Task [C Language Interface] ID tskid = tk_cre_tsk ( T_CTSK * pk_ctsk ) ; [Parameters] T_CTSK * pk_ctsk Thông tin về Task được tạo Chi tiết của pk_ctsk : VP exinf Thông tin phụ được thêm vào ATR tskatr Các thuộc tính của Task FP Task Địa chỉ của Task PRI itskpri Độ ưu tiên khởi động của Task INT stksz Kích thước của stack (bytes) INT sstksz Kích thước của stack hệ thống (bytes) VP stkptr Pointer chỉ tới stack của người dùng VP uatb Bảng không gian trang của Task INT lsid ID không gian luận lý ID resid ID tài nguyên [Return Parameters] ID tskid Task ID hoặc Mã lỗi ( Error codes ) [Error Codes] E_NOMEM Thiếu bộ nhớ ( không thể định vị vùng nhớ cho khối điều khiển hay user stack) E_LIMIT Số lượng Task vượt quá giới hạn của hệ thống E_RSATR Lỗi thuộc tính E_NOSPT Chức năng không được cung cấp(khi TA_USERSTACK hay TA_TASKSPACE không được hỗ trợ) E_PAR Lỗi tham số E_ID ID tài nguyên (resid) không hợp lệ E_NOCOP Coprocessor được chỉ định không sử dụng được [Description] - Khởi tạo một Task và gán một số ID cho nó. Hàm này định vị một TCB (Task Control Block) để khởi tạo Task dựa theo các tham số itskpri, task, stksz Trạng thái của Task sau khi khởi tạo là DORMANT. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 126 - itskpri chỉ định độ ưu tiên khởi tạo tại thời điểm tạo Task. Itskpri có giá trị từ 1 đến 140, theo thứ tự độ ưu tiên giảm dần. - exinf có thể được sử dụng tự do bởi người dùng để chèn thêm thông tin về Task, và được tham khảo bằng hàm tk_ref_tsk. Nếu thông tin của Task là một vùng lớn, ứng dụng phải xin cấp phát vùng nhớ riêng biệc và đặt địa chỉ vào exinf. - tskatr cho biết các thuộc tính hệ thống trong các bit thấp của nó và thông tin hiện thực trong các bit cao. tskatr := (TA_ASM || TA_HLNG) | [TA_SSTKSZ] | [TA_USERSTACK] | [TA_TASKSPACE] | [TA_RESID] | (TA_RNG0 || TA_RNG1 || TA_RNG2 || TA_RNG3) | [TA_COP0] | [TA_COP1] | [TA_COP2] | [TA_COP3] | [TA_FPU] TA_ASM Cho biết chương trình được viết bằng hợp ngữ TA_HLNG Cho biết chương trình được viết bằng ngôn ngữ cấp cao TA_SSTKSZ Cho biết thuộc tính sstksz được sử dụng, nếu TA_SSTKSZ không được chỉ định thì sstksz sẽ bị bỏ qua và kích thước mặc dịnh sẽ được thiết đặt. TA_USERSTACK Khi thuộc tính này được chỉ định thì sstkptr sẽ hợp lệ. Trong trường hợp này OS không cung cấp stack người dùng nhưng người dùng phải xin cấp phát, và sstksz phải được thiết lập là 0. Nếu TA_USERSTACK không được chỉ định, sstkptr sẽ bị bỏ qua. Nếu TA_RNG0 được thiết lập thì TA_USERSTACK không thể được chỉ định. TA_TASKSPACE Khi thuộc tính này được chỉ định thì uatb và lisd sẽ hợp lệ và được thiết lập như là không gian của Task.Nếu TA_TASKSPACE không được chỉ định, uatb và lisd sẽ bị bỏ qua, không gian của Task sẽ không được định nghĩa. Trong suốt thời gian này, ta chỉ truy cập được không gian hệ thống. Cho dù TA_TASKSPACE được hay không được chỉ định, không gian Task vẫn có thể được thay đổi sau khi tạo Task TA_RESID Khi thuộc tính này được chỉ định thì resid sẽ hợp lệ, và chỉ ra nhóm resources nào mà Task sẽ phụ thuộc. TA_RNGn Cho biết Task chạy ở cấp bảo vệ cấp n. TA_COPn Cho biết có sử dụng Coprocessor thứ n(bao gồm floating point Coprocessor hay DSP). TA_FPU Cho biết có sử dụng FPU. #define TA_ASM 0x00000000 /* Assembly program */ #define TA_HLNG 0x00000001 /* High-level language program */ #define TA_SSTKSZ 0x00000002 /* System stack size */ #define TA_USERSTACK 0x00000004 /* User stack pointer */ #define TA_TASKSPACE 0x00000008 /* Task space pointer */ #define TA_RESID 0x00000010 /* Task resource group */ #define TA_RNG0 0x00000000 /* Run at protection level 0 */ #define TA_RNG1 0x00000100 /* Run at protection level 1 */ #define TA_RNG2 0x00000200 /* Run at protection level 2 */ #define TA_RNG3 0x00000300 /* Run at protection level 3 */ #define TA_COP0 0x00001000 /* Use ID=0 Coprocessor */ GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 127 #define TA_COP1 0x00002000 /* Use ID=1 Coprocessor */ #define TA_COP2 0x00004000 /* Use ID=2 Coprocessor */ #define TA_COP3 0x00008000 /* Use ID=3 Coprocessor */ - Khi TA_HLNG được chỉ định, khi Task bắt đầu nó sẽ nhảy đến địa chỉ của Task không trực tiếp mà thông qua sự hỗ trợ của môi trường ngôn ngữ cấp cao. Hàm xử lý Task có dạng như sau : void Task( INT stacd, VP exinf ) { /* (processing) */ tk_ext_tsk(); hoặc tk_exd_tsk(); /* Exit Task */ } Những thông số khởi động bao gồm cả mã khởi động Task stacd trong hàm tk_sta_tsk, và thông tin thêm về Task exinf. Một Task không thể kết thúc bởi một sự trả về đơn giản mà ta phải gọi các hàm khác tùy thưộc vào hiện thực. Định dạng của Task khi TA_ASM được chỉ định phụ thuộc vào sự hiện thực và các thông số cũng phải dược truyền như là thông số khởi động. - Mỗi Task chạy ở một cấp bảo vệ được chỉ định trong thuộc tính TA_RNGn. Khi một hàm system call hay hàm dịch vụ mở rộng được gọi thì cấp bảo vệ sẽ về 0, và trở lại như cũ khi các hàm được thực hiện xong. - Mỗi Task có hai vùng stack : stack hệ thống và stack người dùng, Stack người dùng được sử dụng ở cấp bảo vệ được chỉ định trong TA_RNGn, trong khi stack hệ thống được sử dụng ở cấp bảo vệ 0. Khi TA_RNG0 được chỉ định thì cả hai stack sẽ được nhập lại làm một stack. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 128 tk_del_tsk Delete Task [C Language Interface] ER ercd = tk_del_tsk ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] ER ercd Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của Task không phải là DORMANT [Description] - Xóa bỏ Task có ID là tskid . - Hàm system call này thay đổi trạng thái của Task từ DORMANT thành NON-EXSTENT (không còn tồn tại trong hệ thống ), giải phóng TCB và vùng stack. Task ID cũng được giải phóng. Khi trạng thái Task không là DORMANT mà gọi hàm này thì mã lỗi E_OBJ sẽ được trả về. - Hàm này không thể xóa bỏ Task gọi nó, bởi vì Task gọi nó không nằm trong trạng thái DORMANT. Ta sẽ dùng hàm tk_exd_tsk để xóa bỏ chính nó. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 129 tk_sta_tsk Start Task [C Language Interface] ER ercd = tk_sta_tsk ( ID tskid, INT stacd ) ; [Parameters] ID tskid Task ID INT stacd Mã khởi động Task [Return Parameters] ER ercd Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của Task không phải là DORMANT [Description] - Khởi động Task có ID là tskid . - Hàm system call này thay đổi trạng thái của Task từ DORMANT thành READY. Những thông số được truyền cho Task khi khởi động được thiết lập trong stacd. Những thông số này có thể được tham khảo từ Task được khởi động , có thể sử dụng đặc điểm này cho việc truyền nhận thông điệp đơn giản. - Độ ưu tiên của Task được chỉ định trong thuộc tính itskpri khi khởi tao Task đó. - Các yêu cầu khởi động Task được gọi bởi hàm này không được xếp hàng. Nếu Task đích không nằm trong trạng thái DORMANT thì mã lỗi E_OBJ sẽ được trả về cho Task goi hàm này. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 130 tk_ext_tsk Exit Task [C Language Interface] void tk_sta_tsk ( ) ; [Description] - Hàm system call này làm nhiệm vụ yêu cầu hệ thống làm thoát Task gọi nó và chuyển trạng thái của Task đó thành DORMANT. - Khi một Task kết thúc bởi hàm tk_ext_tsk ( ) , những tài nguyên do Task đang nắm giữ sẽ không tự động được giải phóng, mà người dùng phải tự giải phóng chúng. - Khi trạng thái của Task chuyển xuống DORMANT thì độ ưu tiên và những thông tin khác trong TCB sẽ được tái khởi tạo. tk_exd_tsk Exit and DeleteTask [C Language Interface] void tk_sta_tsk ( ) ; [Description] - Hàm system call này làm nhiệm vụ yêu cầu hệ thống kết thúc thực thi chính Task gọi nó xóa bỏ Task, khi đó trang thái của Task đó là NON-EXISTENT (không còn tồn tại trên hệ thống). - Khi một Task kết thúc bởi hàm tk_exd_tsk ( ) , những tài nguyên do Task đang nắm giữ sẽ không tự động được giải phóng, mà người dùng phải tự giải phóng chúng. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 131 tk_ter_tsk Terminate Task [C Language Interface] ER ercd = tk_ter_tsk ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] ER ercd Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của Task không phải là DORMANT [Description] - Kết thúc sự thực thi của Task có ID là tskid . - Hàm system call này thay đổi trạng thái của Task có ID là tskid thành DORMANT. - Ngay cả khi Task đích đang ở trạng thái đợi (bao gồm cả trạng thái SUSPEND) hay nằm trong các hàng đợi (semaphore, message ), thì nó được giải phóng khỏi trạng thái đợi và bị kết thúc. - Hàm này không thể kết thúc chính nó. Nếu Task gọi hàm được chỉ định là Task đích thì mã lỗi E_OBJ sẽ được trả về cho Task goi hàm này. - Mối quan hệ giữa trạng thái của Task đích và kết quả trở về của hàm tk_ter_tsk được tóm tắt trong bảng 4.1 Trạng thái của Task đích Mã lỗi trả về của tk_ter_tsk Kết quả thực thi của hàm RUN hoặc READY (ngoại trừ Task gọi hàm) E_OK Kết thúc thực thi Task đích RUN (Task gọi hàm) E_OBJ Không thực hiện WAIT E_OK Kết thúc thực thi Task đích DORMANT E_OBJ Không thực hiện NON-EXISTENT E_NOEXS Không thực hiện Bảng 4.1: Trạng thái của Task đích và kết quả thực thi (tk_ter_tsk) - Khi một Task kết thúc bởi hàm tk_ext_tsk ( ) , những tài nguyên do Task đang nắm giữ sẽ không tự động được giải phóng, mà người dùng phải tự giải phóng chúng. - Khi trạng thái của Task chuyển xuống DORMANT thì độ ưu tiên và những thông tin khác trong TCB sẽ được tái khởi tạo. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 132 tk_chg_pri Change Task Priority [C Language Interface] ER ercd = tk_chg_pri ( ID tskid, PRI tskpri ) ; [Parameters] ID tskid Task ID PRI tskpri Độ ưu tiên mới của Task [Return Parameters] ER ercd Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_PAR Lỗi tham số (tskpri không hợp lệ hay không được dùng) E_ILUSE tskpri vượt quá giới hạn của hệ thống [Description] - Thay đổi độ ưu tiên cơ bản có Task ID la tskid đến giá trị được chỉ định trong tskpri, đồng thời độ ưu tiên hiện tại của Task cũng thay đổi theo. - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên , khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - Khi TPRI_INI (= 0) được gán cho tskpri, thì độ ưu tiên cơ bản của Task đích bị thay dổi về giá trị khởi tạo khi Task được bắt đầu thực thi ( itskpri ). - Độ ưu tiên bị thay đổi bởi hàm này vẫn có giá trị cho tới khi Task bị kết thúc (terminated). Khi một Task trở lại trạng thái DORMANT, độ ưu tiên của Task trước khi thoát bị loại bỏ và khi đó nó sẽ được thiết lập lại giá trị khởi tạo khi Task dó được bắt đầu thực thi ( itskpri ). Tuy nhiên sự thay đổi độ ưu tiên trong khi Task đang ở trong trạng thái DORMANT sẽ có hợp lệ khi nó được khởi động vào lần kế tiếp. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 133 tk_chg_slt Change Task Slicetime [C Language Interface] ER ercd = tk_chg_pri ( ID tskid, RELTIM slicetime ) ; [Parameters] ID tskid Task ID RELTIM slicetime Khe thời gian ( Time slice) [Return Parameters] ER ercd Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_PAR Lỗi tham số (slicetime không hợp lệ hay không được dùng) [Description] - Thay đổi khe thời gian của một Task có Task ID la tskid bằng giá trị được chỉ định trong slicetime, chức năng khe thời gian được sử dụng trong việc định thời các Task theo Round Robin. Khi một Task thực thi liên tục trong một khoảng thời gian là slicetime hay dài hơn , độ ưu tiên (thứ tự thực thi trước sau) của nó chuyển về thấp nhất giữa các Task có cùng độ ưu tiên (Priority), và tự động nhường sự thực thi cho Task kế tiếp. - Thiết lập slicetime = 0 cho biết thời gian không giới hạn, và Task sẽ không tự động nhường sự thực thi của nó cho Task khác. - Khi một Task được khởi tạo thì slicetime của nó được thiết lập mặc định là 0. - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên , khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - Khe thời gian bị thay đổi bởi hàm này vẫn có giá trị cho tới khi Task bị kết thúc (terminated). Khi một Task trở lại trạng thái DORMANT, khe thời gian của Task trước khi thoát bị loại bỏ và khi đó nó sẽ được thiết lập lại giá trị khởi tạo khi Task đó được bắt đầu thực thi ( slicetime = 0 ). Tuy nhiên sự thay đổi độ ưu tiên trong khi Task đang ở trong trạng thái DORMANT sẽ có hợp lệ khi nó được khởi động vào lần kế tiếp. - Một Task bị tước đoạt sự thực thi bởi một Task có độ ưu tiên cao hơn thì thời gian thực thi của nó sẽ bị bỏ qua và chỉ được đếm lại từ đầu trong lần thực thi kế tiếp. - Nếu Task đích là Task duy nhất đang thực thi tại độ ưu tiên của nó thì khe thời gian sẽ không có ý nghĩa, và Task đó được thực thi liên tục. - Nếu trong nhiều Task có cùng độ ưu tiên có một Task mà slicetime = 0, thì Task đó sẽ được thực thi ngay khi có thể và định thời theo Round Robin cũng kết thúc. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 134 tk_get_tsp Get Task Space [C Language Interface] ER ercd = tk_get_tsp ( ID tskid, T_TSKSPC * pk_tskspc ) ; [Parameters] ID tskid Task ID [Return Parameters] ER ercd Mã lỗi (Error Codes) T TSKSPC tskspc Thông tin về không gian của Task typedef struct t_tskspc { VP uatb; Địa chỉ bảng trang của không gian Task INT lsid; ID luận lý của không gian Task } T_TSKSPC; [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_PAR Lỗi tham số (địa chỉ trả về không dùng được) [Description] - Thu thập thông tin hiện tại của một Task có Task ID la tskid. - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên , khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 135 tk_set_tsp Set Task Space [C Language Interface] ER ercd = tk_set_tsp ( ID tskid, T_TSKSPC * pk_tskspc ) ; [Parameters] ID tskid Task ID T_TSKSPC tskspc Thông tin về không gian ca Task typedef struct t_tskspc { VP uatb; Địa chỉ bảng trang của không gian Task INT lsid; ID luận lý của không gian Task } T_TSKSPC; [Return Parameters] ER ercd Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_PAR Lỗi tham số (địa chỉ trả về không dùng được) [Description] - Thiết lập thông tin hiện tại của một Task có Task ID la tskid. - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên , khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - OS không quan tâm đến hậu quả của những thay đổi không gian Task. Ví dụ, không gian của một Task bị thay đổi trong khi Task đó đang sử dụng nó để thực thi thì Task đó có thể bị treo hay đụng độ những vấn đề khác. Chương trình phải có trách nhiệm tránh những vấn đề trên. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 136 tk_get_rid Get Task Resource ID [C Language Interface] ID resid = tk_get_rid ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] ID resid ID của nhóm tài nguyên hoặc Mã lỗi (Error Code) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Task không phụ thuộc một nhóm tài nguyên nào [Description] - Trả về ID của nhóm tài nguyên của một Task có Task ID là tskid thuộc về. - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên , khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - Nếu nhóm tài nguyên đó đã bị xóa bỏ , thì hàm system call này có thể trả về ID của nhóm tài nguyên đã bị xóa. Mã lỗi E_OBJ được trả về hay không là phụ thuộc vào sự hiện thực. (Xem tk_cre_res, tk_del_res. ) GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 137 tk_set_rid Set Task Resource ID [C Language Interface] ID oldid = tk_set_rid ( ID tskid, ID resid ) ; [Parameters] ID tskid Task ID ID resid ID của nhóm tài nguyên mới [Return Parameters] ID oldid ID của nhóm tài nguyên cũ hoặc Mã lỗi (Error Code) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid hay resid không tồn tại [Description] - Thay đổi nhóm tài nguyên hiện tại của một Task có Task ID là tskid bằng một nhóm tài nguyên mới có ID là resid, đồng thời trả về giá trị ID của nhóm tài nguyên cũ. - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên , khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - Trong một số trường hợp lỗi không được trả về cho dù resid đã bi xóa. Mã lỗi E_NOEXS được trả về hay không là phụ thuộc vào sự hiện thực. Theo nguyên tắc thì chương trình gọi không được chỉ định nhóm tài nguyên mới là nhóm đã bị xóa bỏ. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 138 tk_get_reg Get Task Registers [C Language Interface] ER ercd = tk_get_reg ( ID tskid, T_REGS *pk_regs, T_EIT *pk_eit, T_CREGS *pk_cregs ) ; [Parameters] ID tskid Task ID [Return Parameters] T_REGS pk_regs Thanh ghi công dụng chung T_EIT pk_eit Lưu các thanh ghi khi EIT xảy ra T_CREGS pk_cregs Thanh ghi điều khiển ER ercd Mã lỗi Nội dung của T_REGS, T_EIT, và T_ CREGS được định nghĩa cho mỗi CPU và s . ự hiện thực [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho Task gọi hàm) E_CTX Lỗi ngữ cảnh ( gọi từ Task-independent portion) [Description] - Thu thập nội dung các thanh ghi của một Task có Task ID là tskid. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 139 tk_set_reg Set Task Registers [C Language Interface] ER ercd = tk_set_reg ( ID tskid, T_REGS *pk_regs, T_EIT *pk_eit, T_CREGS *pk_cregs ) ; [Parameters] ID tskid Task ID [Return Parameters] T_REGS pk_regs Thanh ghi công dụng chung T_EIT pk_eit Lưu các thanh ghi khi EIT xảy ra T_CREGS pk_cregs Thanh ghi điều khiển ER ercd Mã lỗi Nội dung của T_REGS, T_EIT, và T_ CREGS được định nghĩa cho mỗi CPU và sự hiện thực. [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho Task gọi hàm) E_CTX Lỗi ngữ cảnh ( gọi từ Task-independent portion) E_PAR Giá trị các thanh ghi không hợp lệ ( phụ thuộc vào sự hiện thực) [Description] - Thiết lập nội dung các thanh ghi của một Task có Task ID là tskid. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 140 tk_get_cpr Get Task Coprocessor Registers [C Language Interface] ER ercd = tk_get_cpr ( ID tskid, INT copno, T_COPREGS *pk_copregs ) ; [Parameters] ID tskid Task ID INT copno Số Coprocessor (0 to 3) [Return Parameters] T_COPREGS pk copregs Thanh ghi Coprocessor ER ercd Mã lỗi typedef union { T_COP0REG cop0; Coprocessor number 0 register T_COP1REG cop1; Coprocessor number 1 register T_COP2REG cop2; Coprocessor number 2 register T_COP3REG cop3; Coprocessor number 3 register } T_COPREG; Nội dung của T_COPnREG được định nghĩa cho mỗi CPU và s . ự hiện thực [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho Task gọi hàm) E_CTX Lỗi ngữ cảnh ( gọi từ Task-independent portion) E_PAR Lỗi tham số [Description] - Thu thập nội dung các thanh ghi được chỉ định trong copno của một Task có Task ID là tskid. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 141 tk_set_cpr Set Task Coprocessor Registers [C Language Interface] ER ercd = tk_get_cpr ( ID tskid, INT copno, T_COPREGS *pk_copregs ) ; [Parameters] ID tskid Task ID INT copno Số Coprocessor (0 to 3) T_COPREGS pk_copregs Thanh ghi Coprocessor [Return Parameters] ER ercd Mã lỗi [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho Task gọi hàm) E_CTX Lỗi ngữ cảnh ( gọi từ Task-independent portion) E_PAR Lỗi tham số [Description] - Thiết lập nội dung các thanh ghi được chỉ định trong copno của một Task có Task ID là tskid. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 142 tk_get_tsk Get Task Information [C Language Interface] ER ercd = tk_inf_tsk ( ID tskid, T_ITSK * pk_itsk, BOOL clr ) ; [Parameters] ID tskid Task ID T_ITSK* pk_itsk Địa chỉ của gói thông tin về Task để trả về BOOL clr Xóa thông tin về Task [Return Parameters] ER ercd Mã lỗi Chi tiết của pk_itsk : RELTIM stime Th (ms) ời gian chạy tích lũy ở cấp hệ thống RELTIM utime Th người dùng (ms) ời gian chạy tích lũy ở cấp [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_PAR Lỗi tham số (địa chỉ của gói thông tin trả về không dùng được) [Description] - Thu thập các thông tin thống kê của một Task có Task ID là tskid. - Nếu clr = TRUE (≠ 0) , thì thông tin tích lũy thì được khởi tạo lại giá trị ban đầu sau khi thu thập thông tin. - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên, khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - Thời gian chạy ở cấp hệ thống là thời gian mà Task chạy ở cấp bảo vệ 0 (TA_RNG0), còn thời gian chạy ở các cấp bảo vệ khác được tính cho thời gian chạy ở cấp ngừơi dùng.Do vậy khi một Task được tạo và chạy ở cấp bảo vệ 0 (TA_RNG0) thì thời gian chạy chủ yếu là thời gian ở cấp hệ thống. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 143 tk_ref_tsk Reference Task Status [C Language Interface] ER ercd = tk_ref_tsk ( ID tskid, T_RTSK * pk_rtsk ) ; [Parameters] ID tskid Task ID T_RTSK* pk_rtsk Địa chỉ của gói thông tin về Task để trả về [Return Parameters] ER ercd Mã lỗi Chi tiết pk_rtsk : VP exinf thông tin thêm về Task PRI tskpri Độ ưu tiên hiện tại của Task PRI tskbpri Độ ưu tiên cơ bản UINT tskstat Trạng thái của Task UINT tskwait Thừa số đợi ID wid ID của đối tượng đang đợi INT wupcnt Số lượng yêu cầu đánh thức INT suscnt Số lượng yêu cầu suspend RELTIM slicetime Th (ms) ời gian thực thi liên tục tối đa cho phép UINT waitmask Thừa số hủy đợi UINT texmask Cho phép những ngoại lệ xuất hiện UINT tskevent Sự kiện của Task (Những tham số khác tùy theo hiện thực có thêm vào sau) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_PAR Lỗi tham số (địa chỉ của gói thông tin trả về không dùng được) [Description] - Thu thập trạng thái của một Task có Task ID là tskid. - Thuộc tính tskstat có thể có những giá trị sau đây : tskstat: TTS_RUN 0x0001 RUN TTS_ RDY 0x0002 READY TTS_ WAI 0x0004 WAIT TTS_ SUS 0x0008 SUSPEND GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - QUẢN LÝ TASK 144 TTS_ WAS 0x000c WAIT-SUSPEND TTS_ DMT 0x0010 DORMANT TTS_ NODISWAI 0x0080 Trạng thái WAIT bị vô hiệu - Khi hàm tk_ref_tsk được thực thi trong một interrupted task từ một chương trình quản ký interrupt thì RUN sẽ được trả về cho tskstat. - Khi tskstat là TTS_WAI (bao gồm cả TTS_WAS), giá trị của tskwait và wid được mô tả như sau: tskwait Giá trị Mô tả wid TTW_SLP 0x00000001 Đợi do tk_slp_tsk 0 TTW_DLY 0x00000002 Đợi do tk_dly_tsk 0 TTW_SEM 0x00000004 Đợi do tk_wai_sem semid TTW_FLG 0x00000008 Đợi do tk_wai_flg flgid TTW_MBX 0x00000040 Đợi do tk_rcv_mbx mbxid TTW_MTX 0x00000080 Đợi do tk_loc_mtx mtxid TTW_SMBF 0x00000100 Đợi do tk_snd_mbf mbfid TTW_RMBF 0x00000200 Đợi do tk_rcv_mbf mbfid TTW_CAL 0x00000400 Đợi do gọi rendezvous porid TTW_ACP 0x00000800 Đợi do chấp nhận rendezvous phorid TTW_RDV 0x00001000 Đợi do hoàn thành rendezvous 0 (TTW_CAL|TTW_RDV) 0x00001400 Đợi do gọi rendezvous hay do hoàn thành rendezvous 0 TTW_MPF 0x00002000 Đợi do tk_get_mpf mpfid TTW_MPL 0x00004000 Đợi do tk_get_mpl mplid TTW_EV1 0x00008000 Đợi do task event #1 0 TTW_EV2 0x00010000 Đợi do task event #2 0 TTW_EV3 0x00020000 Đợi do task event #3 0 TTW_EV4 0x00040000 Đợi do task event #4 0 TTW_EV5 0x00080000 Đợi do task event #5 0 TTW_EV6 0x00100000 Đợi do task event #6 0 TTW_EV7 0x00200000 Đợi do task event #7 0 TTW_EV8 0x00400000 Đợi do task event #8 0 Bảng 4.2: Giá trị của tskwait và wid - Khi tskstat không là TTS_WAI (bao gồm cả TTS_WAS), giá trị của tskwait và wid đều bằng 0. Nếu trạng thái của Task là DORMANT thì wupcnt = 0, suscnt = 0, and tskevent = 0 - Khi TSK_SELF (= 0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm. Tuy nhiên , khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - Khi Task đích không tồn tại thì mã lỗi E_NOEXS được trả về. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 145 4.2 Đồng Bộ Task-Dependent Các hàm đồng bộ Task-Dependent nhằm đạt tới sự đồng bộ giữa các Task bằng các thao tác trực tiếp lên trạng thái của các Task. Những hàm được cung cấp để đưa Task về trạng thái nghỉ (sleep)hay đánh thức (wakeup) một Task; hủy bỏ các yêu cầu đánh thức Task; giải phóng Task khỏi trạng thái WAIT một cách bắt buộc; chuyển trạng thái của Task về trạng thái SUSPEND; trì hoãn sự thực thi của một Task; hoặc làm vô hiệu trạng thái WAIT của một Task. Các yêu cầu đánh thức cho một Task thì được xếp trong hàng đợi (queue). Điều này có nghĩa là khi nó cố gắng đánh thức một Task mà Task này không ở trạng thái nghỉ thì các yêu cầu đánh thức này được ghi nhớ, và khi Task đó đi vào trang thái nghỉ ở lần kế tiếp (đang đợi để thức dậy) thì nó sẽ không chuyển về trạng thái nghỉ đó. Hàng đợi các yêu cầu đánh thức được nhận ra bởi mỗi Task có một số đếm để chứa số các yêu cầu đánh thức được xếp hàng, khi Task được khởi động số đếm này được xoá về 0. Và các yêu cầu làm treo (suspend) một Task cũng được xếp hàng tương tự như WAIT. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 146 tk_slp_tsk SleepTask [C Language Interface] ER ercd = tk_slp_tsk ( TMO tmout ) ; [Parameters] TMO tmout Thời gian Timeout được chỉ định [Return Parameters] ER ercd Mã lỗi ( Error codes ) [Error Codes] E_OK Kết thúc bình thường E_PAR Lỗi tham số ( tmout ≤ (-2)) E_RLWAI Trạng thái WAIT của Task được giải phóng ( do Task nhận được tk_rel_wai khi đang ở trạng thái WAIT) E_DISWAI Trạng thái WAIT của Task được giải phóng bởi trạng thái WAIT của Task bị vô hiệu E_TMOUT Thăm dò bị lỗi hay timeout E_CTX Lỗi ngữ cảnh ( hàm được gọi từ một Task độc lập với ngữ cảnh hay dispatch bị vô hiệu) [Description] - Thay đổi trạng thái của Task gọi hàm từ trạng thái RUN thành trạng thái nghỉ ( WAIT, đợi cho tới khi được đánh thức bởi hàm tk_wup_tsk từ một Task khác). - Nếu một Task khác gọi hàm tk_wup_tsk đánh thức Task gọi hàm tk_slp_tsk trước thời gian timeout (tmout), thì hàm tk_slp_tsk sẽ kết thúc bình thường. Nếu thời gian timeout đến trước khi hàm tk_wup_tsk được gọi thì mã lỗi E_TMOUT sẽ được trả về. - Nếu chỉ định tmout = TMO_FEVR = (-1) thì Task gọi hàm sẽ đợi vô tận cho tới khi được đánh thức bởi hàm tk_wup_tsk từ một Task khác. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 147 tk_wup_tsk WakeupTask [C Language Interface] ER ercd = tk_wup_tsk ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] ER ercd Mã lỗi ( Error codes ) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_PAR Lỗi tham số ( tmout ≤ (-2)) E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( đánh thức chính Task gọi hàm hay đánh thức một Task đang ở trạng thái DORMANT) E_QOVR Hàng đợi các yêu cầu đánh thức bị tràn (quá nhiều yêu cầu đánh thức được xếp hàng trong wupcnt) [Description] - Nếu Task được chỉ định trong tskid được đặt trong trạng thái WAIT bởi hàm tk_slp_tsk, thì hàm tk_wup_tsk sẽ giải phóng trạng thái WAIT cho Task đó. - Hàm system call này không thể được gọi cho chính Task gọi nó, nếu không thì lỗi E_OBJ sẽ được trả về. - Nếu Task đích không gọi hàm tk_slp_tsk và không ở trạng thái WAIT thì các yêu cầu đánh thức bởi hàm tk_wup_tsk sẽ được lưu nhớ trong hàng đợi thông qua một biến đếm (wupcnt) các yêu cầu đánh thức mà chưa được thực hiện. Mỗi Task đều lưu trữ wupcnt trong TCB của nó, và giá trị khởi tạo (khi hàm tk_sta_tsk được thực thi) cho wupcnt là 0. Khi hàm tk_wup_tsk yêu cầu đánh thức một Task mà Task đó không ở trong trạng thái WAIT thì wupcnt sẽ tăng lên 1,ngược lại mỗi khi hàm tk_slp_tsk được thự thi thì wupcnt sẽ giảm 1 và Task đó sẽ không đi vào trạng thái WAIT. Khi hàm tk_slp_tsk được thực thi trong khi wupcnt của Task đó bằng 0, thì wupcnt sẽ không thay đổi và Task đó sẽ đi vào trạng thái WAIT. - Khi việc gọi hám tk_wup_tsk làm cho wupcnt vượt quá giới hạn cho phép, lỗi E_QOVR sẽ được trả về. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 148 tk_can_wup Cancel WakeupTask [C Language Interface] INT wupcnt = tk_can_wup ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] INT wupcnt Số lượng các yêu cầu đánh thức đang đợi thực thi hoặc Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_PAR Lỗi tham số ( tmout ≤ (-2)) E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( đánh thức chính Task gọi hàm hay đánh thức một Task đang ở trạng thái DORMANT) [Description] - Hàm system call này trả về giá trị wupcnt của Task được chỉ định trong tskid, đồng thời hủy bỏ tất cả các yêu cầu đánh thức Task đó và xóa giá trị wupcnt của nó về 0. - Khi TSK_SELF (=0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm.Tuy nhiên, khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 149 tk_rel_wai Realease Wait [C Language Interface] ER ercd = tk_rel_wai ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] ER ercd Mã lỗi ( Error codes ) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho một Task khôngở trong trạng thái WAIT hay gọi cho chính Task gọi hàm hay cho một Task đang ở trạng thái DORMANT) [Description] - Nếu Task được chỉ định trong tskid đang ở trong một vài loại của trạng thái đợi (không bao gồm trạng thái SUSPEND) thì hàm tk_rel_wai sẽ giải phóng trạng thái đợi cho Task đó. - Hàm system call này trả về mã lỗi E_RLWAI cho Task được giải phóng trạng thái WAIT. - Các yêu cầu giải phóng trạng thái đợi bởi hàm tk_rel_wai thì không được ghi nhớ như hàm tk_wup_tsk. - Hàm system call tk_rel_wai không giải phóng trạng thái SUSPEND. Nếu nó được gọi cho Task đanh ở trạng thái WAIT-SUSPEND, Task đó sẽ vào trạng thái SUSPEND. Nếu cần thiết giải phóng trạng thái SUSPEND, thì hàm tk_frsm_tsk sẽ được dùng. Trạng thái của Task đích khi hàm tk_rel_wai được gọi và kết quả của nó trong mỗi trạng thái được mô tả trong bảng 4.3 Trạng thái của Task đích tk_rel_tsk ercd Parameter Xử lý Trạng thái thực thi (RUN, READY) (không cho Task gọi hàm) E_OBJ Không xử lý Trạng thái RUN (cho Task gọi hàm) E_OBJ Không xử lý Trạng thái WAIT E_OK Giải phóng trạng thái đợi Trạng thái DORMANT E_OBJ Không xử lý Trạng thái NON-EXISTENT E_OBJ Không xử lý *Mã lỗi E_RLWAI được trả về cho Task đích mà không cần sự cấp phát gì về tài nguyên. Bảng 4.3: Trạng thái của Task và kết quả của sự thực thi hàm tk_rel_wai GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 150 tk_sus_tsk Suspend Task [C Language Interface] ER ercd = tk_sus_tsk ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] ER ercd Mã lỗi ( Error codes ) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho chính Task gọi hàm hay cho một Task đang ở trạng thái DORMANT) E_CTX Lỗi ngữ cảnh ( hàm được gọi từ một Task độc lập với ngữ cảnh hay dispatch bị vô hiệu) E_QOVR Hàng đợi các yêu cầu suspend bị tràn (quá nhiều yêu cầu suspend được xếp hàng trong suscnt) hay hệ thống không cho phép các yêu cầu suspend lồng lên nhau [Description] - Đặt trạng thái của một Task được chỉ định trong tskid vào trạng thái SUSPEND và ngắt sự thực thi của Task đó. - Trạng thái SUSPEND được giải phóng bằnh cách gọi các hàm system call tk_rsm_tsk hay tk_frsm_tsk. - Nếu tk_sus_tsk được gọi cho một Task đang ở trạng thái WAIT, thì Task đó sẽ đi vào trạng thái WAIT-SUSPEND. Và nếu sau đó khi các điều kiện giải phóng Task được thỏa mãn thì Task đó sẽ đi vào trạng thái SUSPEND. Nếu tk_rsm_tsk được gọi cho một Task đang ở trạng thái WAIT- SUSPEND,Task đó sẽ trở lại trạng thái WAIT. - Khi tk_sus_tsk được gọi nhiều lần cho cùng một Task, Task đó sẽ được đặt trong trạng thái SUSPEND nhiều lần (xếp lồng lên nhau). Điều này có nghĩa là để Task đó trở về trạng thái ban đầu của nó chỉ khi nào hàm tk_rsm_tsk được gọi cho nó bằng với số lần mà tk_sus_tsk đã gọi (susnt). Do đó , bộ xếp lồng của cặp tk_sus_tsk --- tk_rsm_tsk là có thể. - Các yêu cầu suspend được xếp lồng và giới hạn của nó là phụ thuộc vào sự hiện thực. - Các mã lỗi trả về được mô tả trong phần Error Codes. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 151 tk_rsm_tsk tk_frsm_tsk Resume Task Force Resume Task [C Language Interface] ER ercd = tk_rsm_tsk ( ID tskid ) ; ER ercd = tk_frsm_tsk ( ID tskid ) ; [Parameters] ID tskid Task ID [Return Parameters] ER ercd Mã lỗi ( Error codes ) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho một Task không ở trong trạng thái SUSPEND hay gọi cho chính Task gọi hàm hay cho một Task đang ở trạng thái DORMANT) [Description] - Hàm system call tk_rel_wai giải phóng trạng thái SUSPEND của một Task được chỉ định trong tskid. - Nếu Task đích sớm được đặt trong trạng thái SUSPEND bởi hàm systemcall tk_sus_tsk, thì hàm system call này sẽ giải phóng trạng thái SUSPEND và khôi phục sự thực thi của Task đó. - Nếu nó được gọi cho Task đanh ở trạng thái WAIT-SUSPEND, Task đó sẽ vào trạng thái WAIT. - Hàm system call này không thể gọi cho chính Task gọi nó, nếu không mã lỗi E_OBJ sẽ được trả về. - Khi hàm tk_rsm_tsk thực thi một lần thì chỉ giải phóng một yêu cầu suspend được lồng lên nhau (suspend nhiều lần). Nếu hàm tk_sus_tsk được gọi nhiều lần để suspend Task đích (suscnt ≥ 2), thì Task đích vẫn ở trong trạng thái SUSPEND sau khi hàm tk_rsm_tsk được thực thi. Ngược lại khi ta gọi hàm tk_frsm_tsk thì tất cả các yêu cầu suspend lồng nhau đều bị xóa bỏ ngay cả khi suscnt = 1. - Sau khi một Task ở trạng thái RUN hay READY bị đặt trong trạng thái SUSPEND bởi hàm tk_sus_tsk và được khôi phục lại bởi hàm tk_rsm_tsk hay tk_frsm_tsk, thì Task đó sẽ có thứ tự (precedence) thực thi thấp nhất giữa các Task có cùng độ ưu tiên. Ví dụ các hàm system call sau được thực thi cho Task A và Task B có cùng độ ưu tiên và kết quả của nó như sau: GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 152 tk_sta_tsk (tskid=task_A, stacd_A); tk_sta_tsk (tskid=task_B, stacd_B); /* Theo luật của FCFS, thứ tự thực thi là task_A --> task_B. */ tk_sus_tsk (tskid=task_A); tk_rsm_tsk (tskid=task_A); /* Trong trường hợp này, th task_A --> task_B. */ ứ tự thực thi là tk_dly_tsk Delay Task [C Language Interface] ER ercd = tk_dly_tsk ( RELTIM dlytim ) ; [Parameters] RELTIM dlytim Thời gian làm trễ [Return Parameters] ER ercd Mã lỗi ( Error codes ) [Error Codes] E_OK Kết thúc bình thường E_NOMEM Thiếu bộ nhớ E_PAR Lỗi tham số ( dlytim không hợp lệ) E_RLWAI Trạng thái WAIT của Task được giải phóng ( do Task nhận được tk_rel_wai khi đang ở trạng thái WAIT) E_DISWAI Trạng thái WAIT của Task được giải phóng bởi trạng thái WAIT của Task bị vô hiệu E_CTX Lỗi ngữ cảnh ( hàm được gọi từ một Task độc lập với ngữ cảnh hay dispatch bị vô hiệu) [Description] - Tạm thời làm ngưng sự thực thi của Task gọi hàm system call này và đợi cho tới khi thời gian dlytim kết thúc. Trạng thái của Task trong khi đợi thời gian trễ là trạng thái WAIT và có thể được giải phóng bởi hàm tk_rel_wai. - Nếu trạng thái của Task trong khi đợi thời gian trễ là trạng thái WAIT-SUSPEND hay SUSPEND thì thời gian vẫn tiếp tục được đếm trong trạng thái SUSPEND. - Đơn vị của dlytim cũng tương tự như thời gian của hệ thống (= 1 ms). - Hàm system call này khác với hàm tk_slp_tsk về sự kết thúc bình thường của nó, không có mã lỗi trả về khi thời gian trễ hay hàm tk_dly_tsk kết thúc. Hơn thế, trạng thái đợi sẽ không GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 153 được giải phóng bởi hàm tk_wup_tsk trong suốt thời gian làm trễ. Chỉ có một cách duy nhất để kết thúc tk_dly_tsk trước khi thời gian làm trễ kết thúc bằng cách gọi hàm tk_ter_tsk hay tk_rel_wai. tk_sig_tev Signal Task Event [C Language Interface] ER ercd = tk_sig_tev ( ID tskid, INT tskevt ) ; [Parameters] ID tskid Task ID INT tskevt Số của task event [Return Parameters] ER ercd Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_PAR Lỗi tham số ( tskevt không hợp lệ) E_NOEXS Task được chỉ định trong tskid không tồn tại E_OBJ Trạng thái của đối tượng không hợp lệ ( gọi cho một Task đang ở trạng thái DORMANT) [Description] - Gửi một task event tskevt đến một Task được chỉ định trong tskid. Có tất cả 8 loại task event cho mỗi task và được đánh số từ 1 đến 8. - Số lượng task event đã gửi không được lưu trữ, chỉ có hay không có task event xuất hiện hay không. - Khi TSK_SELF (=0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm.Tuy nhiên, khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- independent portion, thì mã lỗi E_ID sẽ được trả về. - Các hàm task event được sử dụng cho sự đồng bộ hóa cũng giống như hàm tk_slp_tsk và tk_wup_tsk, nhưng khán nhau về cách sử dụng như sau: o Số lượng yêu cầu đánh thức (task event) không được lưu trữ. o Các yêu cầu đánh thức có thể được phân loại thành tám loại event. - Thông thường các hàm task event được sử dung trong middleware, và không nên dùng trong các ứng dụng thông thường. Sử dụng tk_slp_tsk và tk_wup_tsk được đề nghị cho các ứng dung thông thường. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 154 tk_wai_tev Wait Task Event [C Language Interface] INT tevptn = tk_wai_tev ( INT waiptn, TMO tmout ) ; [Parameters] INT waiptn Mẫu task event TMO tmout Thời gian timeout [Return Parameters] INT tevptn Trạng thái của task event khi đợi được giải phóng hoặc Mã lỗi ( Error codes ) [Error Codes] E_OK Kết thúc bình thường E_PAR Lỗi tham số ( dlytim không hợp lệ) E_TMOUT Thăm dò bị lỗi hay timeout E_RLWAI Trạng thái WAIT của Task được giải phóng ( do Task nhận được tk_rel_wai khi đang ở trạng thái WAIT) E_DISWAI Trạng thái WAIT của Task được giải phóng bởi trạng thái WAIT của Task bị vô hiệu E_CTX Lỗi ngữ cảnh ( hàm được gọi từ một Task độc lập với ngữ cảnh hay dispatch bị vô hiệu) [Description] - Đợi cho tới khi xuất hiện một trong những task event được chỉ định trong waiptn. - Khi trạng thái đợi được giải phóng bởi task event, những task event được chỉ định trong waiptn thì được xóa (task event &= ~waipnt). - Trạng thái của task event xuất hiện khi trạng thái đợi được giải phóng (trước khi bị xóa) được trả về thông qua tham số tevptn. - Tham số waipnt và tevpnt chứa giá trị của phép OR luận lý của các bit cho mỗi task event trong dạng 1<< (số của task event – 1). - Một thời gian đợi tối đa (timeout) có thể được thiết lập trong tmout. Nếu bị timeout trước khi điều kiện giải phóng đợi thỏa mãn (tk_sig_tev không được thực thi), thì hàm system call này sẽ kết thúc, và trả về mã lỗi E_TMOUT. Chỉ có giá trị dương mới được gán cho tmout. Đơn vị của timeout là ms. Khi TMO_POL = 0 được gán cho tmout, thì mã lỗi E_TMOUT được trả về mà không vào trạng thái WAIT ngay cả khi không có tsk event xuất hiện. Khi TMO_FEVR = -1 được gán cho tmout, thì task sẽ đợi cho tới khi có task event mà không bị timeout. GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 155 tk_dis_wai Disable Task Wait [C Language Interface] INT tskwai = tk_dis_wai ( ID tskid, UINT waitmask ) ; [Parameters] ID tskid Task ID UINT waitmask Thiết lập trạng thái đợi bị vô hiệu [Return Parameters] INT tskwai trạng thái của Task sau khi trạng thái đợi bị vô hiệu hoặc Mã lỗi (Error Codes) [Error Codes] E_OK Kết thúc bình thường E_ID tskid không hợp lệ hay không được sử dụng E_PAR Lỗi tham số ( waitmask không hợp lệ) E_NOEXS Task được chỉ định trong tskid không tồn tại [Description] - Làm vô hiệu các trạng thái đợi được thiết lập trong waitmask cho một Task được chỉ định trong tskid. Nếu Task đó đang đợi bởi một nguyên nhân nào đó có trong waitmask, thì trạng thái đợi được giải phóng. - watmask được chỉ định như là phép OR luận lý của các sự kết hợp các nguyên nhân đợi #define TTW_SLP 0x00000001 /* Wait caused by sleep */ #define TTW_DLY 0x00000002 /* Wait for task delay */ #define TTW_SEM 0x00000004 /* Wait for semaphore */ #define TTW_FLG 0x00000008 /* Wait for event flag */ #define TTW_MBX 0x00000040 /* Wait for mailbox */ #define TTW_MTX 0x00000080 /* Wait for mutex */ #define TTW_SMBF 0x00000100 /* Wait for message buffer sending */ #define TTW_RMBF 0x00000200 /* Wait for message buffer receipt */ #define TTW_CAL 0x00000400 /* Wait on rendezvous call */ #define TTW_ACP 0x00000800 /* Wait for rendezvous acceptance */ #define TTW_RDV 0x00001000 /* Wait for rendezvous completion */ #define TTW_MPF 0x00002000 /* Wait for fixed-size memory pool */ #define TTW_MPL 0x00004000 /* Wait for variable-size memory pool */ #define TTW_EV1 0x00010000 /* Wait for task event #1 */ GVHD : Phạm Tường Hải Sinh viên : Nguyễn Hoàng Anh - Nguyễn Phạm Anh Khoa – Vũ Tuấn Thanh – MT01KSTN T-KERNEL / OS FUNTIONS - ĐỒNG BỘ TASK-DEPENDENT 156 #define TTW_EV2 0x00020000 /* Wait for task event #2 */ #define TTW_EV3 0x00040000 /* Wait for task event #3 */ #define TTW_EV4 0x00080000 /* Wait for task event #4 */ #define TTW_EV5 0x00100000 /* Wait for task event #5 */ #define TTW_EV6 0x00200000 /* Wait for task event #6 */ #define TTW_EV7 0x00400000 /* Wait for task event #7 */ #define TTW_EV8 0x00800000 /* Wait for task event #8 */ #define TTX_SVC 0x80000000 /* Extended SVC disabled */ - TTX_SVC là một trường hợp chỉ định đặc biệt, nó không làm vô hiệu trạng thái đợi của task mà làm vô hiệu việc gọi một hàm SVC mở rộng. Nếu TTX_SVC được chỉ định, khi một task cố gắng gọi một hàm SVC mở rộng, thì mã lỗi E_DISWAI được trả về mà không gọi hàm đó. Việc chỉ định TTX_SVC sẽ không làm kết thúc một hàm SVC mở rộng đã được gọi trước khi chỉ định. - Khi giá trị trả về của tham số tskwait là 0 thì có nghĩa là Task chưa đi vào trạng thái WAIT (hay đã được giải phóng), nếu khác 0 thì Task đang ở trong trạng thái WAIT vì một lý do nào khác ngoài những lý do trong waitmask. - Khi một task được giải phóng khởi các trạng thái đợi bởi hàm tk_dis_wai hay nó bị ngăn cản đi vào trạng thái WAIT trong khi hàm system call này có hiệu lực, thì mã lỗi E_DISWAI sẽ trả về cho task đó. Nghĩa là khi một hàm system call nào đó gọi cho task đó và làm nó đi vào trạng thái WAIT, trong khi nó đang ở trạng thái bị vô hiệu đợi thì mã lỗi E_DISWAI sẽ trả về cho hàm system call đó. - Khi TSK_SELF (=0) được gán cho tskid thì Task đích cũng chính là Task gọi hàm.Tuy nhiên, khi tskid = TSK_SELF được chỉ định trong hàm system call được gọi từ một Task- i

Các file đính kèm theo tài liệu này:

  • pdftailieu.pdf
Tài liệu liên quan