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 Xin hỏi về màn hình laptopbởi yname11Ok , thanks bác đã chỉ...
-
Channel: Thiết bị điện tử cá nhân
hôm nay, 15:06 -
-
bởi nguyendinhvanSau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !
Chập thì thay. Cháy thì tháo
Làm thì láo. Báo thì hay
May thì khoe. Rủi thì bỏ
Thành tích nhỏ. Báo thành to
Làm cho có. Báo chi li
Sai cả li. Báo...-
Channel: Tâm tình dân kỹ thuật
hôm nay, 00:35 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11có chắc ko b, màn lcd phải có cao áp mới sáng, màn led thì ko có, ko có cáp chuyển đổi thì lắp thế nào đc ??...
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 22:31 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi mèomướpDạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 22:14 -
-
Trả lời cho Tự làm máy đo Cuộn cảmbởi bacthoHay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 21:48 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11màn của mình là LCD , giờ m muốn mua màn LED để thay thế (ko muốn dùng màn LCD nữa) , lên muốn hỏi xem có cáp chuyển đổi nào có thể cắm đc màn LED vào ko , tất nhiên phải có cùng số chân pin với màn cũ rồi . VD: màn cũ là lcd mỏng , 40 pin...
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 21:43 -
-
Trả lời cho các bạn giúp mình về file HEX với!!!bởi bacthoBạn vào trang phuclanshop.com ,tìm đến góc kỹ thuật. Tác giả vương khánh hưng nói rất rõ về điều bạn tìm...
-
Channel: Vi điều khiển họ 8051
Hôm qua, 21:21 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi mèomướpDạ màn hình lcd đều có thể lai cấy cho nhau được hết ạ. Các loại cáp, bo mạch chuyển đổi lvds rất nhìu, với dòng sony còn phải nhổ cả chip nhớ của main cũ đưa lên gỗ thì mới lắp sang máy khác đc, chưa kể các bệnh về màu... ngay cả...
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 20:43 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11Màn của e là LCD , e muốn thay thế bằng màn led thì có cáp chuyển đổi nào thực hiện đc việc đó ko nhỉ, nếu có bác mách e với....
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 16:34 -
Comment