View Single Post
Old 10-04-2009, 06:18 PM   #9
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trích:
Nguyên văn bởi cskiller View Post
1. Trong chương trình này, khả năng xảy ra khi đang thực thi x++ là ~0(1 vài lệnh so với delay_ms(100); chẳng thấm vào đâu) và hàm phục vụ ngắt không thực hiện tác vụ write/update biến mà chỉ read giá trị.
Không ai dám đảm bảo rằng nó sẽ ko xảy ra, cho dù xác suất là nhỏ, nếu lỗi đã có thể xảy ra thì luôn cần phải tránh.
Dĩ nhiên trong bài toán này, lỗi này ko xảy ra vì x++ chỉ thực hiện trong 1 chu kỳ máy. Và có xảy ra cũng ko gây ra chuyện gì ghê ghớm, chỉ hiện thị sai vài con led.

Trích:
2. Việc khai báo volatile cho biết biến x có thể được truy cập, thay đổi giá trị từ nhiều điểm thực thị trong chương trình(nên thường dùng cho các port IO) chứ không đảm bảo việc khi thực hiện x++ sẽ đúng khi có nhiều chương trình cùng thao tác trên x.
Mình sai chỗ này, ở đây phải dùng cách này
Trích:
3. Giải pháp critical access đơn giản nhất là:
Code:
disable_interrupts(GLOBAL);  //Đảm bảo không có ngắt nào được thực thi đoạn code tiếp sau lệnh này
x++;     //x co the la so integer 8,16,32 bits
enable_interrupts(GLOBAL);
Trích:
Một điểm nữa cần để ý là khai báo volatile sẽ giúp compiler sẽ thực hiện thao tác tối ưu đúng(không tự động xóa các biểu thức điều kiện sai) khi gặp biến volatile.
Mình chưa hiểu ý bạn?
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn