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
-
Bạ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.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
-
E chưa hiểu ý của mod vì e chưa dùng nhiều cái này. Mod cho e một ví dụ được không. Đọc help của CV nhưng vẫn chưa hiểu nên chưa dùng.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
-
Thực sự thì tôi vẫn chưa hiểu ý anh.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
-
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..." đó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ị.
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.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
-
Cái mình nói bạn xem file list nó dịch ra thì thấy.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
-
CodeVision thì là do cái option mình đánh dấu với hình bên dưới mà ra, bỏ hai cái check box đó là nó lại y như AVR-GCC, biến cứ cho vào SRAM hết. Lâu rồi mình cũng không dùng CV nên "cà lâm" khi nói về nó !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
-
bởi chinhnguyen9
Điến âp vào 24V;Điên áp ra 30V;Dòng điện ra 10A
Trên nền tảng mạch Boost thay đổi như sau: cự âm tụ lọc C không nối mas mà nối vào Vc +24V
Mach phản hồi tao điê áp trên tụ lọc này ổn đinh ở 6V
Kết quả:
· Điện áp ra =24V+ 6V=30V
· Công...-
Channel: Hướng dẫn sử dụng diễn đàn
Hôm qua, 19:33 -
-
bởi chinhnguyen92. Các yếu tố để dòng điện đầu ra không bị "thiếu"
Dòng điện đầu ra bị "thiếu" có thể hiểu là không đủ 10A theo yêu cầu hoặc bị sụt áp khi tải thay đổi. Để đảm bảo điều này, bạn cần xem xét các yếu tố sau:
a. Khả năng chịu dòng của cuộn cảm- Dòng bão hòa (I_sat): Như
-
Channel: Hướng dẫn sử dụng diễn đàn
Hôm qua, 19:06 -
bởi chinhnguyen9
1. Tính toán cuộn cảm (Inductor)
Để tính giá trị cuộn cảm, chúng ta cần thực hiện các bước sau:
a. Xác định chu kỳ nhiệm vụ (Duty Cycle - D)
Với mạch tăng áp lý tưởng, chu kỳ nhiệm vụ được tính theo công thức :
D=1-VinVout=1-24V30V=0.2
Vậy D = 0.2 (20%)
b....-
Channel: Hướng dẫn sử dụng diễn đàn
Hôm qua, 19:03 -
-
bởi chinhnguyen9Công thức
Gain (dB) = 20 × log₁₀(A)
Thí dụ 1; 60dB
log₁₀(A)=60/20=3
⇒ A=V_out / V_in = 10³ = 1.000
Thí dụ 2; 100dB
log₁₀(A)=100/20=5
⇒ A=V_out / V_in = 105 = 100.000
Tí dụ 3; LM 358
Large Signal Open Loop Voltage Gain AVOL V/mV RL = 2.0...-
Channel: Hướng dẫn sử dụng diễn đàn
19-03-2026, 08:44 -
-
Trả lời cho Mạch 3s bị giảm điện áp đầu rabởi minhtri0405chả biết bạn xử lý được chưa , kích sạc hoặc điện áp > điện áp khối pin vào 2 chân P - P+ , nhiều mạch phải yêu cầu có kích lần đầu sau đó mới chạy...
-
Channel: Điện tử dành cho người mới bắt đầu
18-03-2026, 10:01 -
-
bởi minhtri0405đây có phải là 1 cách để test mosfet xịn hay dỏm khi mua đồ tàu không nhỉ , vì ko thể đập ra để coi lõi rồi trả hàng được....
-
Channel: Tâm tình dân kỹ thuật
18-03-2026, 09:57 -
-
Trả lời cho Giúp mình vẽ sơ đồ và phân tích nguyên lý làm việc của khảo sát các mạch nguồn ổn áp vớibởi Tuyenvc345
-
Channel: Hỗ trợ học tập
16-03-2026, 18:05 -
-
Trả lời cho Giúp mình vẽ sơ đồ và phân tích nguyên lý làm việc của khảo sát các mạch nguồn ổn áp vớibởi Tuyenvc345
-
Channel: Hỗ trợ học tập
16-03-2026, 18:04 -

Comment