Trong Lập trình C cho các MCU, biến kiểu Volatile được giải thích như là một biến có giá trị không bị thay đổi bởi phần mềm (tức code mình viết) nhưng có thể bị thay đổi bởi phần cứng, Biến này liên quan tới hiệu ứng lề (effect side) trong C. Tui cũng đã thử dùng biến này cho bộ biến đổi ADC ( chỉ để test) nhưng không nhận ra sự khác nhau giữa việc dùng hay không dùng tính chất volatile cho biến. Không biết có bác nào đã dùng chức năng này chưa, nếu có thể xin cho luôn một đoạn code ví dụ .
Thông báo
Collapse
No announcement yet.
Biến Volatile trong C (CodeVision AVR)
Collapse
X
-
Nguyên văn bởi thavali Xem bài viếtTrong Lập trình C cho các MCU, biến kiểu Volatile được giải thích như là một biến có giá trị không bị thay đổi bởi phần mềm (tức code mình viết) nhưng có thể bị thay đổi bởi phần cứng, Biến này liên quan tới hiệu ứng lề (effect side) trong C. Tui cũng đã thử dùng biến này cho bộ biến đổi ADC ( chỉ để test) nhưng không nhận ra sự khác nhau giữa việc dùng hay không dùng tính chất volatile cho biến. Không biết có bác nào đã dùng chức năng này chưa, nếu có thể xin cho luôn một đoạn code ví dụ .
Cai khai báo này tôi đã dùng với Keil nhưng tôi chưa dùng với Codevision. Ứng dụng của nó đặc biệt tốt khi mở rộng cổng I/O. Khi đó cổng chỉ như một biến bình thường có địa chỉ cố định.AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
Xem thêm tại Online Store ---> Click here
Mob: 0982.083.106
-
Nguyên văn bởi VNarmy Xem bài viếtBạn xem lại cái tôi đánh dấu ở trên nhé. Theo tôi thì địa chỉ mới là cái không bị thay đổi.
Cai khai báo này tôi đã dùng với Keil nhưng tôi chưa dùng với Codevision. Ứng dụng của nó đặc biệt tốt khi mở rộng cổng I/O. Khi đó cổng chỉ như một biến bình thường có địa chỉ cố định.
Vote hộ tớ với. Thanks!
Comment
-
Nguyên văn bởi VNarmy Xem bài viếtBạn xem lại cái tôi đánh dấu ở trên nhé. Theo tôi thì địa chỉ mới là cái không bị thay đổi.
Cai khai báo này tôi đã dùng với Keil nhưng tôi chưa dùng với Codevision. Ứng dụng của nó đặc biệt tốt khi mở rộng cổng I/O. Khi đó cổng chỉ như một biến bình thường có địa chỉ cố định.
Trong codevision thì thông thường khi ta khai báo một biến, thì biến đó sẽ được ưu tiên cấp phát trong 32 thanh ghi đa chức năng trước (thực ra thì không xài hết 32 thanh ghi này vì có vài hanh ghi phải dùng cho mục đích khác), Khi cấp hết các thanh ghi này rồi thì biến (nếu còn) sẽ được cấp phát trong ô nhớ (SRAM). Giả sử vì lí do nào đó, ta muốn ngăn không cho một biên được cấp phát vào các thanh ghi này (mặc dù các thanh ghi vẫn còn trống) thì ta dùng từ khóa Volatile. Khi đó biến sẽ được cấp vào SRAM luôn (trích từ CodeVision manual). Tôi đã thử điều này và đúng là như vậy.
Tuy nhiên điều này lại không sát với bản chất của một biến Volatile, trong các tài liệu về lập trình C cho hệ thống nhúng thì người ta trình bày khác hẳn theo cách diễn tả của CodeVision AVR, rất tiếc là họ đề cập không nhiều và ít ví dụ nên tôi chưa hiểu lắm. Phần giải thích của tôi ở bài đầu là trích từ cuốn : C Programming for Embedded Systems.
Trong phần trình bày của mình tác giả diễn tả việc dùng chức năng volatile liên quan tới hiệu ứng lề (effect side). Các bạn có thể thử đọc qua để biết về hiệu ứng lề. Các tài liệu về lập trình C cho PC thì tôi chưa thấy nói về Volatile.
Comment
-
Với CodeVision, đa số các biến, kể cả biến toàn cục đều được cấp phát vào SRAM, còn 32 thanh ghi thì chỉ được cấp phát nếu người lập trình yêu cầu.[manual nói thế, hình như bạn hỉu nhầm thì phải, không tin thì xem file list nó dịch ra thì thấy]. Khi dịch bạn cũng có thể thấy rỏ là đã có bao nhiêu byte của SRAM được dùng cho biến(toàn cục)[khi nhấn F9 để dịch thì nó hiện lên bản kết quả ].
Trong CV thì biến kiểu volatile thường ít được dùng, có thể thay bằng một biến toàn cục cũng tốt. Volatile nên chú ý khi dùng AVR-GCC.
NVT2Tín đồ AVR giáo.
Comment
-
Tôi nghĩ là mình không nhầm bác ạ, vì tôi đang viết cho một cái project khá dài hơi. Tôi dùng AVR Studio 4.13 để simulate. Các biến global lúc nào cũng được cấp phát vào các thanh ghi Rn trước bác ạ. (tôi dùng CV 1.25.7)
Tôi có nhầm lẫn gì chăng ?
Comment
-
Nguyên văn bởi thavali Xem bài viếtTôi nghĩ là mình không nhầm bác ạ, vì tôi đang viết cho một cái project khá dài hơi. Tôi dùng AVR Studio 4.13 để simulate. Các biến global lúc nào cũng được cấp phát vào các thanh ghi Rn trước bác ạ. (tôi dùng CV 1.25.7)
Tôi có nhầm lẫn gì chăng ?
Đó cũng là nguyên nhân vì sao Tiny15 không có trong danh sách hỗ trợ vì không có SRAM nội.
NVT2Tín đồ AVR giáo.
Comment
-
Minh khong co xai CodeVision AVR nhung minh co lan gap van de voi cai volatile nay nen chia se kinh nghiem sau day.
Gia su ban co code nhu sau:
(char") const PORT_0_ADDRESS = (char*)(0xFFFF002);
*PORT_0_ADDRESS = 0x00; // line 1
*PORT_0_ADDRESS = 0x01; // line 2
Khi ban enable optimization ma khong dung volatile, compiler se bo di line 1, chi con lai line 2 boi vi no nghi rang ban viet code du thua. Dieu nay dan toi viec code viet dung nhung mach khong chay duoc. Minh bi truong hop nay doi voi timer.
Do do khi ban khai bao su dung volatile, vi du:
(char") volatile const PORT_0_ADDRESS = (char*)(0xFFFF002);
thi sau khi compile, 2 dong code se con day du trong object file . Tuc la khi su dung volatile, ban muon noi voi compiler la "ong noi may viet code dung day, khong co du thua dau".
Neu ban disable optimization trong tuy chon cua compiler, thi volatile khong co y nghia gi ca.
Thong thuong khi lap trinh C, minh dung kieu #define PORT_0_ADDRESS ...Nhung khi lam chung project voi nguoi khac, gap thang nao lam graphic, database ma chanh choe thi thinh thoang minh lai xai volatile. Boi vi volatile chi co dan lap trinh dieu khien phan cung moi dung thoi (do hardware datasheet yeu cau phai viet code tuong tu o tren, dacbiet khi Initialize hay Read Status of device).
Ve mat nguyen tac, khi dieu khien truc tiep phan cung (read/write register, I/O port), ban phai doc ky specification cua phan cung roi viet code chinh xac va khong enable bat ky cai optimization nao ca.
Neu muon xai volatile thi ban dung cach khai bao tuong tu o tren, chu y la chi doi voi address cua thanh ghi, I/O Port thoi, con dia chi thuoc vung RAM (tuc la bien con tro binh thuong) thi khong can thiet.
Luu y:
Khai bao "const" o tren chi de bao cho compiler biet va kiem tra la ban khong he thay doi gia tri cua no o cho nao khac thoi. No khong ngan can duoc ban access den no va thay doi neu nhu ban muon. Cai nay tuong tu nhu ROM vay. ROM chi la read-only doi voi nguoi thuong thoi, con doi voi dan dien tu thi khong co y nghia gi (write tum lum luon).
Xin loi khong go duoc tieng Viet vi ban phim bi hu.
Comment
-
vâng, tui đồng ý với bạn về cách dùng volatile ở trên, tức nó thông báo cho compiler không được optimizate các đoạn code mà nó cho là dư thừa. cách dùng const ở trên khá thú vị.
Khi bạn thao tác với biến toàn cục, bạn có thấy là luôn có lệnh "ldd 0x...,Rn" trước không nè ! Và sau khi thao tác xong thì lại có "std Rn,0x..." đó
Đó cũng là nguyên nhân vì sao Tiny15 không có trong danh sách hỗ trợ vì không có SRAM nội.
NVT2
Comment
-
mình mới đọc được 1 bài viết "When to use the volatile keyword in C", link lấy từ avrfreaks.net, rất chi tiết. Chia sẻ cùng mọi người: http://www.embedded.com/story/OEG20010615S0107|
Comment
-
Nguyên văn bởi thavali Xem bài viếtvâng, tui đồng ý với bạn về cách dùng volatile ở trên, tức nó thông báo cho compiler không được optimizate các đoạn code mà nó cho là dư thừa. cách dùng const ở trên khá thú vị.
Bạn có đồng ý với ý kiến của bạn NVT2 ở trên ko ? Tôi vẫn còn khúc mắc về cái này, vì trong khi tôi viết code thì thấy nó khác với diễn tả trên.
CodeVision cho phép lưu biến toàn cục trên một số thanh ghi trong điều kiện có ít biến còn GCC thì không.
NVT2Last edited by nvt2; 20-11-2007, 16:18.Tín đồ AVR giáo.
Comment
-
Comment
-
Nguyên văn bởi thavali Xem bài viếtĐây là chương trình tôi viết, tất cả các biến toàn cục điều ở trong Rn. Không biết bạn dùng CV phiên bản mấy nhỉ. Hay là tôi dùng ít biến global nên như thế ? Dù sao thì vấn đề này cũng không quá quan trọng, nhưng cũng muốn thảo luận cho ngã ngũ luôn thôi
ảnh:
NVT2Tín đồ AVR giáo.
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi nhathung1101
-
Channel: Điện tử dành cho người mới bắt đầu
31-12-2024, 17:39 -
-
Comment on Thắc mắc về hạ áp cho adapter laptopbởi nguyendinhvan
-
Channel: Điện tử dành cho người mới bắt đầu
29-12-2024, 23:20 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi nguyendinhvanPhải làm đúng quy chình thì mới được
Bươc 1 lấy cái nguồn điều chỉnh, set về đúng 12v, cấp cho đường out 19v như hình. Chú ý là phần đầu vào adaptor không cấp điện.
Bước 2 . Kiểm tra điện áp tại chân số 3 das001 có đúng...-
Channel: Điện tử dành cho người mới bắt đầu
29-12-2024, 23:20 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi LamVoNhấp nháy có thể do chu kỳ hoạt động bị rút ngắn quá dẫn đến không đủ nguồn nuôi ic, bác thử tăng giá trị tụ nguồn phụ nuôi ic và giảm giá trị điện trở hạn dòng cho nó xem có cải thiện không....
-
Channel: Điện tử dành cho người mới bắt đầu
29-12-2024, 08:45 -
-
Trả lời cho Mạch tự động bật nguồnbởi nhathung1101Bác đúng là hệ Pháp, nên toàn quên chữ "d".
Nếu em được như bác, đúng 0h mới được stand by với hũ rượu và vợ thì tuyệt.
Nhưng đời không như là mơ, em và lão Đinh Vặn ngấm đủ mà.
Lão Đinh Vặn...-
Channel: Điện tử gia dụng
29-12-2024, 00:17 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi nhathung1101Vì bản chất của nó hoạt động theo dòng. Áp chỉ để mức giới hạn.
Cứ hiểu như bạn khôn hơn 10 người, nhưng khả năng thu nhận kiến thức chỉ bằng 1/10 người khác, thì nó sẽ tự điều chỉnh thôi.-
Channel: Điện tử dành cho người mới bắt đầu
28-12-2024, 23:41 -
-
Trả lời cho Mạch tự động bật nguồnbởi nhathung1101Ựa... có lý...
Dưng mà lão chỉ dùng 1 con opto là nguy hiểm lắm.
Có khi nó on lúc lão với ấy ấy về nhà lúc vắng vợ thì khổ. Nên phải thêm cái mạch logic nữa mới được....-
Channel: Điện tử gia dụng
28-12-2024, 23:20 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi lct1610Bác có cách nào khác ngoài quấnlại/rút bớt vòng dây BA (và mua mới ) k nhỉ ? Tại gỡ ra cũng khá lằng nhằng và kì công...
-
Channel: Điện tử dành cho người mới bắt đầu
28-12-2024, 19:30 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi mèomướpDạ với mức áp chênh lệch quá nhìu thì ngoài chỉnh hồi tiếp thì chú cần quấn lại thứ cấp biến áp nữa ạ. Tùy loại mà có thể sẽ khéo léo rút bớt vòng dây đỡ phải tách lõi ferit ạ...
-
Channel: Điện tử dành cho người mới bắt đầu
28-12-2024, 18:57 -
-
bởi lct1610E có adapter laptop cũ hiệu asus chạy tốt ,có đầu ra ổn định ở 19,4v dòng 3,42A ( công suất 60w). E định là hạ nó xuống 12v để cấp nguồn cho đầu camera. Và e đã thử bằng cách can thiệp vào phần hồi tiếp (sử dụng ic DAS001 hay TSM103W) thông...
-
Channel: Điện tử dành cho người mới bắt đầu
28-12-2024, 18:44 -
Comment