0 👍
60 lượt xem
bởi (🏅0)
Chào mọi người!
Em có vấn đề thắc mắc mong được mọi người trả lời.
Em đang viết hàm delay_s (giây) cho MCU 8051 sử dụng thạch anh 12MHZ.
Thì em được biết khi mình cho biến có kiểu dữ liệu cần byte lớn thì thời gian xử lý lệnh sẽ tăng lên.
Ví dụ : 
- Biến loop kiểu unsigned int (2 byte) chạy vòng lặp 21738 lần thì sẽ delay được khoảng 0,1s.
- Biến loop kiểu unsigned long (4 byte) chạy vòng lặp 21738 lần thì sẽ delay được 1s. 

Nhưng em đang thắc mà là tại sao khi cho 2 biến có cùng kiểu dữ liệu thì thời gian xử lý lệnh sẽ khác nhau như trường hợp dưới ( em chưa biết thuật ngữ nào để diễn tả :3)
Ví dụ:
- Biến loop kiểu unsigned int  chạy vòng lặp 32767 hoặc dưới giá trị này ( có giá trị 15 bit) thì thời gian lặp khoảng 0,1s.
- Biến loop kiểu unsigned int  chạy vòng lặp 32768  ( có giá trị 16 bit) thì thời gian lặp  hơn 1s. ( Chênh lệch nhiều)

Code em sử dụng:
void delay_s(unsigned int time) //Ham delay giay
    {
        unsigned int loop;    //21738 loop thi duoc 1s sai so 0%
        while(time>0)    
        {
            loop=0;        
            while(loop < 21738)
            {
                loop++;    
            }
            time--;
        }
    }

1 Câu trả lời

0 👍
bởi
đã được chọn bởi
 
Câu trả lời hay nhất
Kiểu Unsigned Long trong 8051 có kích thước dữ liệu là 32 bit, trong khi U_int có kích thước 16 bit, 8051 là vi điều khiển 8 bit, vì vậy khi tính toán dữ liệu kích thước 32 bit sẽ mất nhiều thời gian hơn. Cụ thể, ở đây là câu lệnh --, thì bạn chạy assembly sẽ thấy: dùng kiểu long thì mất 2 câu lệnh assembly, trong khi dùng kiểu int thì chỉ mất 1 câu lệnh asm. Chưa kể tgian thực hiện 2 lệnh, có thể gấp đến 2, 3, hoặc 4 lần (cái này mình k chắc) 1 câu lệnh kia.
Nhìn chung nếu delay trong vi điều khiển mà dùng loop thì nên thực nghiệm (tính toán mất rất nhiều thời gian), còn không thì dùng timer cho chính xác nhé
bởi (🏅0)
Hi anh Nghĩa. Em đã có hỏi anh trên facebook :D
Anh đã có trả lời cho em về ý như trên và em hiểu rồi.
Nhưng em vẫn còn thắc mắc là tại sao dùng 1 kiểu int nhưng thời gian MCU lại tính toán lâu hơn
Cụ thể là int chứa dữ liệu 16 bit và int chứa dữ liệu nhỏ hơn 16 bit .
Ví dụ:
- Biến loop kiểu unsigned int  chạy vòng lặp 32767 hoặc dưới giá trị này ( có giá trị 15 bit) thì thời gian lặp khoảng 0,1s.
- Biến loop kiểu unsigned int  chạy vòng lặp 32768  ( có giá trị 16 bit) thì thời gian lặp  hơn 1s. ( Chênh lệch nhiều)

Như em có đưa ra ở trên, anh có thể giải thích được không.
Cảm ơn anh đã phản hồi câu hỏi của em :)
Coding Guru là nơi dành cho cộng đồng lập trình viên Việt Nam hỗ trợ nhau về tất cả các vấn đề liên quan đến công nghệ.

Chúng ta hãy cùng nhau xây dựng một cộng đồng công nghệ Việt Nam mạnh mẽ, thúc đẩy và giúp đỡ nhau cùng phát triển, thăng tiến trong sự nghiệp.

***
Nơi đam mê hội tụ
***

Một số câu hỏi gần đây có thể tương tự hoặc liên quan ↓

0 👍
1 trả lời 59 lượt xem
hỏi bởi quockhanh (🏅0) 29/8/2021
0 👍
1 trả lời 488 lượt xem
hỏi bởi ẩn danh 28/10/2020
–3 👍
0 trả lời 250 lượt xem
hỏi bởi Tuấn Tuấn 30/5/2020
...