4. Các bộ tạo dao động
4.5.2. L−u ý khi sử dụng chế độ nghỉ trong ứng dụng
Những phần sau đây sẽ nêu vài l−u ý về chế độ nghỉ và liên hệ của nó với vi ch−ơng trình và phần mềm ứng dụng.
a. Nếu một ngắt đang chờ, đ−ợc cho phép và đ−ợc lập lịch để thi hành tại lệnh cuối cùng sau khi viết vào bit sleep thì hệ thống sẽ không đi vào chế độ nghỉ. Lệnh sẽ vẫn đ−ợc thi hành, nh−ng nó sẽ không thể set đ−ợc bit sleep trong thanh ghi CPU_SCR0. Thay vào đó thì lệnh sẽ đ−ợc thi hành và tác động của lệnh nghỉ bị bỏ qua.
b. Bit cho phép ngắt toàn cục không cần thiết phải đ−ợc mở để đánh thức hệ thống khỏi trạng thái nghỉ. Các bit cho phép ngắt độc lập với nhau và có khả năng đ−ợc thiết lập trong thanh ghi mặt nạ che ngắt. Nếu bit cho phép ngắt toàn cục không đ−ợc set thì CPU sẽ không thực hiện trình phục vụ ngắt liên quan tới ngắt đó. Tuy nhiên, hệ thống sẽ bị đánh thức và tiếp tục thi hành các lệnh tại thời điểm mà nó đi vào trạng thái nghỉ. Trong tr−ờng hợp này thì ng−ời sử dụng phải xóa ngắt chờ một cách thủ công, hoặc có thể mở bit cho phép ngắt toàn cục rồi sau đó để cho CPU thi hành trình phục vụ ngắt. Nếu một ngắt chờ không đ−ợc xóa thì nó sẽ vẫn tiếp tục xác nhận, và mặc dù bit sleep đ−ợc ghi và chuỗi sự kiện nghỉ đ−ợc thi hành, ngay khi chíp đi vào chế độ nghỉ, bit sleep sẽ bị xóa bởi ngắt chờ và hệ thống sẽ thoát khỏi chế độ nghỉ.
c. Khi thức dậy, lệnh nằm ngay sau lệnh nghỉ sẽ đ−ợc thi hành tr−ớc trình phục vụ ngắt (nếu cho phép). Lệnh nằm ngay sau lệnh nghỉ đ−ợc dừng lại tr−ớc khi hệ thống đi vào chế độ nghỉ. Bởi vậy, khi một ngắt xảy ra và đánh thức hệ thống dậy thì lệnh ngay sau lệnh nghỉ sẽ đ−ợc thi hành và khi đó thì trình phục vụ ngắt cũng đ−ợc thi hành. (Nếu bit cho phép ngắt toàn cục đ−ợc set, thực hiện lệnh sẽ chỉ tiếp tục tại nơi mà nó bỏ dở tr−ớc khi đi vào chế độ nghỉ.)
d. Nếu chế độ PLL đ−ợc mở thì tần số của CPU cần phải đ−ợc giảm xuống 3MHz tr−ớc khi đi vào chế độ nghỉ. Khuyến cáo là nên đợi 10ms sau khi hệ thống thức dậy để đảm bảo tần số hoạt động bình th−ờng của CPU đ−ợc khôi phục.
e. Năng l−ợng của phần t−ơng tự cần phải đ−ợc tắt bằng vi ch−ơng trình tr−ớc khi đi vào chế độ nghỉ. Chế độ nghỉ của hệ thống sẽ không điều khiển mảng t−ơng tự. Có nhiều cách điều khiển nguồn năng l−ợng độc lập cho mỗi khối t−ơng tự và nhiều cách điều khiển nguồn năng l−ợng chính trong khối tham chiếu. Cách điều khiển nguồn năng l−ợng cần phải đ−ợc thực hiện bởi vi ch−ơng trình.
f. Nếu bit cho phép ngắt toàn cục bị đóng, nó chỉ có thể đ−ợc mở một cách an toàn sau lệnh viết vào bit sleep. Nó th−ờng gây rắc rối khi có một ngắt ở lệnh cuối cùng ngay tr−ớc lệnh ghi vào bit sleep. Điều này có nghĩa là tại thời điểm quay về từ ngắt, lệnh nghỉ sẽ đ−ợc thi hành và có thể bỏ qua bất cứ một sự chuẩn bị nào của vi ch−ơng trình cần thiết phải thực hiện theo trình tự để đi vào chế độ nghỉ. Để ngăn chặn điều này thì cần phải cấm các ngắt tr−ớc khi đi vào chế độ
nghỉ. Sau khi chuẩn bị cho chế độ nghỉ, cho phép ngắt toàn cục và viết vào bit sleep với hai lệnh liên tiếp sau:
and f,~01h // vô hiệu hóa ngắt toàn cục (chuẩn bị cho chế độ nghỉ, có thể có nhiều lệnh) or f,01h // cho phép ngắt toàn cục
mov reg[ffh],08h // đ−a hệ thống vào chế độ nghỉ.
Do khoảng thời gian của lệnh cho phép ngắt toàn cục là rất nhỏ nên khó có thể có một ngắt sẽ xảy ra ngay sau lệnh trên. Ngắt sớm nhất có thể xảy ra là sau lệnh tiếp theo (là lệnh đ−a hệ thống vào chế độ nghỉ) đã đ−ợc thi hành. Bởi vậy, nếu một ngắt đang chờ và lệnh nghỉ đ−ợc thi hành nh− đ−ợc mô tả trong mục (a) thì lệnh nghỉ sẽ đ−ợc bỏ qua. Lệnh đầu tiên đ−ợc thi hành sau trình phục vụ ngắt sẽ là lệnh nằm ngay sau lệnh nghỉ.