View Single Post
Old 02-12-2008, 08:36 PM   #9
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi lequocbao View Post
Ngoài cách kiểm tra dữ liệu sẽ nạp vào 01 ô nhớ (nếu >=256) thì cho tách dữ liệu.
thì còn có cách nào khác biết 1 ô nhớ bị tràn không bạn(ví dụ như bật một cờ báo nào đó chẳng hạn- mình dùng ccs - c nha!)?để mình có thể kiểm tra nếu tràn thì tự động cho tách dữ liệu.
Bạn đọc lại post #4 của tôi. Nếu con số mà bạn muốn lưu trữ vượt quá khả năng biểu diễn của một kiểu dữ liệu thì bạn dùng kiểu dữ liệu có nhiều byte hơn.

Lấy ví dụ, giả sử chúng ta dùng một biến kiểu unsigned int32 (lưu trữ trong 4 byte) để lưu giá trị của một đại lượng nào đó.

- Nếu giá trị của đại lượng đó >= 16777216, thì chắc chắn byte cao nhất của biến sẽ khác 0x00,
- Nếu giá trị của đại lượng đó nằm giữa 65536 và 16777216 (65536 <= giá trị < 16777216) thì chắc chắn byte cao thứ nhì của biến sẽ khác 0x00, byte cao nhất sẽ bằng 0x00,
- Nếu giá trị của đại lượng đó nằm giữa 256 và 65536 (256 <= giá trị < 65536) thì chắc chắn byte thấp thứ nhì của biến sẽ khác 0x00, byte cao nhất và cao thứ nhì sẽ bằng 0x00,
- Nếu giá trị của đại lượng đó <= 255 thì chắc chắn byte thấp nhất của biến sẽ khác 0x00, các byte cao hơn sẽ bằng 0x00.

Dữ liệu đã nằm sẵn ở các byte của biến, bạn có thể dùng hàm make8() của CCS C để lấy chúng ra và ghi vào EEPROM bất kỳ lúc nào.

Khả năng tràn số chỉ xảy ra khi bạn thực hiện phép toán số học trên biến, và PIC có cờ C trong thanh ghi STATUS cho biết phép toán số học gần nhất có tạo ra việc nhớ/mượn.

Khi đã xảy ra tràn số thì bạn không thể so sánh để phát hiện đâu. Ví dụ, bạn dùng một byte để lưu giá trị. Giả sử hiện thời giá trị là 200. Sau khi bạn cộng nó với 100, về lý thuyết thì bạn có kết quả là 300, nhưng vì 1 byte không thể biểu diễn được 300, nên bạn chỉ nhận được giá trị 0x2C (44 thập phân) trong byte đó, và bit thứ 9 đã được chuyển vào cờ C trong thanh ghi STATUS. Lúc này, xuất hiện việc tràn số do kết quả của phép cộng. Byte nhớ của bạn sẽ không bao giờ chứa được giá trị >= 256, do đó phép so sánh >= 256 của bạn sẽ luôn luôn cho kết quả false.

Nếu bạn dùng biến có độ dài 2 byte để lưu giá trị, thì với phép cộng trên, byte thấp sẽ là 0x2C, còn byte cao sẽ là 0x01, và không xảy ra sự tràn số. Các dữ liệu đã nằm sẵn ở các byte tương ứng, không cần phải tách dữ liệu bằng cách so sánh giá trị xem có >= 256 hay không.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn