Hỏi Về Xung Clock Là Gì Vai Trò Của Nó, Hỏi Về Xung Clock

KHÁI NIỆM CƠ BẢN TRONG KỸ THUẬT VI XỬ LÝI.

Bạn đang xem : Xung clock là gì vai trò của nó 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…
*

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 giải quyết và xử lý chính là CPU, những phần cứng khác chỉ là những cơ quan chấp hành dưới quyền của CPU. Mỗi cơ quan này đều có một chính sách hoạt động giải trí nhất định mà CPU phải tuân theo khi tiếp xúc với chúng. Để hoàn toàn có thể tiếp xúc và điều khiển và tinh chỉnh những cơ quan chấp hành ( những 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 tài liệu ( Data ) và tín hiệu điều khiển và tinh chỉnh ( Control ). Về mặt vật lý thì những tín hiệu này là những đường nhỏ dẫn điện nối từ CPU đến những ngoại vi hoặc thậm chí còn là giữa những ngoại vi với nhau. Tập hợp những đường tín hiệu có cùng công dụng gọi là những bus. Như vậy ta có những bus địa chỉ, bus tài liệu và bus điều khiển và tinh chỉnh. Có thể miêu tả sơ bộ cấu trúc phần cứng của một vi giải quyết và xử lý theo hình sau : Sau đây là miêu tả sơ bộ về những phần cứng bên trong một vi giải quyết và xử lý. 1. Đơn vị giải quyết và xử lý TT CPU : CPU có cấu trúc gồm có đơn vị chức năng xử lý số học và lôgic ( ALU ), những thanh ghi, những khối lôgic và những mạch tiếp xúc. Chức năng của CPU là thực thi những thao tác giám sát giải quyết và xử lý, đưa ra những tín hiệu địa chỉ, tài liệu và tinh chỉnh và điều khiển nhằm mục đích thực thi một trách nhiệm nào đó do người lập trình đưa ra trải qua những 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ớ tài liệu. Bộ nhớ chương trình dùng để chứa mã chương trình hướng dẫn CPU thực thi một trách nhiệm nào đó. Thông thường thì bộ nhớ chương trình là những 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 ứng nguồn nuôi. Có thể kể ra một số ít bộ nhớ thuộc loại này như : ROM, PROM, EPROM, EEPROM, Flash. Bộ nhớ tài liệu là bộ nhớ dùng để chứa tài liệu ( gồm có những tham số, những biến trong thời điểm tạm thời … ). Tuỳ thuộc loại tài liệu mà bộ nhớ loại này hoàn toàn có thể là loại “ không bay hơi ” hoặc “ bay hơi ” ( mất tài liệu khi cắt nguồn nuôi ). Loại “ bay hơi ” thường thấy là những bộ nhớ SRAM. 3. Cổng vào / ra song song : Đây là những đường tín hiệu được nối với một số ít chân của IC dùng để tiếp xúc với quốc tế 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ỉ hoàn toàn có thể đwocj trình diễn bởi một trong hai giá trị lôgic ( 0 hoặc 1 ). Trong kỹ thuật vi giải quyết và 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 giao động 0VDC, giá trị lôgic 1 ứng với mức điện áp cao giao động + 5VDC. Tùy loại vi giải quyết và xử lý mà “ khoảng chừng xê dịch ” đó là khác nhau nhưng nhìn chung là thích hợp 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à những cổng 08 bit. Các đường tín hiệu vào / ra của những 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 hoàn toàn có thể đưa ra hay đọc vào những giá trị lôgic khác nhau so 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ú ý quan tâm nữa so với những cổng vào / ra đó là chúng hoàn toàn có thể được tích hợp thêm ( nói đúng hơn là kiêm thêm ) những công dụng đặc biệt quan trọng tương quan đến những ngoại vi khác. 4. Cổng vào / ra tiếp nối đuôi nhau : Khác với cổng song song, với cổng tiếp nối đuôi nhau những 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 những đường tín hiệu khác nhau. Thông thường thì việc truyền tài liệu bằng cổng tiếp nối đuôi nhau phải tuân theo một chính sách, một giao thức hay một nguyên tắc nhất định. Có thể kể ra 1 số ít giao thức như SPI, I2C, SCI … Cổng tiếp nối đuôi nhau có 02 kiểu truyền tài liệu chính : – Truyền đồng điệu ( 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 hề thiếu trong truyền tài liệu tiếp nối đuôi nhau và nó có vaitrò xác lập giá trị của bit dữ liệu ( hay nói đúng hơn là xác lập thời gian đọc mức lôgic trên đường truyền dữ liệu ). Cổng tiếp nối đuôi nhau hoàn toàn có thể có một trong những tính năng sau : Đơn công : thiết bị chỉ hoàn toàn có thể hoặc truyền hoặc nhận tài liệu. Bán song công : thiết bị hoàn toàn có thể truyền và nhận tài liệu nhưng tại một thời gian chỉ hoàn toàn có thể làm một trong hai việc đó. Song công : thiết bị hoàn toàn có thể truyền và nhận tài liệu đồng thời. 5. Bộ đếm / Bộ định thời : Đây là những ngoại vi được phong cách thiết kế để thực thi một trách nhiệm đơn thuần : đếm những 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ị chức năng ( trong chính sách đếm tiến / đếm lên ) hay giảm đi 01 đơn vị chức năng ( trong chính sách đếm lùi / đếm xuống ). Xung nhịp đưa vào đếm hoàn toàn 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ờ phối hợp mạch xê dịch bên trong IC và những linh phụ kiện phụ bên ngoài nối với IC. Ta hoàn toàn có thể ví đó là “ nhịp tim ” để hàng loạt những phần cứng bên trong vi giải quyết và xử lý ( gồm có cả CPU và những ngoại vi ) hoàn toàn có thể hoạt động giải trí được. Trong trường hợp sử dụng xung nhịp loại này, người ta gọi là những bộ định thời ( timers ). Do xung nhịp bên loại này thường đều đặn nên ta hoàn toàn có thể dùng để đếm thời hạn một cách khá đúng chuẩn. Xung nhịp bên ngoài IC. Đó là những tín hiệu lôgic đổi khác liên tục giữa 02 mức 0-1 và không nhất thiết phải là đều đặn. Trong trường hợp này người ta gọi là những bộ đếm ( counters ). Ứng dụng thông dụng của những bộ đếm là đếm những sự kiện bên ngoài như đếm những 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ó hoàn toàn có thể màn 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 những 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 tiếp xúc bus. Khối này có tính năng ghép nối giữa những bus bên trong chip và những chân đưa ra ngoài chip. Mục đích của việc đưa những tín hiệu địa chỉ, tài liệu và tinh chỉnh và điều khiển ra ngoài là nhằm mục đích lan rộng ra năng lực phối ghép thêm của vi giải quyết và xử lý với những ngoại vi khác ( hầu hết là những bộ nhớ ngoài ) ngoài những ngoại vi được tích hợp trên IC. Thông thường thì số lượng những đường tín hiệu là giữ nguyên khi đưa ra ngoài chip, tuy nhiên trong 1 số ít trường hợp số lượng những đường tín hiệu hoàn toàn có thể nhỏ hơn số lượng thực bên trong ( ví dụ như trường hợp của vi giải quyết và xử lý 8088, bus tài liệu bên trong là 16 bit nhưng đưa ra ngoài chỉ có 8 bit ). Khi đưa ra ngoài, những tín hiệu địa chỉ và tài liệu hoàn toàn có thể được ghép với nhau ( cùng sử dụng chung 1 số ít chân nào đó ) hoặc được tách riêng ( tín hiệu địa chỉ dùng một số ít chân, tín hiệu tài liệu dùng 1 số ít chân khác ). Người ta thường “ dồn kênh ” ( multiplex ), tức là ghép tính năng, giữa bus địa chỉ và bus dữ liệu để giảm thiểu số chân thiết yếu. Trong trường hợp này, tín hiệu địa chỉ sẽ Open trước, sau đó là tín hiệu tài liệu trên cùng một tập hợp những đường tín hiệu. Để tách được 2 loại tín hiệu đó thì đơn vị sản xuất cung ứng cho người sử dụng một đường tín hiệu tinh chỉnh và đ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ỉ Open và không tích cực khi tín hiệu tài liệu Open trên bus. Các IC thích hợp với việc tách tín hiệu địa chỉ và tài liệu là những IC thuộc họ 74 xx373 / 374 hoặc 74 xx573 / 574. Trên đây là miêu tả sơ bộ cấu trúc phần cứng của một vi giải quyết và xử lý. Trước khi đi tiếp, tôi xin san sẻ với bạn một kinh nghiệm tay nghề quý báu khi nghiên cứu và điều tra kỹ thuật vi giải quyết và xử lý. Đó là bạn phải biết đồng ý. Đúng ! Kỹ thuật vi giải quyết và 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ở kim chỉ nan 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 những bạn đang đọc những dòng chữ trong tài liệu này, tất cả chúng ta ngầm hiểu rằng bạn mới chỉ mở màn quy trình điều tra và nghiên cứu. Đó là một nghành nghề dịch vụ hoàn toàn có thể nói không ít mới mẻ và lạ mắt và bạn chắc như đinh hầu hết chưa có nhiều tưởng tượng 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ổng thể những ai đã từng điều tra và nghiên cứu kỹ thuật vi giải quyết và 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 những khái niệm ( dù là khái niệm đơn thuần ) tương quan đến nghành nghề dịch vụ này. Chúng ta khi mới khởi đầu đều tự đưa ra những câu hỏi cho mình đại loại như : tại sao vi giải quyết và xử lý hoàn toàn có thể làm được nhiều việc đến vậy ? cái gì diễn ra bên trong chip khi tất cả chúng ta cấp nguồn nuôi cho nó ? tại sao ta lại hoàn toàn có thể ảnh hưởng tác động đến timer hay những ngoại vi khác trải qua những dòng lệnh viết cho CPU ? hoặc thậm chí còn là mạch điện bên trong một vi giải quyết và 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 vấn đáp cho những vướng mắc đó, bạn sẽ hoàn toàn có thể mất rất nhiều thời hạn, công sức của con người mà hiệu suất cao nghiên cứu và điều tra sẽ không cao, và cho đến khi tìm thấy câu vấn đáp thỏa mãn nhu cầu cho một yếu tố mà bạn do dự, hoàn toàn có thể bạn đã quên mất một vài hay tổng thể những kỹ năng và kiến thức còn lại ! Như tôi đã nói, khi mới mở màn nghiên cứu và điều tra, bạn hãy gật đầu những kiến thức và kỹ năng cơ bản như gật đầu những tiên đề. Hãy coi đó là những cái mà người ta đã thiết kế 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 tỏ sự đúng đắn của chúng. Thay vào đó, bạn chỉ cần tiếp thu và thừa kế. Hãy công nhận chúng như một điều gì đó hiển nhiên. Một cách đơn thuần, bạn không cần phải khám phá yếu tố đế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 ”, công dụng của chúng là gì, nguyên tắc hoạt động giải trí ra làm sao và để điều khiển và tinh chỉnh được chúng thì cần phải làm những gì ( đơn cử 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 những bạn học một cách “ hổng ”, không cần đến kiến thức và kỹ năng cơ bản. Nếu bạn là người đã có không ít kỹ năng và kiến thức điện tử ( đặc biệt quan trọng là điện tử số ), bạn quả là như mong muốn khi đã có một nền tảng kỹ năng và kiến thức vững chãi khi tiếp cận với kỹ thuật vi giải quyết và xử lý. Bạn hoàn toàn có thể hiểu thuận tiện cấu trúc của một bộ đếm, nguyên tắc hoạt động giải trí của nó và chắc như đinh bạn thấy thuận tiện tiếp thu hơn nếu như trong bài học kinh nghiệm tôi nói với bạn rằng “ trong vi tinh chỉnh và điều khiển họ 8051 có tích hợp tối thiểu 02 ngoại vi gọi là những bộ đếm ”. Đó là vì bạn đã có những khái niệm cơ bản, những tưởng tượng 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à nguyên do để tất cả chúng ta thao tác với nhau ! Chỉ cần kiên trì đôi chút, những gì bạn phải gật đầu một cách gượng ép và đôi lúc có vẻ như như vô lý vào lúc này, bạn sẽ nhận lại được câu vấn đáp thỏa mãn nhu cầu trong quy trình tìm hiểu và khám phá kỹ thuật vi giải quyết và xử lý cùng tôi, đặc biệt quan trọng khi bạn nghiên cứu và điều tra và thực hành thực tế với những vi điều khiển và tinh chỉnh đơn cử. 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 giải quyết và xử lý – “ khoảng trống địa chỉ ”. Nó được hiểu là số lượng địa chỉ mà CPU hoàn toàn 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ớ đơn cử, do đó CPU tất yếu phải phân biệt được những ô 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 giải quyết và xử lý còn có 1 số ít phần cứng khác cũng cần có một địa chỉ dành riêng cho nó như những thanh ghi tinh chỉnh và điều khiển, những thanh ghi dữ liệu … Thường thì phần đông toàn bộ những phần cứng cần được truy nhập hay ảnh hưởng tác động đến đều phải được gắn với một hay nhiều địa chỉ .Xem thêm : 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ộ nhớ 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ại lan 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ết chấ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ộ nhớ chươ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ự độngtă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ăn xế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à ngă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ế ngắ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áiIII. 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 độ “plug 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.Lấy ví dụ, để hoàn toàn có thể tiếp xúc và tinh chỉnh và điều khiển một bộ đếm ( timer / counter ), CPU cần phải ảnh hưởng tác động đến những thanh ghi lao lý chính sách hoạt động giải trí, 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ờ những địa chỉ đó mà CPU hoàn toàn có thể ghi / đọc giá trị của những thanh ghi, qua đó tác động ảnh hưởng lên bộ đếm. Vi giải quyết và xử lý hoạt động giải trí theo một số ít nguyên tắc cơ bản sau : – Các thao tác thống kê giám sát giải quyết và xử lý sẽ được vi giải quyết và xử lý, hay nói đúng hơn là CPU, thực thi theo những hướng dẫn ( chính là những lệnh ) đặt trong bộ nhớ chương trình. Đương nhiên trong bộ nhớ chương trình không có những hướng 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 trong thời điểm 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 từ của con người, những vi giải quyết và xử lý không nghe được và đương nhiên không hiểu được những câu đó, chúng chỉ hoàn toàn có thể nhận ra đượ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 hoàn toàn 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 chính sá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 giải quyết và xử lý hoàn toàn 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 cuội nguồn người ta pháp luật chung rằng những giá trị lôgic đó là 0 và 1. Biểu thị những giá trị lôgic đó theo quy ước lôgic dương là điện áp cao ( giao động + 5VDC ) cho giá trị 1 và điện áp thấp ( giao động 0VDC ) cho giá trị 0. Như vậy, thay vì nói với vi giải quyết và 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 những bit lôgic 0-1 ( ví dụ 00001010 ví dụ điển hình ) 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 yếu nó hiểu cái chuỗi 0-1 đó có nghĩa là gì và nó sẽ thực thi 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 vấn đáp là bạn lại lan man rồi đấy ! Nó hiểu được đơn thuần vì người ta sản xuất ra đã như thế rồi. Hãy biết gật đầu như vậy vào lúc này ! – Việc triển khai những lệnh sẽ diễn ra tuần tự ( lệnh ở địa chỉ thấp hơn được thực thi trước ) mở màn từ địa chỉ reset. Địa chỉ reset là địa chỉ của bộ nhớ chương trình mà tại đó, sau khi được cấp nguồn nuôi, CPU sẽ bắt đầu đọc và thực thi theo hướng dẫn được mã hóa đặt tại đó. Mỗi loại vi giải quyết và xử lý có một địa chỉ reset riêng ( thường là từ 0000H ) do đơn vị sản xuất pháp luật. – Các lệnh được thực thi 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 thi. Khi CPU tìm nạp được mã của lệnh n, thanh ghi PC sẽ tự độngtăng lên 1 đơn vị chức năng để trỏ vào ô nhớ chứa mã của lệnh ( n + 1 ). – CPU triển khai một lệnh theo những bước nhỏ. Thường thì những bước đó gồm có : tìm nạp mã lệnh ( fetch-tức là truy vấn 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 thuật lệnh ( decode-giải mã giá trị đã lấy được và đang đặt trong thanh ghi chứa mã lệnh trong CPU ), sau cuối là triển khai lệnh ( execute-thực hiện hướng dẫn được giải thuật ra từ mã lệnh đọc được ). Những vi giải quyết và xử lý tiên phong được phong cách thiết kế với phương pháp triển khai lệnh một cách thuần “ tuần tự ”, nghĩa là thực thi tuần tự 3 bước so với lệnh thứ n rồi mới triển khai 3 bước tiếp theo của lệnh thứ ( n + 1 ). Sau này, những vi giải quyết và xử lý được phong cách thiết kế với CPU được module hóa thành từng phần riêng không liên quan gì đến nhau có hoạt động giải trí khá độc lập với nhau, do đó mà cấu trúc giải quyết và xử lý đường ống ( pipeline ) sinh ra. Với cấu trúc này, những bước nhỏ trong việc triển khai những lệnh sẽ được gối lên nhau, trong khi một phần cứng của CPU triển khai bước 3 ( triển khai lệnh ) của lệnh n thì một phần cứng khác của CPU triển khai việc giải thuật 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 giải quyết và xử lý đường ống, vận tốc giải quyết và xử lý của CPU đã được nâng cao rõ ràng và toàn bộ những vi giải quyết và xử lý thời nay đều được phong cách thiết kế với CPU theo cấu trúc giải quyết và 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ở lại của trong những trường hợp chương trình con hoặc chương trình Giao hàng ngắt được gọi. Ngoài ra ngăn xếp còn dùng để lưu những tài liệu trong thời điểm tạm thời. Ngăn xếp hoạt động giải trí theo chính sá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 hóa. Ngăn xếp là phần cứng vô cùng quan trọng trong vi giải quyết và xử lý, nó tham gia vào những 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 rất là cẩn trọng 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 những vùng nhớ lưu tài liệu khác. Khi xảy ra một trong những sự cố trên, sẽ không có cách nào trấn áp được hoạt động giải trí của vi giải quyết và xử lý và hoàn toàn có thể gây thiệt hại lớn so với mạng lưới hệ thống. Giống như một game show, khi bạn tham gia và vì một nguyên do nào đó phạm vào một trong hai lỗi đó, tổng thể những gì bạn sẽ nhận được trên màn hình hiển thị là dòng chữ “ GAME OVER ” ! – Vậy thế nào là địa chỉ trở về ? Như đã nói ở trên, vi giải quyết và xử lý thực thi những 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 nhiều lúc nó gặp phải một lệnh gọi chương trình con và do đó phải chuyển sang triển khai 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 tục 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 thi 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 tiên phong của chương trình con. Việc nạp giá trị mới cho PC được triển khai một cách tự động hóa khi bạn gọi một chương trình con, ngoài những đị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 hóa lưu lại để sau khi triển khai xong chương trình con, CPU sẽ hoàn toàn có thể quay lại triển khai 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 hóa địa chỉ quay trở lại ( địa chỉ của lệnh tiếp sau lệnh gọi chương trình con ) ấy chính là ngăn xếp. Người ta triển khai việc chia chương trình chính thành những chương trình con ( là những đoạn chương trình thực thi một trách nhiệm đơn cử ) để thuận tiện cho việc lập trình và dò lỗi. Bạn sẽ dần có được kiến thức và kỹ năng chia nhỏ chương trình chính thành những chương trình con một cách hài hòa và hợp lý trong quy trình lập trình cho vi giải quyết và xử lý. – Ngăn xếp cũng có vai trò tương tự như như so với ngắt. Vậy ngắt là gì ? Đó là những nhu yếu do những ngoại vi ( là những phần cứng tích hợp trên IC hoặc những ảnh hưởng tác động từ bên ngoài ) gửi tới CPU nhằm mục đích yên cầu những cung ứng nhất định. Mục đích của việc phong cách thiết kế chính sách ngắt trong vi giải quyết và xử lý là nhằm mục đích tiết kiệm chi phí thời hạn cho CPU. Trong hầu hết những trường hợp, vi giải quyết và xử lý cần phải triển khai nhiều trách nhiệm trong thời hạn rất ngắn và liên tục. Để hoàn toàn có thể cung ứng kịp thời với những sự kiện cần giải quyết và xử lý, CPU hoàn toàn có thể thực thi thăm dò polling ) liên tục những sự kiện để xem khi nào chúng xảy ra thì giải quyết và xử lý, cung ứng lại. Tuy nhiên nếu làm vậy thì tiêu tốn lãng phí rất nhiều thời hạn của CPU trong khi còn có rất nhiều trách nhiệm khác đang chờ được thực thi, ngoài những CPU không hề 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 những sự kiện cần cung ứng với những chính sách ngắt khác nhau, khi một sự kiện nào đó xảy ra, phần cứng đảm nhiệm ngắt tích hợp trên CPU sẽ tự động hóa báo cho CPU biết rằng sự kiện đã xảy ra. CPU sẽ dừng việc làm đang làm lại ( nhưng phải triển khai xong lệnh đang được thực thi, dù mới chỉ ở tiến trình tìm nạp mã lệnh ), và chuyển sang phân phối bằng cách thực thi chương trình Giao hàng ngắt tương ứng. Đáp ứng xong, tức là giải quyết và xử lý xong sự kiện gây ra ngắt, CPU sẽ liên tục quay lại làm tiếp việc làm đang dang dở ( đương nhiên là nhờ hoạt động giải trí của ngăn xếp ). Nói đến ngắt không hề không nói đến mức ưu tiên của những 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 những 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 những ngắt xảy ra khác thời gian ( đang thực thi chương trình Giao hàng 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 Giao hàng ngay lập tức. Tùy loại vi giải quyết và xử lý mà mức ưu tiên hoàn toàn có thể đổi khác được linh động hoặc cố định và thắt chặt. – Khác với chương trình con, thời gian thực thi chương trình ship hàng ngắt trong hầu hết những trường hợp là nằm ngoài sự trấn áp của người lập trình do ngắt hoàn toàn có thể xảy ra bất kể thời gian nào, khi CPU đang thực thi bất kể một lệnh nào trong chương trình chính. Vì thế chính sách hoạt động giải trí một cách tự động hóa của ngăn xếp là không hề thiếu trong một vi giải quyết và xử lý. Cũng do đó mà cần phải xem xét kỹ lưỡng việc sử dụng những tài nguyên ( thanh ghi, ô nhớ, biến, thậm chí còn là những ngoại vi ) của những chương trình ship hàng 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 ship hàng ngắt, người ta lưu lại những tài nguyên dùng chung đó trước khi biến hóa chúng. Kết thúc chương trình Giao hàng ngắt, những tài nguyên sẽ được Phục hồi lại giá trị của chúng trước khi trở lại chương trình chính. Thực hiện những thao tác tàng trữ và Phục hồi này đương nhiên tương quan đến ngăn xếp, chỉ có điều không phải triển khai một cách tự động hóa bởi CPU mà phải do người lập trình dữ thế chủ động triển khai bằng những lệnh. Người lập trình phải quyết định hành động cất những gì và lấy ra những gì ! Cũng phải quan tâm đến chính sách hoạt động giải trí “ 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ựa như 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ị đổi khác khi triển khai chương trình Giao hàng ngắt là những cờ trạng thái của CPU. Đó là những bit thể hiện trạng thái hiện thời của CPU và của tác dụng triển khai những 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áiIII. LẬP TRÌNH CHO MỘT VI XỬ LÝSau khi phong cách thiết kế xong phần cứng, bạn phải triển khai lập trình cho vi giải quyết và xử lý để triển khai xong mẫu sản phẩm của mình. Vi giải quyết và xử lý hoàn toàn có thể được lập trình bằng ngôn từ bậc cao hay ngôn từ bậc thấp. Ngôn ngữ bậc thấp là ngôn từ được phong cách thiết kế riêng cho từng loại vi giải quyết và xử lý và thường được gọi là hợp ngữ ( Assembly ). Ngôn ngữ bậc cao là những ngôn từ gần với ngôn từ của con người và giống nhau cho nhiều loại vi giải quyết và xử lý. Mỗi loại ngôn từ đều có ưu và điểm yếu kém riêng. Với những người mới mở màn nghiên cứu và điều tra về kỹ thuật vi giải quyết và xử lý, theo kinh nghiệm tay nghề của riêng bản thân, tôi cho rằng nên mở màn với ngôn từ bậc thấp. Có một số ít điểm đáng quan tâm khi bạn lập trình cho một vi giải quyết và xử lý. Đó là : – Trước tiên bạn phải hiểu rõ được những chính sách địa chỉ của vi giải quyết và xử lý đó. Chế độ địa chỉ chính là cách chỉ ra toán hạng nằm ở đâu. Toán hạng là những tham số, những hằng số, những ô nhớ, những thanh ghi, những bit, những cờ … hay nói chung là những đối tượng người dùng tham gia vào việc triển khai lệnh. Thông thường thì một toán hạng ( ví dụ như một thanh ghi ) hoàn toàn có thể được trỏ đến bằng một vài chính sách địa chỉ khác nhau. Mỗi chính sá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ính sách thích hợp khi lập trình. – Sau đó bạn phải chớp lấy được tập lệnh ( Instruction Set ) của vi giải quyết và xử lý đó. Tập lệnh là tổng thể những lệnh mà vi giải quyết và xử lý hoàn toàn có thể hiểu được, hoàn toàn có thể triển khai được. Mỗi lệnh đều được mã hóa ( hay được quy ước ) bởi một chuỗi những bit 0 và 1. Các vi giải quyết và xử lý khác nhau thì có tập lệnh khác nhau do nhà phân phối chip cung ứng. – Trước khi khởi đầu viết những lệnh đơn cử, bạn nên viết lưu đồ thuật toán thực thi những trách nhiệm đơn cử. Lưu đồ thuật toán là sơ đồ diễn giải trình tự triển khai những trách nhiệm một cách lôgic và liền mạch. Viết lưu đồ thuật toán ngay cả cho những chương trình rất là đơn thuầ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 giải quyết và xử lý. Chỉ cần mất chút thời hạn triển khai việc làm này, bạn sẽ có được cái nhìn vừa bao quát vừa chi tiết cụ thể so với chương trình mình định viết, nhờ đó mà bạn lập trình nhanh hơn, hiệu suất cao hơn và thuận tiện phát hiện ra lỗi về thuật toán giải quyết và 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 những dòng lệnh cho một vi giải quyết và 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 suất cao, toàn bộ những gì còn lại phải làm là bộc lộ những thao tác giải quyết và xử lý đó bằng cách lệnh của vi giải quyết và xử lý – một việc làm mà bất kể ai nắm rõ tập lệnh của vi giải quyết và xử lý đó đều hoàn toàn 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 giải quyết và xử lý hoạt động giải trí không như mong ước thì lỗi chỉ hoàn toàn có thể là do bạn chưa biểu lộ bằng những 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 tay nghề tích góp được sẽ chỉ cho bạn cách bộc lộ đúng một lưu đồ bất kể thậm chí còn ngay ở lần tiên phong và theo như cách chúng tôi vẫn nói đùa trong trình độ, trình độ lập trình của bạn đã đạt đến Lever “ plug 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 thiết yếu để hoàn toàn có thể quy đổi sang file có đuôi HEX hay file có đuôi BIN ( là những file chứa mã chương trình đã được chuyển sang dạng Hexa hay Binary ) để hoàn toàn có thể nạp vào trong bộ nhớ chương trình của vi giải quyết và xử lý. – Trong khi lập trình, hãy đặc biệt quan trọng quan tâm đến những trường hợp rẽ nhánh của chương trình. Các trường hợp đó gồm có những lệnh nhảy vô điều kiện kèm theo, những lệnh nhảy có điều kiện kèm theo, những lệnh gọi chương trình con, những trường hợp xảy ra ngắt và đương nhiên phải chú ý quan tâm đến những phần cứng tương quan như ngăn xếp hay những cờ trạng thái. – Với mỗi loại vi giải quyết và xử lý / vi tinh chỉnh và điều khiển lại có nhiều hãng phân phối những ứng dụng trên máy tính dùng để soạn thảo và biên dịch. Các ứng dụng này có những 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à những ký hiệu được bộc lộ bằng những ký tự, được viết trong file mã nguồn nhưng nó không phải là lệnh của vi giải quyết và xử lý, đương nhiên không được dịch ra mã máy, đó chỉ là những hướng dẫn cho ứng dụng trên máy tính thực thi biên dịch những file mã nguồn sang mã máy một cách đúng mực .

Xem thêm  Top 3 từ điển từ đồng nghĩa cực "xịn" mà ít ai biết -

Source: https://bem2.vn
Category: TỔNG HỢP

Rate this post

Bài viết liên quan

Để lại ý kiến của bạn:

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *