Lập trình C cho vi điều khiển: vấn đề khai báo biến

Chào các bạn.

Như các bạn đã biết trong các lệnh ASM của vi xử lý thì thao tác với các toán tử là các thanh ghi sẽ tốn ít thời gian nhất và do đó tối ưu được chương trình chạy rất nhanh, thời gian thực hiện từng thuật toán sẽ giảm đi nhiều.

Do đó, các biến trong chương trình C chúng ta không nên khai báo các biến kiểu như:

1
2
unsigned char i;
unsigned int temp;

Mà chúng ta sẽ thay bằng dùng #define để định nghĩa các thanh ghi không sử dụng trong chương trình để làm biến các biến.

Vấn đề phát sinh: các biến có độ dài 1 byte thì gán bằng các thanh ghi 1 byte, còn các biến có độ dài hơn 1 byte thì gán bằng thanh ghi dài hơn đó, hoặc nếu không thì cho nó thành nhiều biến hơn. Như temp (16 bit) thành temp_L và temp_H, mỗi biến là 8 bit.

Sau đây mình sẽ minh họa một đoạn chương trình khi thao tác với một biến 16 bit khai báo kiểu unsigned int và khi thao tác với 2 thanh ghi.

Chương trình này chính là chương trình điều khiển LED1 được gọi trong hàm ngắt của Timer0, Led1 sẽ sáng khi led1_cnt khác 0 và giảm giá trị này đi 1, và tắt khi led1_cnt = 0. Như vây chỉ cần cho led1_cnt các giá trị khác nhau thì các khoảng thời gian led sáng sẽ khác nhau.

1. Thực hiện với biến unsigned int

1
2
3
	led1 = 1;
	if(led1_cnt == 0) led1 = 0;
	else led1_cnt --;

2. Thực hiện với 2 byte là 2 thanh ghi: led1_cntH và led1_cntL

1
2
3
4
5
6
7
8
9
10
11
	// Control led1
	led1 = 1;
	if (led1_cntL == 0){
		if (led1_cntH == 0)
			led1 = 0;
		else {
			led1_cntH --;
			led1_cntL --;
		};
	}
	else	led1_cntL--;

Chúc các bạn thành công.

{ 6 comments… add one }

  • anh la January 7, 2009, 3:12 am

    anh bac co the goi cho em tai lieu ve keil c nha! em can tai lieu de hoc! cam on anh truoc nha

    Reply
  • Jahshastsmapy April 3, 2009, 8:31 pm

    ДА! Я у вас тут пиарюсь

    Reply
  • Huy March 4, 2010, 3:49 pm

    Anh ơi, cho em hỏi, có một số thanh ghi trong Vi sual C++ phải thêm đầu e (như ecx) vậy những thanh ghi nào phải chuyển như vậy ạ?

    Reply
  • Nhat Minh January 10, 2011, 10:07 am

    “Mà chúng ta sẽ thay bằng dùng #define để định nghĩa các thanh ghi không sử dụng trong chương trình để làm biến các biến.”
    anh có thể giải thích chỗ này rõ hơn một tí được không em không hiểu lắm !
    Đoạn chương trình mẫu của anh em có thấy anh dùng # define đâu ???
    Em mới vào học C nên chậm hiểu mong anh giải thích rõ hơn ,cảm ơn anh
    Chúc Anh sức khỏe

    Reply
  • thtan92 July 22, 2012, 5:05 pm

    bài viết đó die rồi anh ơi!

    Reply
  • ngohaibac January 7, 2009, 6:12 am

    Chào em.

    Em đọc bài viết này nhé

    Chúc em thành công.

    Reply

Leave a Comment