![]() |
CCS-Chuyển giá trị từ chương trình chính sang chuơng trình ngắt
Mình viết đoạn code như sau để thực hiện ngắt trên port D:
Code:
// INTEXT.C MPB 10-4-07 Bây giờ mình muốn chương trình ngắt thực hiện công việc là khi bắt đầu ngắt thì sẽ lấy giá trị hiện thời của x trong chương trình chính và đưa vào chương trình ngắt,mình sửa code lại như sau nhưng chưa chạy được: Code:
// INTEXT.C MPB 10-4-07 |
Bạn không nên dùng delay_ms(1000) trong chương trình xử lý ngắt, vì các hoạt động khác trong vòng lặp chính sẽ bị dừng lại cho đến khi trở về từ ngắt, mà trong ngắt bạn lại dừng lại 1000 ms chẳng làm gì cả.
Thân, |
Vậy còn vấn đề biến x thì sao hả anh ?Em nghĩ là giá trị x trong chương trình chính đang chạy sẽ lưu vào một địa chỉ nhớ nào đó.làm sao mình đọc nó ra và gán vào cho biết nằm trong chương trình ngắt ?
|
Trích:
Thân, |
Code:
// INTEXT.C MPB 10-4-07 Chú ý: Tầm cực biến x để isrext() có thể truy cập. Giá trị trên Port D sẽ thường nhỏ hơn 1 so với Port C vì lệnh x++ thực thi sau lệnh gán output_d(x) (chỉ trừ khi interrupt xảy ra ngay sau lệnh output_d(x) và trước lệnh x++, khả năng ~ 0) nên nếu muốn 2 Port xuất giá trị bằng nhau khi nhấn phím thì chuyển lệnh x++ lên trước. |
Trích:
|
Trích:
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; |
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ộ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 |
Trích:
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:
Trích:
Trích:
|
Trích:
http://publications.gbdirect.co.uk/c..._volatile.html http://www.netrino.com/node/80 Thân, |
Ok, đồng ý nếu được chúng ta nên để ý và giải quyết triệt để vấn đề về đa truy cập biến dữ liệu để đảm bảo chương trình chạy đúng trong mọi trường hợp.
Trích:
|
"The use of volatile is poorly understood by many programmers". :D
|
Trích:
để delay_ms(1000) cũng được có sao đâu. Tùy theo mục đích của mình thôi, hơn nữa trong chương trình này mình chỉ sử dụng một ngắt thôi mà. Đâu sợ ngắt khác xảy ra. |
Trích:
|
Múi giờ GMT. Hiện tại là 02:16 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam