1.4.1. Yêu cầu phải quản lý bộ nhớ
Bộ nhớ là thiết bị l−u trữ duy nhất mà thơng qua đĩ CPU cĩ thể trao đổi thơng tin với mơi tr−ờng bên ngồi. Do vậy, nhu cầu tổ chức, quản lý bộ nhớ là một trong những nhiệm vụ cơ bản hàng đầu của hệ điều hành. Bộ nhớ đ−ợc tổ chức nh− mảng một chiều các từ nhớ (word), mỗi từ nhớ cĩ một địa chỉ. Việc trao đổi thơng tin với mơi tr−ờng bên ngồi đ ợc thực hiện thơng qua các thao tác − đọc/ghi dữ liệu vào một địa chỉ cụ thể nào đĩ trong bộ nhớ.
Hệ điều hành chịu trách nhiệm cấp phát khơng gian nhớ cho các tiến trình khi cĩ yêu cầu. Để thực hiện tốt nhiệm vụ này, hệ điều hành cần phải xem xét một số khía cạnh sau:
- Sự t−ơng ứng giữa địa chỉ logic và địa chỉ vật lý: Làm thế nào để chuyển đổi một địa chỉ logic thành một địa chỉ vật lý.
- Quản lý bộ nhớ vật lý bao gồm: Phân bổ khơng gian nhớ cho các tiến trình hoạt động, thu hồi khơng gian nhớ khi tiến trình kết thúc, quản lý đ−ợc khơng gian nhớ tự do.
- Chia sẻ thơng tin: Cho phép các tiến trình đang hoạt động trong bộ nhớ cĩ thể chia sẻ thơng tin với nhau.
- Bảo vệ bộ nhớ: Ngăn chặn các tiến trình xâm phạm đến vùng nhớ đ−ợc cấp phát cho các tiến trình khác.
1.4.2. Các sơ đồ quản lý bộ nhớ
1.4.2.1. Sơ đồ phân hoạch cố định
Bộ nhớ đ−ợc chia thành n phần khơng nhất thiết phải bằng nhau và mỗi phần đ−ợc sử dụng nh− một bộ nhớ độc lập gọi là một phân hoạch. Mỗi phân hoạch cĩ thể nạp đ−ợc một ch ơng trình và tổ chức thực hiện một cách đồng thời. Nh− − vậy trên lý thuyết nếu cĩ n phân hoạch thì sẽ cĩ thể nạp đ−ợc n ch−ơng trình và thực hiện một cách đồng thời (n đ−ợc gọi là hệ số song song của hệ thống).
1.4.2.2. Sơ đồ phân hoạch động
Trong sơ đồ này, bộ nhớ cĩ một bảng quản lý khơng gian nhớ tự do thống nhất. Khi thực hiện ch−ơng trình, hệ thống dựa vào kích th−ớc ch−ơng trình để phân bổ khơng gian nhớ thích hợp, tạo thành một vùng nhớ độc lập và tạo bảng quản lý riêng. Khi các ch−ơng trình kết thúc, bộ nhớ giành cho nĩ sẽ bị thu hồi.
1.4.2.3. Sơ đồ hốn đổi (swapping)
Sơ đồ hốn đổi dựa trên nguyên tắc nội dung ch−ơng trình ở trạng thái chờ đợi trong một khoảng thời gian dài sẽ đ−ợc tạm thời chuyển ra bộ nhớ ngồi (swap out) để giải phĩng vùng nhớ cấp phát cho ch−ơng trình khác hoạt động. Khi ch−ơng trình kết thúc trạng thái chờ nĩ sẽ đ−ợc nạp trở lại bộ nhớ trong (swap in) để tiếp tục thực hiện.
Ch−ơng 2 - Vi điều khiển và ngơn ngữ lập trình cho vi điều khiển
2.1. Vi điều khiển
2.1.1. Vi xử lý và vi điều khiển.
Bộ vi xử lý đã cĩ lịch sử ra đời từ 1971 khi Intel giới thiệu bộ 8080 dùng cho máy tính đơn board. Kể từ khi ra đời, qua nhiều thế hệ, cĩ nhiều cải tiến nh−ng lĩnh vực của các bộ vi xử lý vẫn là các hệ thống máy tính. Trong hệ thống máy tính, bộ vi xử lý cùng với bộ nhớ, các thiết bị vào/ra...,hợp thành một hệ thống cĩ khả năng xử lý, điều khiển, l−u trữ... cực mạnh.
Một hệ thống máy tính nếu dùng cho một ứng dụng lớn yêu cầu xử lý nhanh, l u trữ lớn... thì khơng cĩ vấn để gì − để bàn. Tuy nhiên nếu mang hệ thống này vào dùng cho các ứng dụng nhỏ thì lại trở thành lãng phí. Từ thực tế này các nhà sản xuất đã nghiên cứu và đ−a ra các hệ máy tính nhỏ với một bộ xử lý nhỏ, một bộ nhớ ch−ơng trình và dữ liệu nhỏ, một số các thành phần vào ra cơ bản. Tất cả các thành phần này đ−ợc gĩi gọn trong một chip đơn và đây chình là bộ vi điều khiển.
Nh− vậy để phân biệt hai khái niệm vi xử lý và vi điều khiển thì cần phải xem xét trên 2 ph−ơng diện: Kiến trúc phần cứng và lĩnh vực ứng dụng. Phần cứng của một bộ vi điều khiển là một bộ vi xử lý, bộ nhớ, các thiết bị vào/ra. Vi điều khiển cĩ đủ những thành phần cơ bản của một hệ máy tính nên bộ vi điều khiển cĩ thể hoạt động độc lập đ−ợc cịn vi xử lý thì khơng. Xuất phát từ những đặc tr−ng vừa nêu nên bộ vi điều khiển đ−ợc tìm thấy trong các ứng dụng nhỏ cịn vi xử lý nằm trong các hệ thống máy tính.
AT89S52 là bộ vi điều khiển 8 bit, đ−ợc chế tạo bởi hãng ATMEL theo kiến trúc của 8051.
Hình 2.1. Sơ đồ khối của bộ vi điều khiển AT89S52
Trên hình 2.1 là sơ đồ khối của bộ vi điều khiển này, theo đĩ bộ vi điều khiển cĩ đầy đủ các phần cứng cần thiết cho một hệ điều hành thời gian thực nh− bộ xử lý trung tâm, bộ nhớ, các bộ timer để tạo các time tick, bộ xử lý ngắt để thực hiện chuyển mạch giữa các tiến trình, khối vào ra để thực hiện các thao tác trong các tiến trình...Nh− vậy chỉ cần một bộ vi điều khiển AT89S52với giá thành khá rẻ là đã cĩ thể thực hiện các ứng dụng thời gian thực với chi phí rất thấp. Đây cũng chính là lý do để tác giả đề tài chọn nghiên cứu vi điều khiển và ứng dụng vào hệ thống thời gian thực.
Memory Intermal Devices CPU Memory ROM 8Kb RAM 256 byte I/O devices Timer0 Timer1 Timer2 (16 bit) UART Interrupt Controller System Bus ROM 64Kb RAM 64Kb I/O devices .... .... ... Extermal Devices Oscilla- tior
2.1.2. Tổ chức bộ nhớ của vi điều khiển.
AT89S52 coự boọ nhụự theo caỏu truực Harvard: coự nhửừng vuứng cho boọ nhụự riẽng bieọt cho chửụng trỡnh vaứ dửừ lieọu. Nhử ủaừ noựi ụỷ trẽn, caỷ boọ nhụự chửụn trỡnh vaứ dửừ lieọu coự saỹn ụỷ trẽn chip tuy nhiẽn dung lửụùng cuỷa caực boọ nhụự tr chip laứ hán cheỏ. Khi thieỏt keỏ caực ửựng dúng ủoứi hoỷi boọ nhụự lụựn ngửụứi ta coự duứng boọ nhụự ngoaứi vụựi dung lửụùng lẽn tụựi 64 Kbytes cho boọ nhụự chửụng trỡnh vaứ cho 64 Kbytes boọ nhụự dửừ lieọu (hỡnh 2.2).
Hình 2.2. Tổ chức bộ nhớ của vi điều khiển
2.1.2.1. Bộ nhớ ch−ơng trình.
AT89S52 cĩ 8Kb Flash Rom trên chip, khi chân EA (chân số 31) đ−ợc đặt ở mức logic cao (+5V), bộ vi điều khiển sẽ thực hiện ch−ơng trình trong Rom nội bắt dầu từ địa chỉ 0000H. Số lần lập trình (ghi) cho bộ nhớ này là khoảng 1000 lần.
Khi chân EA đ−ợc đặt ở mức logic thấp, bộ vi điều khiển sẽ thực hiện ch−ơng trình ở bộ nhớ ch−ơng trình ngồi (EPPOM ngồi), tuy nhiên để cĩ đ−ợc
Boọ nhụự ngoaứi Boọ nhụự trong Boọ nhụự chửụng trỡnh (8Kb) 256 bytes Boọ nhụự chửụng trỡnh (64Kb) Boọ nhụự dửừ lieọu (64Kb) 0000H 00FFH FFFFH 1FFFH
điều này thì cần phải cĩ một mạch phối ghép AT89S52 với EPROM đ−ợc lựa chọn.
Trên hình 2.3: Một vi mạch chốt (Latch) sẽ tách riêng Bus đa hợp địa chỉ và dữ liệu AD0-AD7; Tuỳ theo dung l−ợng của EPROM sẽ cĩ số đ−ờng địa chỉ t−ơng ứng đ−ợc dùng; EPROM đ−ợc đọc nhờ tín hiệu PSEN.
Hình 2.3. Sơ đồ ghép nối AT89S52 với EPROM
2.1.2.2. Bộ nhớ dữ liệu.
a.Bộ nhớ dữ liệu trên chip.
AT89S52 cĩ 256 bytes Ram nh− baỷng 2.1 ủửụùc phãn chia nhử sau: - Caực bank thanh ghi coự ủũa chổ tửứ 00H ủeỏn 1FH.
32 byte thaỏp cuỷa boọ nhụự noọi ủửụùc daứnh cho caực bank thanh ghi. Boọ leọnh AT89S52 hoồ trụù 8 thanh ghi coự tẽn laứ R0 -R7 vaứ theo maởc ủũnh sau khi reset heọ thoỏng, caực thanh ghi naứy coự caực ủũa chổ tửứ 00H - 07H.
Caực leọnh duứng caực thanh ghi RO - R7 seừ ngaộn hụn vaứ nhanh hụn so vụựi caực leọnh coự chửực naờng tửụng ửựng duứng kieồu ủũa chổ trửùc tieỏp. Caực dửừ lieọu ủử duứng thửụứng xuyẽn nẽn duứng moọt trong caực thanh ghi naứy.
Do coự 4 bank thanh ghi nẽn tái moọt thụứi ủieồm chổ coự moọt bank thanh ghi ủửụùc truy xuaỏt bụỷi caực thanh ghi RO - R7 ủeồà chuyeồn ủoồi vieọc truy xuaỏt caực bank thanh ghi ta phaỷi thay ủoồi caực bit chón bank trong thanh ghi tráng thaựi.
- RAM ủũa chổ hoựa tửứng bit coự ủũa chổ tửứ 20H ủeỏn 2FH.
AT89S52 coự 128 bit coự chửựa caực byte ủũnh ủũa chổ theo bit tửứ 20H ủeỏn 2FH.
Ý tửụỷng truy xuaỏt tửứng bit baống phần mềm laứ caực ủaờởc tớnh mánh cuỷa c boọ vi ủiều khieồn noựi chung. Caực bit coự theồ ủửụùc ủaởt, xoựa, AND, OR, ... , vụựi 1 leọnh ủụn.
- RAM ủa dúng tửứ 30H ủeỏn FFH.
Bảng 2.1. Bộ nhớ dữ liệu trên chíp của AT89S52
FF
30
Vuứng RAM ủa dúng
2F 7F 7E 7D 7C 7B 7A 79 78 2E 77 76 75 74 73 72 71 70 2D 6F 6E 6D 6C 6B 6A 69 68 2C 67 66 65 64 63 62 61 60 2B 5F 5E 5D 5C 5B 5A 59 58 2A 57 56 55 54 53 52 51 50 29 4F 4E 4D 4C 4B 4A 49 48 28 47 46 45 44 43 42 41 40 27 3F 3E 3D 3C 3B 3A 39 38 26 37 36 35 34 33 32 31 30 25 2F 2E 2D 2C 2B 2A 29 28 24 27 26 25 24 23 22 21 20 23 1F 1E 1D 1C 1B 1A 19 18 22 17 16 15 14 13 12 11 10 21 0F 0E 0D 0C 0B 0A 09 08 20 07 06 05 04 03 02 01 00 1F Bank 3 18 17 Bank 2 10 0F Bank 1 08
07 Bank thanh ghi 0 00 (maởc ủũnh cho R0 -R7)
FF
80
Daứnh cho caực thanh ghi ủaởc bieọt (SFR)
b. Bộ nhớ dữ liệu ngồi.
Hình 2.4. Sơ đồ ghép nối AT89S52 với RAM
Hình 2.5. Giải m∙ địa chỉ cho các vi mạch nhớ
8051 A0-A7 RAM Port 0 D0-D7 EA 74HC373 ALE RD WR OE WE O G D Port 2 A8-A15 RAM RAM text
Address Bus (A0- A15)
Data Bus (D0-D7) 74HC138 C B A E E E 7 6 5 4 3 2 1 0 CS CS CS CS CS CS A0-A12 A0-A12 D0-D7 D0-D7 OE OE WE WR RD PSEN RAM 8KBytes EPROM 8KBytes 2764 6264
Select another EPROM/RAM Tới các vi mạch
Boọ nhụự dửừ lieọu ngoaứi laứ boọ nhụự RAM ủửụùc ủóc hoaởc ghi bụỷi tớn hieọu /R vaứ WR.Caực RAM coự theồ giao tieỏp vụựi AT89S52 tửụng tửù caựch thửực nhử EPROM ngoái trửứ chãn /RD cuỷa AT89S52 noỏi vụựi chãn /OE (Output Enable) cuỷa RAM vaứ /chãn WR cuỷa AT89S52 noỏi vụựi chãn /WE cuỷa RAM (hỡnh 2.10).
Neỏu coự nhiều vi mách ROM vaứ RAM cuứng ủửụùc gheựp noỏi vụựi AT89S52 thỡ coự theồ duứng thẽm vi mách giaỷi maừ 74LS138 (hỡnh 2.5).
Nhử ủaừ noựi ụỷ trẽn, boọ nhụự chửụng trỡnh vaứ boọ nhụự dửừ lieọu cuỷa AT89S5 coự theồ truứng ủũa chổ, ủiều naứy cho pheựp ngửụứi thieỏt keỏ coự theồ xãy dửùng moọ nhụự dửừ lieọu chửựa chửụng trỡnh thửùc thi (boọ nhụự dửừ lieọu ủóc nhử boọ nhụự chửụng trỡnh) nhử hỡnh 2.6.
Hình 2.6. Bộ nhớ dữ liệu đọc nh− bộ nhớ ch ơng trình −
2.1.3. Các bộ định thời.
Caực boọ ủũnh thụứi (Timer) coự theồ hieồu laứ moọt chuoĩi caực flip-flop chia ủõi tần soỏ noỏi tieỏp vụựi nhau, chuựng nhaọn tớn hieọu vaứo laứm nguồn xung nhũp ngoừ ra cuỷa tần soỏ cuoỏi laứm nguồn xung nhũp cho flip-flop baựo traứn cuỷa Timer (flip-flop cụứ). Giaự trũ nhũ phãn trong caực flip-flop cuỷa Timer coự theồ
RAM W OE W RD PSEN
xem nhử soỏ ủeỏm soỏ xung nhũp (hoaởc caực sửù kieọn) tửứ khi khụỷi ủoọng Timer. Vớ dú Timer 16 bit seừ ủeỏm lẽn tửứ 0000H ủeỏn FFFFH, cụứ baựo traứn seừ lẽn 1 khi soỏ ủeỏm traứn tửứ FFFFH ủeỏn 0000H.
AT89S52 coự 3 Timer 16 bit, moĩi Timer coự boỏn cheỏ ủoọ hoát ủoọùng. Ngửụứi ta sửỷ dúng caực Timer ủeồ: ẹũnh khoaỷng thụứi gian, ủeỏm sửù kieọn hoaởc táo toỏc ủo baud cho port noỏi tieỏp trong.
Hình 2.7. Hoạt động của Timer0 và Timer1 ở chế độ 1.
Nguyên tắc hoạt động của các bộ định thời nh− sau:
Nguồn xung clock đ−ợc đ−a tới Timer từ một trong cách phụ thuộc vào bit C-T trong thanh ghi TMOD:
• Nếu C-/T = 1, xung clock sẽ đ−ợc lấy từ bộ tạo xung bên ngồi qua chân Tx(T0,T1 hoặc T2).
• Nếu C-/T = 0, xung clock sẽ đ−ợc lấy từ bộ chia tần trong chip, tần số của xung ở đây là 1/12 tần số của bộ dao động thạch anh (Fosc).
Nguồn xung clock nĩi trên sẽ đ−ợc điều khiển để đ−a tới các Timer bằng các bit: TR, GATE và mức logic trên các chân INTx:
• Nếu TRx=0, các Timer sẽ bị cấm mà khơng cần quan tâm tới GATE và mức logic trên các chân INTx (thể hiện bằng “cổng AND”).
• Nếu TRx=1, các Timer sẽ hoạt động với một trong 2 điều kiện sau xảy ra (thể hiện bằng cổng ‘OR”): Thứ nhất: bit GATE=1; thứ hai: trên chân INTx cĩ mức logic 1.
Giá trị lớn nhất mà các Timer chứa đ−ợc là 65535 (t−ơng ứng FFFF(H)), khi đếm quá giá trị này sẽ xảy ra tràn, khi cờ tràn TF sẽ đ−ợc đặt bằng 1 và gây ra ngắt do bộ định thời. Căn cứ vào sự kiện này bộ xử lý ngắt sẽ nạp dịa chỉ của vector ngắt cho con trỏ PC, bộ vi điều khiển sẽ thực hện ch−ơng trình ở đây.
Trong hệ điều hành thời gian thực, bộ định thời là một trong những tài nguyên phần cứng khơng thể thiếu. Bộ định thời dùng để xác định các khoảng thời gian thích hợp cho mỗi tiến trình hoạt động (gọi là timer tick). Khoảng thời gian này cĩ thể thay đổi dẽ dàng nhờ việc nạp các giá trị khác nhau cho bộ timer. Khoảng thời gian này cũng thay đổi tuỳ theo các ứng dụng thời gian thực sao cho nĩ luơn nhỏ hơn thời gian đáp ứng của hệ thống với các kích thích bên ngồi.
2.1.4. Bộ xử lý ngắt.
Ngắt cĩ thể hiểu đơn giản là tạm dừng một hoạt động A nào đĩ và chuyển sang một hoạt động B khác cĩ nhu cầu cấp thiết hơn. Khi xảy ra ngắt, tồn bộ các cơng việc, trạng thái của hoạt động A sẽ đ−ợc cất vào ngăn xếp để làm căn cứ tiếp diễn khi bộ vi xử lý đã hồn thành xong hoạt động B và quay trở lại với hoạt động A.
AT89S52 cĩ 6 nguồn ngắt: - Ngắt ngồi đến từ chân /INT0. - Ngắt ngồi đến từ chân /INT1. - Ngắt do bộ timer 0.
- Ngắt do bộ timer 1. - Ngắt do bộ timer 2.
- Ngắt do Port nối tiếp.
6 nguồn ngắt này đ−ợc xố khi Reset và đ−ợc đặt riêng bằng phần mềm bởi các bit trong các thanh ghi cho phép ngắt (IE), thanh ghi −u tiên ngắt (IP).
Hình 2.8. Các nguồn ngắt của AT89S52
Nh− đã trình bày ở mục 2.3, các bộ định thời tạo ra các khoảng thời gian (time tick), theo đĩ các một tiến trình phải đ−ợc tạm dừng và một tiến trình khác sẽ đ−ợc thực hiện. Sự chuyển mạch sang tiến trình mới kéo theo việc phải l−u lại các cơng việc của tiến trình cũ. Ngắt do bộ định thời chính là cơ sở để cĩ thể thực hiện việc chuyển mạch giữa các tiến trình.
Ngồi ra trên vi điều khiển cịn cĩ một số các nguồn ngắt khác. Các nguồn ngắt này khi đ−ợc đặt ở các thứ tự −u tiên thích hợp sẽ là con đ−ờng để một hệ thống thời gian thực cĩ thể phản ứng kịp thời với các kích thích từ bên ngồi.
2.2. Ngơn ngữ lập trình cho vi điều khiển
2.2.1. Tổng quan về các ngơn ngữ lập trình cho vi điều khiển.
Cho đến nay khi lập trình cho các bộ vi điều khiển ng−ời ta th−ờng sử dụng 2 ngơn ngữ chính đĩ là hợp ngữ và C. Hợp ngữ (assembly) là ngơn ngữ lập trình bậc thấp (chỉ đứng trên ngơn ngữ máy một bậc). Hợp ngữ sử dụng chính ngay tập lệnh của bộ vi điều khiển t−ơng ứng để viết nên một ch−ơng trình. Để biên dịch thành mã máy cĩ thể sử dụng trình dịch hợp ngữ (assembler) hoặc cĩ thể dùng chính bảng mã lệnh do nhà sản xuất cung cấp để mã hố các lệnh và tổng hợp thành mã (code) của ch−ơng trình. Chúng ta cùng xem xét ví dụ sau:
MOV AL,80H ; chuyển số 80H vào AL
MOV BL,12H ; chuyển số 12H vào BL
ADD AL,BL ; cộng hai số với nhau.
Trong đoạn ch−ơng trình trên nếu tra bảng mã sẽ cĩ đ−ợc mã của 3 lệnh lần l−ợt là:
B0 80 B3 12