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 Cần Cao Thủ Giải Bài Tập Lý Thuyết Mạchbởi SangchunhatAi tốt môn này không ạ, hỗ trợ e phát
-
Channel: Hỗ trợ học tập
hôm nay, 09:51 -
-
bởi SangchunhatEm cần cao thủ giỏi giải bài tập đề thi Lý Thuyết Mạch
Bác nào làm được inboxx em với
Có gửi cafe cảm ơn
Xin cảm ơn ạ-
Channel: Hỗ trợ học tập
hôm nay, 08:56 -
-
Trả lời cho Hàn chì thiếc lên nhôm.bởi vi van phamSai bét. Bà í không biết cầm mỏ hàn điện (phải viết to chữ điện), nên tui ra chơi với diễn đàn . Chớ thấy vậy mà chê bai tui.
...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 20:54 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi nhathung1101Và mai tôi lại phải bay...
Chỉ mong muốn anh em hiểu: Là đừng làm dối lòng, khiến đàn em nức nở..
Cứ cãi nhau, ra việc lớn. Chứ đừng vì cái "tôi" rồi làm hỏng bọn chúng..
Ai hiểu cứ nói. Ai thấy sai cứ cãi. Kỹ thuật là vậy. Chỉ đúng khi có kết quả.-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 20:37 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi nhathung1101Xin thưa là tôi rất dốt món Ing Lịch. Chỉ là các bạn đưa lên những từ không ai hiểu, nên tôi phải theo.
Chứ ngày xưa được huấn luyện, cũng không như bạn nói đâu, và bạn Mỹ của tôi, hiểu như người nhà.
Bạn học giỏi thì đưa mấy từ lên đây đi, về điện tử thuần túy để anh em nghiên cứu....-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 19:59 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi nhathung1101Tôi "cũng tưởng thế". Nhưng giờ tôi sẽ để họ hiểu "Phổ biến kiến thức đường phố" nó khác thế nào.
Mời bạn theo dõi tiếp....-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 19:53 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi nhathung1101Lão lại quên: Nhất Thủy nhì Hỏa
Hà Nội lụt thì toi cả quần chip....-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 19:49 -
-
Trả lời cho Biết gì nói nấy, cãi chửi thoải máibởi nhathung1101Cứ cãi chửi nhau đi mà...
Nhưng nhớ là vào đây cãi chửi nhau, chứ mấy luồng kỹ thuật bên ngoài thì làm cho đúng.
Ai thích cãi chửi nhau cứ vào đây gặp tôi!-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 19:45 -
-
Trả lời cho Hàn chì thiếc lên nhôm.bởi nhathung1101
Lão lại bị bà í bắt ngủ riêng rồi....
...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 19:38 -
-
Trả lời cho Sạc bình acquy 30ahbởi nhathung11014r có luồng "Đánh giá...." sao không đăng???
Đề nghị bqv chuyển luôn. Và xóa bài của tôi luôn cho gọn....-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 19:32 -
Comment