Tôi đang tìm cách phát triển phần mềm chạy bằng pin bằng bộ điều khiển Gekko của EFM (http://energymicro.com/) và muốn bộ điều khiển ngủ bất cứ khi nào không có gì hữu ích cho nó. Lệnh WFI (Chờ cho ngắt) được sử dụng cho mục đích này; nó sẽ đặt bộ xử lý vào trạng thái ngủ cho đến khi xảy ra gián đoạn.
Nếu giấc ngủ được thực hiện bằng cách lưu trữ một cái gì đó ở một nơi nào đó, người ta có thể sử dụng các hoạt động độc quyền tải / cửa hàng để thực hiện một số việc như:
// dont_s ngủ được tải với 2 bất cứ khi nào điều gì đó xảy ra // nên buộc vòng lặp chính quay vòng ít nhất một lần. Nếu gián đoạn // xảy ra khiến nó được đặt lại thành 2 trong câu lệnh sau, // hành vi sẽ như thể sự gián đoạn xảy ra sau nó. store_exinating (load_exinating (dont_s ngủ) >> 1); trong khi (! dont_s ngủ) { // Nếu ngắt xảy ra giữa câu lệnh tiếp theo và store_exinating, đừng ngủ load_exinating (SLEEP_TRIGGER); nếu (! dont_s ngủ) store_exinating (SLEEP_TRIGGER); }
Nếu xảy ra gián đoạn giữa các hoạt động load_exinating và store_exinating, thì hiệu ứng sẽ là bỏ qua store_exinating, do đó làm cho hệ thống chạy qua vòng lặp thêm một lần nữa (để xem liệu ngắt có được đặt không ngủ không). Thật không may, Gekko sử dụng lệnh WFI thay vì địa chỉ ghi để kích hoạt chế độ ngủ; viết mã như
nếu (! dont_s ngủ) WFI ();
sẽ có nguy cơ xảy ra gián đoạn giữa 'nếu' và 'wfi' và đặt dont_s ngủ, nhưng wfi sẽ tiếp tục và thực hiện bằng mọi cách. Mô hình tốt nhất để ngăn chặn điều đó là gì? Đặt PRIMASK thành 1 để ngăn chặn các ngắt làm gián đoạn bộ xử lý ngay trước khi thực hiện WFI và xóa nó ngay sau đó? Hoặc có một số mẹo tốt hơn?
BIÊN TẬP
Tôi đang tự hỏi về bit Sự kiện. Theo mô tả chung, nó muốn sử dụng cho hỗ trợ đa bộ xử lý, nhưng tự hỏi liệu một cái gì đó như sau có thể hoạt động không:
nếu (dont_s ngủ) SEV (); / * Sẽ làm theo cờ sự kiện rõ ràng WFE nhưng không ngủ * / WFE ();
Mỗi ngắt đặt bộ không ngủ cũng nên thực hiện lệnh SEV, vì vậy nếu ngắt xảy ra sau kiểm tra "nếu", WFE sẽ xóa cờ sự kiện nhưng không đi ngủ. Nghe có vẻ như một mô hình tốt?