Đơn vị thời gian trong kernel:

Một phần của tài liệu document (Trang 65 - 67)

Để quản lý chính xác thời gian, hệ điều hành sử dụng bộ định thời timer tích hợp sẵn trên vi điều khiển mà nó hoạt động. Bộ định thời (timer) được đặt cho một giá trị cố định sao cho có thể sinh ra ngắt theo chu kỳ cho trước. Khoảng thời gian của một chu kỳ ngắt được gọi là tick. Trong một giây có khoảng N ticksđược hồn thành. Hay nói cách khác, tốc độ tick là N Hz. Giá trị N được định nghĩa bởi người sử dụng trước khi biên dịch

kernel. Thơng thường một số hệ điều hành có giá trị mặc định là N = 100 và đây cũng là

giá trị mặc định của hệ điều hành chạy trên kit KM9260. Giá trị của HZ được định nghĩa như sau:

# define USER_HZ 100 /* User interfaces are in "ticks" */

# define HZ 100 /*Internal kernel timer frequency*/

trong tập tin \arch\arm\include\asm\param.h. Chúng ta thấy, giá trị mặc định của HZ là 100. Có nghĩa là timerhệ thống được cài đặt sao cho trong một giây có khoảng 100 lần ngắt xảy ra. Hay nói cách khác, chu kỳ ngắt là 10 ms. Chúng ta cũng chú ý, trong tập tin có hai tham số cần sữa chữa một lúc đó là USER_HZ và HZ. Để thuận tiện cho việc chuyển đổi qua lại thời gian giữa kerneluser thì giá trị của chúng phải giống nhau.

Giá trị HZ thay đổi phải phù hợp với ứng dụng mà hệ điều hành đang phục vụ. Làm thế nào để làm được điều này.

Chẳng hạn, giá trị của HZ ảnh hưởng rất nhiều đến độ phân giải của những hàm định thời ngắt. Với giá trị HZ = 100, thời gian lập trình định thời ngắt tối thiểu là 10ms. Với giá trị HZ=1000, thời gian lập trình định thời ngắt tối thiểu là 1ms. Điều nàycó nghĩa là giá trị của HZcàng lớn càng tốt. Liệu thực sự có phải như thế?

Khi tăng giá trị của HZ, điều có những ưu và nhược điểm. Về ưu điểm, tăng giá trị HZ làm độ phân giải của thời gian kerneltăng lên, như thế một số ứng dụng có liên quan đến thời gian cũng chính xác hơn ,...Về nhược điểm, khi tăng giá trị của HZ, thì vi điều khiển thực hiện ngắt nhiều hơn, tiêu tốn thời gian cho việc lưu lưu ngăn xếp, khởi tạo ngắt, ... nhiều hơn, ... do vậy tùy từng ứng dụng cụ thể mà chúng ta thay đổi giá trị HZcho phù hợp để hệ thống hoạt động tối ưu.

III. jiffies:

jiffies là một biến toàn cục được định nghĩa trong thư viện linux/jiffies.hđể lưu số lượng ticks đạt được kể từ khi hệ thống bắt đầu khởi động. Khi xảy ra ngắt timer hệ thống, kernel tiến hành tăng giá trị của jiffies lên 1 đơn vị. Như vậy nếu như có HZticks trong một giây thì jiffies sẽ tăng trong một giây là HZđơn vị. Nếu như chúng ta đọc được giá trị jiffieshiện tại là N, thì thời gian kể từ khi hệ thống khởi động là Nticks hay N/HZ giây. Đôi khi chúng ta muốn đổi giá trị jiffiessang giây và ngược lại ta chỉ việc chia hay nhân giá trị jiffiescho(với) HZ.

Trong kernel, jiffiesđược lưu trữ dưới dạng số nhị phân 32 bits. Là 32 bits có trong số thấp trong tổng số 64 bits của biến jiffies_64. Với chu kỳ ticklà 10ms thì sau một khoảng thời gian 5.85 tỷ năm đối với biến jiffies_64và 1.36năm đối với biến jiffesmới có thể bị tràn. Xác suất để biến jiffies_64 bị tràn là cực kỳ nhỏ và jiffies là rất nhỏ. Thế nhưng vẫn có thể xảy ra đối với những ứng dụng đòi hỏi độ tin cậy rất cao. Nếu cần có thể kiểm tra nếu yêu cầu chính xác cao.

Khi thao tác với jiffies, kernelhỗ trợ cho chúng ta các hàm so sánh thời gian sau, tất cả các hàm này đều được định nghĩa trong thư viện linux/jiffies.h:

Đầu tiên là hàm get_jiffies_64(), với giá trị jiffies thì chúng ta có thể đọc trực tiếp theo tên của nó, thế nhưng jiffies_64 không thể đọc trực tiếp mà phài thông qua hàm riêng vì giá trị của jiffies_64 được chứa trong số 64 bits. Hàm khơng có tham số, giá trị trả về của hàm là số có 64 bits.

Cuối cùng là các hàm so sánh thời gian theo giá trị của jiffies. Các hàm này được định nghĩa trong thư viện linux/jiffies.hnhư sau:

#define time_after(unknown,known)(long)(known)-(long)(unknown)<0) #define time_before(unknown,known)((long)(unknown)-(long)(known)<0) #define time_after_eq(unknown,known)((long)(unknown)-(long)(known)>= 0) #define time_before_eq(unknown,known)((long)(known)-(long)(unknown)>= 0) các hàm này trả về giá trị kiểu boolean, tùy theo tên hàm và tham số của hàm. Hàm

time_after(unknown, known)trả về giá trị đúng nếu unknown > known, tương tự cho các hàm khác. Ứng dụng của các hàm này khi chúng ta muốn so sánh hai khoảng thời gian với nhau để thực thi một tác vụ nào đó, chẳng hạn ứng dụng trong trì hỗn thời gian như trong đoạn chương trình sau:

/*Đoạn chương trình trì hỗn thời gian 1s dùng jiffies*/ /*Khai báo biến lưu thời điểm cuối cùng muốn so sánh*/

unsigned long timeout = jiffies + HZ;//Trì hỗn 1s /*Kiểm tra xem giá trị timeout có bị tràn hay khơng*/

if (time_after(jiffies, timeout)) { printk(“This timeout is overflow\n”); return -1;

}

/*Thực hiện trì hỗn thời gian nếu khơng bị tràn*/

if (time_before(jiffies, timeout)) { /*Do nothing loop to delay*/

}

Một phần của tài liệu document (Trang 65 - 67)

Tải bản đầy đủ (PDF)

(91 trang)