dinh ngia thong so trong vdk

Màu nền
Font chữ
Font size
Chiều cao dòng

VÀIĐIỀU CƠ BẢN TRONG KỸ THUẬT VI XỬ LÝ

I. CẤU TRÚC PHẦN CỨNG CỦA MỘT VI XỬ LÝ

Những kiến thứcđ ược diễnđạt trong tài liệu này là những ý kiến mang tính chủ quan mà người viết muốn san sẻ với các bạnđ ọc có cùng mối quan tâm và chỉ liên quanđ ến những vấnđ ề cơ bản của kỹ thuật vi xử lý nói chung, không phải là kiến thức áp dụng cho một loại vi xử lý cụ thể.

Trước hếtđ ể tránh những băn khoănđáng tiếc trong khi nghiên cứu tài liệu,

tôi xinđư ợc giới thiệuđôi chút về 02 khái niệm "vi xử lý" (microprocessor) và "vi

điều khiển" (microcontroller). Vềcơbản hai khái niệm này không khác nhau

nhiều, "vi xử lý" là thuật ngữ chung dùng để đề cậpđ ến kỹ thuậtứng dụng các công nghệ viđiện tử, công nghệ tích hợp và khả năng xử lý theo chương trình vào các lĩnh vực khác nhau. Vào những giaiđoạnđ ầu trong quá trình phát triển của công nghệ vi xử lý, các chip (hay các vi xử lý)đư ợc chế tạo chỉ tích hợp những phần cứng thiết yếu như CPU cùng các mạch giao tiếp giữa CPU và các phần cứng khác. Trong giaiđoạn này, các phần cứng khác (kể cả bộ nhớ) thường khôngđư ợc tích hợp trên chip mà phải ghép nối thêm bên ngoài. Các phần cứng nàyđư ợc gọi là các ngoại vi (Peripherals). Về sau, nhờ sự phát triển vượt bậc của công nghệ tích hợp, các ngoại vi cũngđ ư ợc tích hợp vào bên trong IC và người ta gọi các vi xử lý

đã được tích hợp thêm các ngoại vi là các "vi điều khiển". Việc tích hợp thêm các

ngoại vi vào trong cùng một IC với CPU tạo ra nhiều lợi ích như làm giảm thiểu các ghép nối bên ngoài, giảm thiểu số lượng linh kiệnđiện tử phụ, giảm chi phí cho thiết kế hệ thống,đ ơn giản hóa việc thiết kế, nâng cao hiệu suất và tính linh hoạt. Trong tài liệu này, ranh giới giữa hai khái niệm "vi xử lý" và "viđiều khiển" thực sự không cần phải phân biệt rõ ràng. Chúng tôi sẽ dùng thuật ngữ "vi xử lý" khiđ ề cậpđ ến các khái niệm cơ bản của kỹ thuật vi xử lý nói chung và sẽ dùng thuật ngữ "viđiều khiển" khiđi sâu nghiên cứu một họ chip cụ thể.

Về cơ bản kiến trúc của một vi xử lý gồm những phần cứng sau:

-Đơn vị xử lý trung tâm CPU (Central Processing Unit).

- Các bộ nhớ (Memories).

- Các cổng vào/ra song song (Parallel I/O Ports).

- Các cổng vào/ra nối tiếp (Serial I/O Ports).

- Các bộ đếm/bộ định thời (Timers).

Ngoài ra với mỗi loại viđiều khiển cụ thể còn có thể có thêm một số phần cứng

khác như bộ biếnđ ổi tương tự-số ADC, bộ biếnđ ổi số-tương tự DAC, các mạch

điều chếdạng sóng WG, điều chế độrộng xung PWM...

Bộ não của mỗi vi xử lý chính là CPU, các phần cứng khác chỉ là các cơ quan chấp hành dưới quyền của CPU. Mỗi cơ quan nàyđ ều có một cơ chế hoạtđộng nhấtđ ịnh mà CPU phải tuân theo khi giao tiếp với chúng.Đ ể có thể giao tiếp và

điều khiển các cơ quan chấp hành (các ngoại vi), CPU sửdụng 03 loại tín hiệu cơ bản là tín hiệuđ ịa chỉ (Address), tín hiệu dữ liệu (Data) và tín hiệuđiều khiển

(Control). Về mặt vật lý thì các tín hiệu này là cácđ ư ờng nhỏ dẫnđiện nối từ CPU

đến các ngoại vi hoặc thậm chí là giữa các ngoại vi với nhau. Tập hợp các đường

tín hiệu có cùng chức năng gọi là các bus. Như vậy ta có các busđ ịa chỉ, bus dữ

liệu và busđiều khiển.

Có thể mô tả sơ bộ cấu trúc phần cứng của một vi xử lý theo hình sau:

Sauđây là mô tả sơ bộ về các phần cứng bên trong một vi xử lý.

1.Đơn vị xử lý trung tâm CPU:

CPU có cấu tạo gồm cóđ ơn vị xử lý số học và lôgic (ALU), các thanh ghi, các

khối lôgic và các mạch giao tiếp.

Chức năng của CPU là tiến hành các thao tác tính toán xử lý,đ ưa ra các tín hiệuđ ịa chỉ, dữ liệu vàđiều khiển nhằm thực hiện một nhiệm vụ nàođó do người lập trìnhđưa ra thông qua các lệnh (Instructions).

2. Bộ nhớ:

Nhìn chung có hai loại bộ nhớ là bộ nhớ chương trình và bộ nhớ dữ liệu.

Bộ nhớ chương trình dùngđ ể chứa mã chương trình hướng dẫn CPU thực hiện một nhiệm vụ nàođó. Thông thường thì bộ nhớ chương trình là các loại bộ nhớ "không bay hơi" (non-volatile), nghĩa là không bị mất nội dung chứa bên trong khi ngừng cung cấp nguồn nuôi. Có thể kể ra một số bộ nhớ thuộc loại này như: ROM, PROM, EPROM, EEPROM, Flash.

Bộ nhớ dữ liệu là bộ nhớ dùngđ ể chứa dữ liệu (bao gồm các tham số, các biến tạm thời...). Tùy thuộc loại dữ liệu mà bộ nhớ loại này có thể là loại "không bay hơi" hoặc "bay hơi" (mất dữ liệu khi cắt nguồn nuôi). Loại "bay hơi" thường thấy là các bộ nhớ SRAM.

3. Cổng vào/ra song song:

Đây là các đường tín hiệu được nối với một số chân của IC dùng để giao tiếp

với thế giới bên ngoài IC. Giao tiếpở đây làđ ưađiện áp ra hoặcđọc vào giá trị

điện áp tại chân cổng. Các giá trị điện áp đưa ra hay đọc vào chỉ có thể đwocj biểu

diễn bởi một trong hai giá trị lôgic (0 hoặc 1). Trong kỹ thuật vi xử lý, người ta thường dùng quyư ớc lôgic dương: giá trị lôgic 0ứng với mứcđiện áp thấp xấp xỉ 0VDC, giá trị lôgic 1ứng với mứcđiện áp cao xấp xỉ +5VDC. Tùy loại vi xử lý mà "khoảng xấp xỉ"đó là khác nhau nhưng nhìn chung là tương thích với mức lôgic TTL. Mỗi cổng vào/ra song song thường gồm 08đ ường vào/ra khác nhau và gọi là các cổng 08 bit. Cácđ ường tín hiệu vào/ra của các cổng và thuộc cùng một cổng làđ ộc lập với nhau.Điềuđó có nghĩa là ta có thể đưa ra hayđ ọc vào các giá trị lôgic khác nhauđ ối với từng chân cổng (từngđ ư ờng tín hiệu vào/ra). Mộtđiều cần chú ý nữađ ối với các cổng vào/rađó là chúng có thể được tích hợp thêm (nói

đúng hơn là kiêm thêm) các chức năng đặc biệt liên quan đến các ngoại vi khác.

4. Cổng vào/ra nối tiếp:

Khác với cổng song song, với cổng nối tiếp các bit dữ liệuđ ư ợc truyền lần lượt trên cùng mộtđ ư ờng tín hiệu thay vì truyền cùng một lúc trên cácđ ư ờng tín hiệu khác nhau. Thông thường thì việc truyền dữ liệu bằng cổng nối tiếp phải tuân theo một cơ chế, một giao thức hay một nguyên tắc nhấtđ ịnh. Có thể kể ra một số giao thức như SPI, I2C, SCI...

Cổng nối tiếp có 02 kiểu truyền dữ liệu chính:

Truyềnđ ồng bộ (synchronous): thiết bị truyền và thiết bị nhậnđ ều dùng chung

một xung nhịp (clock).

Truyền dị bộ (asynchronous): thiết bị truyền và thiết bị nhận sử dụng hai nguồn xung nhịp riêng. Tuy nhiên hai nguồn xung nhịp này khôngđ ư ợc khác nhau quá nhiều.

Xung nhịp là yếu tố không thể thiếu trong truyền dữ liệu nối tiếp và nó có vai trò xácđ ịnh giá trị của bit dữ liệu (hay nóiđúng hơn là xácđ ịnh thờiđiểmđọc mức lôgic trênđ ư ờng truyền dữ liệu).

Cổng nối tiếp có thể có một trong các tính năng sau:

Đơn công: thiết bị chỉ có thể hoặc truyền hoặc nhận dữ liệu.

Bán song công: thiết bị có thể truyền và nhận dữ liệu nhưng tại một thờiđiểm chỉ

có thể làm một trong hai việcđó.

Song công: thiết bị có thể truyền và nhận dữ liệuđ ồng thời.

5. Bộ đếm/Bộ định thời:

Đây là các ngoại vi được thiết kế đểthực hiện một nhiệm vụ đơn giản: đếm các

xung nhịp. Mỗi khi có thêm một xung nhịp tạiđ ầu vàođếm thì giá trị của bộ đếm sẽ được tăng lên 01đ ơn vị (trong chế độ đếm tiến/đếm lên) hay giảmđi 01đ ơn vị (trong chế độ đếm lùi/đếm xuống).

Xung nhịpđ ưa vàođ ếm có thể là một trong hai loại:

Xung nhịp bên trong IC.Đó là xung nhịpđ ư ợc tạo ra nhờ kết hợp mạch dao

động bên trong IC và các linh kiện phụ bên ngoài nối với IC. Ta có thểví đó là

"nhịp tim"đ ể toàn bộ các phần cứng bên trong vi xử lý (bao gồm cả CPU và các ngoại vi) có thể hoạtđ ộngđ ược. Trong trường hợp sử dụng xung nhịp loại này,

người ta gọi là các bộ định thời (timers). Do xung nhịp bên loại này thườngđ ều

đặn nên ta có thểdù n g để đếm thời gian một cách khá chính xác.

Xung nhịp bên ngoài IC.Đó là các tín hiệu lôgic thayđ ổi liên tục giữa 02 mức 0-1và không nhất thiết phải làđ ềuđ ặn. Trong trường hợp này người ta gọi là các bộ đếm (counters).Ứng dụng phổ biến của các bộ đếm làđ ếm các sự kiện bên ngoài như đếm các sản phầm chạy trên băng chuyền,đ ếm xe ra/vào kho bãi...

Một khái niệm quan trọng cần phải nóiđ ến là sự kiện "tràn" (overflow). Nóđ ư ợc hiểu là sự kiện bộ đếmđ ếm vượt quá giá trị tốiđa mà nó có thể biểu diễn và quay trở về giá trị 0. Với bộ đếm 8 bit, giá trị tốiđa là 255 và là 65535 với bộ đếm 16 bit.

Ngoài các phần cứng nêu trên còn phải kể đến một khối lôgic khác là khối

giao tiếp bus. Khối này có chức năng ghép nối giữa các bus bên trong chip và các

chânđ ưa ra ngoài chip. Mụcđích của việcđ ưa các tín hiệuđ ịa chỉ, dữ liệu vàđiều khiển ra ngoài là nhằm mở rộng khả năng phối ghép thêm của vi xử lý với các ngoại vi khác (chủ yếu là các bộ nhớ ngoài) ngoài các ngoại viđ ư ợc tích hợp trên IC. Thông thường thì số lượng cácđ ư ờng tín hiệu là giữ nguyên khiđ ưa ra ngoài chip, tuy nhiên trong một số trường hợp số lượng cácđư ờng tín hiệu có thể nhỏ hơn số lượng thực bên trong (ví dụ như trường hợp của vi xử lý 8088, bus dữ liệu bên trong là 16 bit nhưngđưa ra ngoài chỉ có 8 bit). Khiđ ưa ra ngoài, các tín hiệu

địa chỉ và dữl iệu có thể được ghép với nhau (cùng sửdụng chung một số chân nào

đó) hoặc được tách riêng (tín hiệu địa chỉ dùng một số chân, tín hiệu dữliệu dùng

một số chân khác). Người ta thường "dồn kênh" (multiplex), tức là ghép chức năng, giữa busđ ịa chỉ và bus dữ liệuđ ể giảm thiểu số chân cần thiết. Trong trường hợp này, tín hiệuđ ịa chỉ sẽ xuất hiện trước, sauđó là tín hiệu dữ liệu trên cùng một tập hợp cácđ ư ờng tín hiệu.Đ ể táchđư ợc 2 loại tín hiệuđó thì nhà sản xuất cung cấp cho người sử dụng mộtđ ư ờng tín hiệuđiều khiển có tên là tín hiệu chốtđ ịa chỉ (thường ký hiệu là ALE). Tín hiệu này sẽ tích cực khi tín hiệuđ ịa chỉ xuất hiện và không tích cực khi tín hiệu dữ liệu xuất hiện trên bus. Các IC thích hợp với việc tách tín hiệuđ ịa chỉ và dữ liệu là các IC thuộc họ 74xx373/374 hoặc 74xx573/574.

Trênđây là mô tả sơ bộ cấu trúc phần cứng của một vi xử lý. Trước khiđi tiếp, tôi xin chia sẻ với bạn một kinh nghiệm quý báu khi nghiên cứu kỹ thuật vi xử lý.Đó là bạn phải biết chấp nhận.Đúng! Kỹ thuật vi xử lý không phải là một cái gìđó tâm linh,đó là một môn khoa học có cả cơ sở lý thuyết và minh chứng thực tếrõ ràng,đúngđắn. Tuy nhiên sẽ là không sai nếu tôi nói rằng nó cũng rất

trừu tượng.Đ ối với bạn, khi các bạnđangđ ọc những dòng chữ trong tài liệu này,

chúng ta ngầm hiểu rằng bạn mới chỉ bắtđầu quá trình nghiên cứu.Đó là một lĩnh vực có thể nói ít nhiều mới mẻ và bạn chắc chắn hầu như chưa có nhiều hình dung về cái gìđang diễn ra trong một con chip chỉ bé bằngđ ầu ngón tay!Điềuđó làm bạn cũng như tôi trướcđây, và tôi nghĩ làđúng với tất cả những aiđã từng nghiên cứu kỹ thuật vi xử lý, cảm thấy có cái gìđó thật trừu tượng, khó hiểu, rất gây tò

mò trong các khái niệm (dù là khái niệmđ ơn giản) liên quanđ ến lĩnh vực này.

Chúng ta khi mới bắtđ ầuđ ều tự đưa ra những câu hỏi cho mìnhđ ại loại như: tại sao vi xử lý có thể làmđ ư ợc nhiều việcđ ến vậy? cái gì diễn ra bên trong chip khi chúng ta cấp nguồn nuôi cho nó? tại sao ta lại có thể tácđộngđ ến timer hay các ngoại vi khác thông qua các dòng lệnh viết cho CPU? hoặc thậm chí là mạchđiện bên trong một vi xử lý, một ngoại vi, một cổng vào/ra như thế nào? Nhưng bạn có biết nếuđi tìm câu trả lời cho những thắc mắcđó, bạn sẽ có thể mất rất nhiều thời gian, công sức mà hiệu quả nghiên cứu sẽ không cao, và chođến khi tìm thấy câu trả lời thỏa mãn cho một vấnđ ề mà bạn băn khoăn, có thể bạnđã quên mất một vài hay tất cả những kiến thức còn lại! Như tôiđã nói, khi mới bắtđ ầu nghiên cứu, bạn hãy chấp nhận những kiến thức cơ bản nhưchấp nhận các tiênđ ề. Hãy coi

đó là những cái mà người ta đã xây dựng nên một cách đúng đắn, giờ đây bạn

không phải mất công tìm tòi, chứng minh sựđúngđ ắn của chúng. Thay vàođó, bạn chỉ cần tiếp thu và thừa hưởng. Hãy công nhận chúng như mộtđiều gìđó hiển nhiên. Một cáchđ ơn giản, bạn không cần phải tìm hiểu vấn đề đến mức rõ ràng từngđ ư ờng tín hiệu trong một mạchđiệnđãđư ợc tích hợp bé xíu trong chip. Vào lúc này (vâng, tôi nói là vào lúc này!), bạn chỉ cần biết, cái mạchđiệnđó người ta gọi là cái "bộ đếm", là cái "cổng vào/ra", chức năng của chúng là gì, nguyên lý hoạtđộng ra sao và để điều khiểnđư ợc chúng thì cần phải làm những gì (cụ thể là phải viết những gì trong khi lập trình). Tuy nhiên, nói như vậy không có nghĩa tôi khuyên các bạn học một cách "hổng", không cầnđến kiến thức cơ bản. Nếu bạn là ngườiđã có ít nhiều kiến thứcđiện tử (đặc biệt làđiện tử số), bạn quả là may mắn khiđã có một nền tảng kiến thức vững chắc khi tiếp cận với kỹ thuật vi xử lý. Bạn có thể hiểu dễ dàng cấu tạo của một bộ đếm, nguyên lý hoạtđ ộng của nó và chắc chắn bạn thấy dễ dàng tiếp thu hơn nếu như trong bài học tôi nói với bạn rằng "trong viđiều khiển họ 8051 có tích hợp ít nhất 02 ngoại vi gọi là các bộ đếm".Đó là vì bạnđã có những khái niệm cơ bản, những hình dung về những cái gọi là "bộ

đếm". Nếu chưa có những khái niệm cơbản, chưa có những mường tượng sơbộ,

bạn sẽ cảm thấy khó hiểu, nhưng sự khó hiểuđó chính là lý dođ ể chúng ta làm việc với nhau! Chỉ cần kiên nhẫnđôi chút, những gì bạn phải chấp nhận một cách gượng ép vàđôi khi có vẻ như vô lý vào lúc này, bạn sẽ nhận lạiđ ư ợc câu trả lời thỏa mãn trong quá trình tìm hiểu kỹ thuật vi xử lý cùng tôi,đ ặc biệt khi bạn nghiên cứu và thực hành với các viđiều khiển cụ thể.

II. NGUYÊN LÝ HOẠTĐỘNG CỦA MỘT VI XỬ LÝ

Trước hết, tôi sẽ nói qua về một khái niệm rất hayđư ợc nhắc tới trong kỹ thuật vi xử lý - "không gianđ ịa chỉ". Nóđư ợc hiểu là số lượngđ ịa chỉ mà CPU có thể phân biệtđ ược. Trong một bộ nhớ có rất nhiều ô nhớ và CPU thường phải truy nhập (ghi hoặcđọc)đ ến từng ô nhớ cụ thể, dođó CPU tất nhiên phải phân biệt

được các ô nhớ riêng rẽvới nhau. Mỗi ô nhớcần phải có một địa chỉgắn với nó.

Địa chỉ này chỉ dành riêng cho ô nhớ đó, không trùng với địa chỉcủa một ô nhớ

nào khác, khi truy nhập tớiđ ịa chỉđó tức là truy nhậpđ ến ô nhớđó. Ngoài ô nhớ, trong vi xử lý còn có một số phần cứng khác cũng cần có mộtđ ịa chỉ dành riêng cho nó như các thanh ghiđiều khiển, các thanh ghi dữ liệu... Thường thì hầu như tất cả những phần cứng cầnđ ư ợc truy nhập hay tácđộngđ ếnđ ều phảiđ ư ợc gắn với một hay nhiềuđ ịa chỉ. Lấy ví dụ,đ ể có thể giao tiếp vàđiều khiển một bộ đếm (timer/counter), CPU cần phải tácđ ộngđến các thanh ghi quyđ ịnh chế độ hoạt động, thanh ghi chứa số đếm của bộ đếm đó. Các thanh ghi này đều có địa chỉgá n

riêng cho chúng và nhờ cácđ ịa chỉđó mà CPU có thể ghi/đọc giá trị của các thanh

ghi, quađó tácđộng lên bộ đếm.

Vi xử lý hoạtđộng theo một số nguyên tắc cơ bản sau:

Các thao tác tính toán xử lý sẽ được vi xử lý, hay nóiđúng hơn là CPU, thực hiện theo các chỉ dẫn (chính là các lệnh)đ ặt trong bộ nhớ chương trình.

Đương nhiên trong bộn hớchương trình không có những chỉdẫn kiểu như

"hãyđ ưađiện áp +5VDC ra chân cổng A!" hay "dừng cái bộ đếmđó lại,

đừng cho nó đếm thêm một xung nhịp nào nữa!" hay "hãy tạm thời chờ ở

đây cho đến khi nào điện áp tại chân B có giá trị lôgic bằng 0!". Đó là ngôn

ngữ của con người, các vi xử lý không ngheđ ư ợc vàđư ơng nhiên không hiểuđ ư ợc những câuđó, chúng chỉ có thể nhận biếtđ ược hai và chỉ hai giá trị lôgic trái ngược nhau mà thôi. Hai giá trị lôgic trái ngược nhau có thể là

đen-trắng, không-có, cao-thấp... Điều đó không quan trọng, cái quan trọng

là về mặt vật lý (điện học), nhờ một cơ chế nàođó mà khiđ ọc nội dung của

bộ nhớ hayđ ọc giá trị lôgic của một cổng vào ra, vi xử lý có thể phân biệt

được khi nào giá trị đọc được là giá trị lôgic thứnhất và khi nào thì không

phải thế. Theo truyền thống người ta quyđ ịnh chung rằng các giá trị lôgic

đó là 0 và 1. Biểu thị các giá trịlô gic đó theo quy ước lôgic dương là điện

áp cao (xấp xỉ +5VDC) cho giá trị 1 vàđiện áp thấp (xấp xỉ 0VDC) cho giá trị 0. Như vậy, thay vì nói với vi xử lý rằng "hãyđưa ra giá trị lôgic 1 tại chân cổng A!", người ta mã hoá câu nóiđó thành một chuỗi các bit lôgic 0- 1 (ví dụ00001010 chẳng hạn) rồiđ ặt trong bộ nhớ chương trình của IC. CPU khi cấp nguồn nuôi sẽ đọc và tất nhiên nó hiểu cái chuỗi 0-1đó có nghĩa là gì và nó sẽ thực hiện theo ý nghĩa của lệnh nó dịch ra từ chuỗi 0-1

đó. Vậy tại sao nó hiểuđ ư ợc? Xin trảlời là bạn lạilan man rồi đấy! Nó hiểu

được đơn giản vì người ta chếtạo ra đã nhưthếrồi. Hãy biếtchấp nhận

như vậy vào lúc này!

Việc thực hiện các lệnh sẽ diễn ra tuần tự (lệnh ở địa chỉ thấp hơnđ ư ợc

thực hiện trước) bắtđ ầu từ địa chỉ reset.

Địa chỉ reset là địa chỉcủa bộn hớc hương trình mà tại đó, sau khi được cấp

nguồn nuôi, CPU sẽ bắtđ ầuđọc và thực hiện theo chỉ dẫnđư ợc mã hóađ ặt tạiđó. Mỗi loại vi xử lý có mộtđ ịa chỉ reset riêng (thường là từ0000H) do nhà sản xuất quyđ ịnh.

Các lệnhđ ư ợc thực hiện tuần tự là nhờ có thanh ghi "bộ đếm chương

trình"(PC).

Thanh ghi này chứađ ịa chỉ của ô nhớ chứa mã của lệnh tiếp theo sẽ được thực hiện. Khi CPU tìm nạpđ ư ợc mã của lệnh n, thanh ghi PC sẽ tự động tăng lên 1đ ơn vị để trỏ vào ô nhớ chứa mã của lệnh (n+1)

CPU thực hiện một lệnh theo các bước nhỏ.

Thường thì các bướcđó bao gồm: tìm nạp mã lệnh (fetch-tức là truy cập bộ nhớ chương trình,đọc lấy giá trị tại ô nhớ cóđ ịa chỉ trỏ bởi thanh ghi PC, lưu vào một thanh ghi chuyên dùng chứa mã lệnh trong CPU), giải mã lệnh (decode-giải mã giá trịđã lấyđ ư ợc vàđangđ ặt trong thanh ghi chứa mã lệnh trong CPU), cuối cùng là thực hiện lệnh (execute-thực hiện chỉ dẫn

được giải mã ra từ mã lệnh đọc được). Những vi xửlý đầu tiên được thiết kế

với phương thức thực hiện lệnh một cách thuần "tuần tự", nghĩa là thực hiện tuần tự 3 bướcđ ối với lệnh thứ n rồi mới thực hiện 3 bước tiếp theo của lệnh thứ (n+1).

Sau này, các vi xử lýđ ư ợc thiết kế với CPUđư ợc module hóa thành từng

phần riêng biệt có hoạtđộng kháđộc lập với nhau, dođó mà cấu trúc xử lý

đường ống (pipeline) ra đời. Với cấu trúc này, các bước nhỏ trong việc thực

hiện các lệnh sẽ được gối lên nhau, trong khi một phần cứng của CPU thực hiện bước 3 (thực hiện lệnh) của lệnh n thì một phần cứng khác của CPU thực hiện việc giải mã lệnh tiếp theo (lệnh thứ n+1), vàđồng thời một phần cứng khác nữa trong CPU tìm nạp mã của lệnh thứ (n+2).

Với cấu trúc xử lýđư ờngống, tốcđộ xử lý của CPUđãđư ợc nâng cao rõ rệt và tất cả những vi xử lý ngày nayđ ềuđ ược thiết kế với CPU theo cấu trúc xử lý này.

Ngăn xếp(Stack):

Là mộtđoạn bộ nhớ (thườngđ ặt trong RAM) dùngđ ể chứađ ịa chỉ trở về

của trong các trường hợp chương trình con hoặc chương trình phục vụ ngắt

được gọi. Ngoài ra ngăn xếp còn dùng đểlưu các dữliệu tạm thời. Ngănxếp

hoạtđ ộng theo cơ chế"vào sau ra trước" (LIFO-Last In First Out). Thanh ghi con trỏ ngăn xếp (SP-Stack Pointer) là thanh ghi có nội dung làđ ịa chỉ của ô nhớ trên cùng của ngăn xếp. Giá trị của SPđ ư ợc tăng giảm một cách tự động. Ngăn xếp là phần cứng vô cùng quan trọng trong vi xử lý, nó tham gia vào các thao tác rẽ nhánh (trừ thao tác nhảy) của chương trình. Người lập trình phải hết sức cẩn thận khi gán giá trị khởi tạo cho SPđ ể tránh sự cố tràn ngăn xếp hoặc ngăn xếp trùng với các vùng nhớ lưu dữ liệu khác. Khi xảy ra một trong các sự cố trên, sẽ không có cách nào kiểm soátđ ư ợc hoạt

động của vi xử lý và có thể gây thiệt hại lớn đối với hệthống. Giống như

một trò chơi, khi bạn tham gia và vì một lý do nàođó phạm vào một trong hai lỗiđó, tất cả những gì bạn sẽ nhậnđ ư ợc trên màn hình là dòng chữ "GAME OVER"!

Vậy thế nào làđ ịa chỉ trở về?

Nhưđã nóiở trên, vi xử lý thực hiện các lệnh một cách tuần tự: lệnh 1, lệnh 2,..., lệnh n, lệnh n+1...Tuy nhiênđôi khi nó gặp phải một lệnh gọi chương trình con và dođó phải chuyển sang thực hiện chương trình conđó.

Đoạn mã lệnh của chương trình con thường nằm ởmột nơi khác trong bộ

nhớ chương trình, tức là cóđ ịa chỉ không liên tiếp với lệnh gọi chương trình con. Nhắc lại rằng thanh ghi PC lúc nàyđang chứađ ịa chỉ của lệnh tiếp sau lệnh gọi chương trình con. CPU chỉ biết thực hiện những gì có tạiđ ịa chỉ chứa trong PC, do vậy mà PC cần phảiđược nạp giá trị mới làđ ịa chỉ của mã lệnhđ ầu tiên của chương trình con. Việc nạp giá trị mới cho PCđư ợc thực hiện một cách tự động khi bạn gọi một chương trình con, ngoài rađ ịa chỉ của lệnh tiếp sau lệnh gọi chương trình con trong chương trình chính cũngđ ư ợc tự động lưu lạiđ ể sau khi thực hiện xong chương trình con, CPU sẽ có thể quay lại thực hiện tiếp chương trình chính một cáchđúng chỗ, tuần tự như không có chuyện gì xảy ra. Nơi lưu giữ một cách tự độngđ ịa chỉ trở về (địa chỉ của lệnh tiếp sau lệnh gọi chương trình con)ấy chính làn gă n

xếp. Người ta thực hiện việc chia chương trình chính thành các chương trình

con (là cácđoạn chương trình thực hiện một nhiệm vụ cụ thể)đ ể dễ dàng cho việc lập trình và dò lỗi. Bạn sẽ dần cóđư ợc kỹ năng chia nhỏ chương trình chính thành các chương trình con một cách hợp lý trong quá trình lập trình cho vi xử lý.

Ngăn xếp cũng có vai trò tương tự như đối với ngắt. Vậy ngắt là gì?

Đó là những yêu cầu do các ngoại vi (là các phần cứng tích hợp trên

IC hoặc các tácđộng từ bên ngoài) gửi tới CPU nhằmđòi hỏi nhữngđáp

ứng nhất định. Mục đích của việc thiết kếcơchến gắt trong vi xử lý là nhằm

tiết kiệm thời gian cho CPU. Trong hầu hết các trường hợp, vi xử lý cần

phải thực hiện nhiều nhiệm vụ trong thời gian rất ngắn và liên tục.Đ ể có thể

đáp ứng kịp thời với các sựkiện cần xử lý, CPU có thểtiến hành thăm dò

(polling) liên tục các sự kiệnđ ể xem khi nào chúng xảy ra thì xử lý,đápứng lại. Tuy nhiên nếu làm vậy thì lãng phí rất nhiều thời gian của CPU trong khi còn có rất nhiều nhiệm vụ khácđang chờ được thực hiện, ngoài ra CPU không thể thăm dò nhiều sự kiện cùng một lúcđ ư ợc. Người ta tạo ra ngắtđ ể CPU không phải thăm dò liên tục một hay nhiều sự kiệnđó. Bằng cách ghép

các sự kiện cầnđápứng với các cơ chế ngắt khác nhau, khi một sự kiện nào

đó xảy ra, phần cứng phụ trách ngắt tích hợp trên CPU sẽtự động báo cho

CPU biết rằng sự kiệnđã xảy ra. CPU sẽ dừng công việcđang làm lại

(nhưng phải thực hiện xong lệnhđangđ ược thực hiện, dù mới chỉở giai

đoạn tìm nạp mã lệnh), và chuyển sang đáp ứng bằng cách thực hiện chương

trình phục vụ ngắt tươngứng.Đápứng xong, tức là xử lý xong sự kiện gây

ra ngắt, CPU sẽ tiếp tục quay lại làm tiếp công việcđang dang dở(đương

nhiên là nhờ hoạtđộng của ngăn xếp). Nóiđ ến ngắt không thể không nói

đến mức ưu tiên của các loại ngắt khác nhau. Có 02 loại mứcưu tiên ngắt

cơ bản làưu tiên giữa các ngắt xảy rađồng thời (ngắt A và ngắt B xảy ra

đồng thời cùng một lúc) và ưu tiên giữa các ngắt xảy ra khác thời điểm

(đang thực hiện chương trình phục vụ ngắt A thì lại xảy ra ngắt B). Trong cả hai trường hợp, ngắt có mứcưu tiên cao hơn sẽ luônđ ược phục vụ ngay lập tức. Tùy loại vi xử lý mà mứcưu tiên có thể thayđ ổiđ ư ợc linh hoạt hoặc cố

định.

Khác với chương trình con, thờiđiểm thực hiện chương trình phục vụ ngắt

trong hầu hết các trường hợp là nằm ngoài sự kiểm soát của người lập trình

do ngắt có thể xảy ra bất kỳ thờiđiểm nào, khi CPUđang thực hiện bất kỳ

một lệnh nào trong chương trình chính.

Vì thế cơ chế hoạtđ ộng một cách tự động của ngăn xếp là không thể thiếu trong một vi xử lý. Cũng vì thế mà cần phải xem xét kỹ lưỡng việc sử dụng các tài nguyên (thanh ghi, ô nhớ, biến, thậm chí là các ngoại vi) của các chương trình phục vụ ngắtđ ể tránh tranh chấp với chương trình chính. Thông thường thì khi vàođ ầu chương trình phục vụ ngắt, người ta lưu lại những tài nguyên dùng chungđó trước khi thayđ ổi chúng. Kết thúc chương trình phục vụ ngắt, các tài nguyên sẽ được khôi phục lại giá trị của chúng trước khi trở về chương trình chính. Thực hiện các thao tác lưu trữ và khôi phục nàyđ ư ơng nhiên liên quanđ ến ngăn xếp, chỉ cóđiều không phải thực hiện một cách tự động bởi CPU mà phải do người lập trình chủ động thực hiện bằng các lệnh. Người lập trình phải quyếtđ ịnh cất những gì và lấy ra những gì! Cũng phải chú ýđến cơ chế hoạtđộng "vào sau ra trước" của ngăn xếp và cấtđi bao nhiêu thì phải lấy ra bấy nhiêu. Nếu không bạn sẽ phạm phải một lỗi tương tự như tràn ngăn xếp và chỉ có Chúa mới biếtđ ư ợc chuyện gì sẽ xảy ra khiđ ịa chỉ trở về khôngđ ư ợc nạpđúng vào thanh ghi PC. Một trong những tài nguyên hay bị thayđổi khi thực hiện chương trình phục vụ ngắt là các cờ trạng thái của CPU.Đó là các bit thể hiện trạng thái hiện thời của CPU và của kết quả thực hiện các lệnh. Các cờ này thường

được ghép với nhau thành một thanh ghi và được gọi là thanh ghi trạng thái.

III. LẬP TRÌNH CHO MỘT VI XỬ LÝ

Sau khi thiết kế xong phần cứng, bạn phải tiến hành lập trình cho vi xử lýđ ể hoàn thiện sản phẩm của mình. Vi xử lý có thể được lập trình bằng ngôn ngữ bậc cao hay ngôn ngữ bậc thấp. Ngôn ngữ bậc thấp là ngôn ngữ được thiết kế riêng cho từng loại vi xử lý và thườngđư ợc gọi là hợp ngữ (Assembly). Ngôn ngữ bậc cao là các ngôn ngữ gần với ngôn ngữ của con người và giống nhau cho nhiều loại vi xử lý. Mỗi loại ngôn ngữ đều cóưu và nhượcđiểm riêng. Với những người mới bắtđ ầu nghiên cứu về kỹ thuật vi xử lý, theo kinh nghiệm của riêng bản thân, tôi cho rằng nên bắtđ ầu với ngôn ngữ bậc thấp. Có một sốđiểmđáng lưu ý khi bạn lập trình cho một vi xử lý.Đó là:

Trước tiên bạn phải hiểu rõđư ợc các chế độ địa chỉ của vi xử lýđó.

Chế độ địa chỉ chính là cách chỉ ra toán hạng nằmở đâu. Toán hạng là các tham số, các hằng số, các ô nhớ, các thanh ghi, các bit, các cờ...hay nói chung là cácđối tượng tham gia vào việc thực hiện lệnh. Thông thường thì một toán hạng (ví dụ như một thanh ghi) có thể được trỏ đến bằng một vài chế độ địa chỉ khác nhau. Mỗi chế độ địa chỉ có thế mạnh riêng của nó và tùy từng trường hợp mà ta nên chọn chế độ thích hợp khi lập trình.

Sauđó bạn phải nắm bắtđ ược tập lệnh (Instruction Set) của vi xử lýđó.

Tập lệnh là tất cả những lệnh mà vi xử lý có thể hiểuđ ược, có thể thực hiện

được. Mỗi lệnh đều được mã hóa (hay được quy ước) bởi một chuỗi các bit

0 và 1. Các vi xử lý khác nhau thì có tập lệnh khác nhau do nhà sản xuất

chip cung cấp.

Trước khi bắtđ ầu viết các lệnh cụ thể, bạn nên viết lưuđ ồ thuật toán thực

hiện các nhiệm vụ cụ thể.

Lưuđồ thuật toán là sơ đồ diễn giải trình tự thực hiện các nhiệm vụ một cách lôgic và liền mạch. Viết lưuđ ồ thuật toán ngay cả cho các chương trình hết sứcđ ơn giản là một thói quen rất tốt ngay cả khi bạnđã là một cao thủ trong lập trình vi xử lý. Chỉ cần mất chút thời gian thực hiện công việc này, bạn sẽ cóđ ư ợc cái nhìn vừa bao quát vừa chi tiếtđ ối với chương trình mìnhđ ịnh viết, nhờđó mà bạn lập trình nhanh hơn, hiệu quả hơn và dễ dàng phát hiện ra lỗi về thuật toán xử lý nếu chương trình chạy không như ý muốn.Đối với bản thân tôi mà nói, tôi cho rằng viết các dòng lệnh cho một vi xử lý không phải là khó, ngược lại nó rất dễ, cái khó là bạn phải biếtđ ư ợc mình phải viết những gì hay nóiđúng hơn là phải tìm ra một lưuđồ thuật toánđúngđ ắn. Khiđã tìm ra conđ ườngđiđúng và hiệu quả, tất cả những gì còn lại phải làm là thể hiện các thao tác xử lýđó bằng cách lệnh của vi xử lý - một công việc mà bất cứ ai nắm rõ tập lệnh của vi xử lýđóđ ều có thể làm tốt. Khi lưuđồ thuật toán bạn lập ra làđúng, nếu sau khi lập trình mà vi xử lý hoạtđ ộng không như mong muốn thì lỗi chỉ có thể là do bạn chưa thể hiện bằng các dòng lệnh một cáchđúngđ ắn những gìđã lập ra mà thôi. Dần dần, kinh nghiệm tích lũyđ ư ợc sẽ chỉ cho bạn cách thể hiệnđúng một lưu

đồbất kỳthậm chí ngay ởlần đầu tiên và theo như cách chúng tôi vẫn nói

đùa trong chuyên môn, trình độlập trình của bạn đã đạt đến cấp độ"p lug

and play"

Chương trình sẽ được viết trong một file mã nguồn (thường cóđuôi là

ASM).

Phần mềm trên máy tính có tên là "Trình biên dịch" (Compiler) sẽ dịch file

mã nguồn sang một file cóđuôi là OBJ.

File này chứa thông tin cần thiếtđ ể có thể chuyểnđ ổi sang file cóđuôi HEX hay file cóđuôi BIN (là các file chứa mã chương trìnhđãđ ư ợc chuyển sang dạng Hexa hay Binary)đ ể có thể nạp vào trong bộ nhớ chương trình của vi xử lý.

Trong khi lập trình, hãyđặc biệt lưu ýđ ến các tình huống rẽ nhánh của

chương trình.

Các tình huốngđó bao gồm các lệnh nhảy vôđiều kiện, các lệnh nhảy có

điều kiện, các lệnh gọi chương trình con, các tình huống xảy ra ngắt và

đương nhiên phải chú ý đến các phần cứng liên quan nhưngăn xếp hay các

cờ trạng thái.

Với mỗi loại vi xử lý/viđiều khiển lại có nhiều hãng cung cấp các phần mềm

trên máy tính dùngđ ể soạn thảo và biên dịch.

Các phần mềm này có các từ khóa khác nhau mà người lập trình phải tuân thủ khi sử dụng. Từ khóa là các ký hiệuđ ược thể hiện bằng các ký tự,đ ư ợc viết trong file mã nguồn nhưng nó không phải là lệnh của vi xử lý,đ ương nhiên khôngđ ư ợc dịch ra mã máy,đó chỉ là các chỉ dẫn cho phần mềm trên máy tính thực hiện biên dịch các file mã nguồn sang mã máy một cách chính xác

Bạn đang đọc truyện trên: Truyen2U.Pro

#nhatduyxp