PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 10-04-2009, 11:53 AM   #10
cskiller
Đệ tử 4 túi
 
Tham gia ngày: Aug 2008
Bài gửi: 89
:
Trích:
Nguyên văn bởi bien_van_khat View Post
Điều gì sẽ xảy ra nếu ngắt xảy ra khi đang thực hiện biểu thức x++?

Với biến kiểu integer 8 bit, biểu thức x++ có thể được dịch thành mã máy là incf x, 1, tức là thực hiện x++ chỉ trong 1 chu kỳ máy, trong trường hợp này thì chưa có vấn đề.

Nhưng không ai đảm bảo là biểu thức đó sẽ được dịch thành chỉ 1 lệnh. Nếu x là kiểu 16 hoặc 32 bit thì chắc chắn là không thể thực hiện x++ trong 1 chu kỳ máy.

Nếu ngắt xảy ra khi đang thực hiện x++, chuơng trình phục vụ ngắt của bạn lại thay đổi giá trị của x thì sẽ gây lỗi chuơng trình và có thể rất khó phát hiện vì hiếm khi xảy ra.

Để tránh trường hợp này, với những biến dùng chung cho cả chuơng trình chính và chuơng trình con bạn phải khai báo volatile.

VD: volatile int x;
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ị.
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ộ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.
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);
__________________
Quang báo RG/RGB 6/8/12/16 bits màu
Phone No: 0905.034.086
Email: lmquyen@gmail.com
cskiller vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 04:39 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam