Nghiên cứu, thiết kế hệ điều hành trên bộ vi điều khiển 8 bít
Trang 1trường đại học bách khoa hà nội -
Trang 2Lêi cam ®oan
T«i xin cam ®oan b¶n luËn v¨n nµy lµ kÕt qu¶ nghiªn cøu cña b¶n th©n d−íi sù h−íng dÉn cña TS NguyÔn Linh Giang NÕu cã g× sai ph¹m, t«i xin hoµn toµn chÞu tr¸ch nhiÖm
Ng−êi lµm cam ®oan
Trang 3Mục lục
Lời cam đoan 2
Danh mục các ký hiệu, các chữ viết tắt 5
1.2.1 Các trạng thái của một tiến trình 16
1.2.2 Khái niệm về tài nguyên “găng” và đoạn tới hạn 17
1.2.3 Hiện t−ợng bế tắc 19
1.3 Lập lịch cho CPU 20
1.3.1 Khái niệm giờ CPU 20
1.3.2 Các trạng thái của tiến trình liên quan đến giờ CPU 20
Trang 42.2.1 Tổng quan về các ngôn ngữ lập trình cho vi điều khiển 39
2.2.2 Những vấn đề với ngôn ngữ C viết cho các bộ vi điều khiển 42
Chương 3 - thiết kế hệ vi điều khiển 49
3.1 Xác định yêu cầu thiết kế 50
3.2 Lựa chọn cấu hình cho hệ thống 51
3.2.1 Lựa chọn bộ điều khiển trung tâm 51
3.2.2 Giao diện người sử dụng 52
3.2.3 Các thiết bị mô phỏng quá trình hoạt động của tiến trình 53
4.3.1 Xây dựng các tác vụ tương ứng các tiến trình 65
4.3.2 Giải quyết bài toán tài nguyên găng 69
Trang 5Danh môc c¸c ký hiÖu, c¸c ch÷ viÕt t¾t
Trang 6Danh môc c¸c b¶ng
B¶ng 1.1 Tr¹ng th¸i cña c¸c tiÕn tr×nh 19
B¶ng 1.2 Thêi gian thùc hiÖn cña c¸c tiÕn tr×nh 25
B¶ng 1.3 Thêi gian chê cña c¸c tiÕn tr×nh 25
B¶ng 2.1 Bé nhí d÷ liÖu trªn chÝp cña AT89S52 33
Trang 7Danh mục các hình vẽ, đồ thị
Hình 1.1 Các trạng thái của một tiến trình 17
Hình 1.2 Các trạng thái của tiến trình liên quan đến giờ CPU 20
Hình 1.3 Sơ đồ thực hiện tiến trình 21
Hình 1.4 Sơ đồ tổ chức hàng đợi các tiến trình 22
Hình 1.5 Sơ đồ Grant 25
Hình 2.1 Sơ đồ khối của bộ vi điều khiển AT89S52 29
Hình 2.2 Tổ chức bộ nhớ của vi điều khiển 30
Hình 2.3 Sơ đồ ghép nối AT89S52 với EPROM 31
Hình 2.4 Sơ đồ ghép nối AT89S52 với RAM 34
Hình 2.5 Giải mã địa chỉ cho các vi mạch nhớ 34
Hình 2.6 Bộ nhớ dữ liệu đọc như bộ nhớ chương trình 35
Hình 2.7 Hoạt động của Timer0 và Timer1 ở chế độ 1 36
Hình 2.8 Các nguồn ngắt của AT89S52 38
Hình 3.1 Trình tự thiết kế phần cứng cho hệ thống 49
Hình 3.2 Sơ đồ khối của hệ vi điều khiển 51
Hình 3.3 Ghép nối vi điều khiển với RAM ngoài 52
Hình 3.4 Giao diện người sử dụng trên hệ vi điều khiển 53
Hình 3.5 Hiển thị trên LED 7 đoạn bằng kỹ thuật quét 54
Hình 3.6 Ghép nối ma trận LED trên hệ vi điều khiển 57
Hình 3.7 Nguyên tắc xếp chữ trên ma trận LED 58
Hình 4.1 Các tác vụ được thực hiện đồng thời (song song) 62
Hình 4.2 Các tác vụ được thực hiện luân phiên liên tục 62
Hình 4.3 Giản đồ xung trên P1 69
Hình 4.4 Chốt lại giá trị của P1 70
Trang 8Hình 4.5 Các tiến trình được phân bổ thời gian CPU bằng nhau 71
Hình 4.6 Chuyển giữa các tiến trình bằng sự kiện time out 73
Hình 4.7 Các tiến trình được phân bổ thời gian CPU khác nhau 74
Hình 4.8 Người sử dụng ra lệnh vào các thời điểm khác nhau 75
Hình 4.9 Chuyển giữa cá tiến trình bằng sự kiện interrupt 76
Hình 4.9 Mô tả trạng thái của các tài nguyên của tiến trình 77
Hình 4.10 Các tài nguyên cần lưu khi dừng một tiến trình 78
Hình 4.11 Phân bổ ngăn xếp cho các tiến trình 79
Hình 4.12 Lập lịch cho 8 tiến trình thực hiện quét chữ trên ma trận LED 81
Hình 4.13 Lập lịch cho 4 tiến trình quét các số trên 4 LED 7 đoạn 81
Hình 4.14 Lập lịch cho tiến trình điều khiển LCD 82
Hình 4.15 Lập lịch cho tiến trình thời gian thực 82
Hình 4.16 Tổ chức bộ nhớ ROM của hệ vi điều khiển 83
Hình 4.17 Thay đổi vị trí đặt các chương trình con phục vụ ngắt 84
Hình 4.18 Phân bổ bộ nhớ ROM 85
Hình 4.19 Phân bổ bộ nhớ RAM 85
Trang 9Lời nói đầu
Cùng với sự phát triển của khoa học kỹ thuật, cụm từ “tự động hoá” đã trở nên hết sức phổ thông Từ các máy móc tự động trong các nhà máy xí nghiệp thay thế cho sức lao động của công nhân, từ các đồ gia dụng tự động trong gia đình giúp ích cho người nội trợ nói chung các thiết bị có khả năng tự động hoá xuất hiện ở khắp mọi nơi Một câu hỏi đặt ra với khá nhiều người là nhờ đâu mà các thiết bị có khả năng tự động được? Để trả lời câu hỏi này chúng ta cần phải đi từ khi có cụm từ “tự động hoá” ra đời
Trước kia, khi chưa có công nghệ bán dẫn, các phần tử có tiếp điểm nếu được đầu nối với nhau theo một mạch logic nào đó thì vẫn có thể tạo ra một hệ thống tự động, tuy nhiên khả năng đáp ứng và tính tự động cả hệ thống này không cao Công nghệ bán dẫn ra đời, nó giải quyết được hạn chế về đáp ứng (tốc độ) của các phần tử có tiếp điểm tuy nhiên cũng phải chờ đến khi có sự xuất hiện của các bộ vi xử lý, các hệ thống có tính tự động hoá cao mới ra đời Đặc trưng của các hệ thống này được mô tả bằng một công thức đơn giản: Phần cứng + Phần mềm = ứng dụng Theo công thức này thì khi tuỳ biến một trong 2 thành phần là phần cứng hoặc phần mềm thì sẽ cho ra ứng dụng khác Thông thường phần mềm là thành phần được tuỳ biến
Một hệ thống với các bộ vi xử lý có thể giả các suy nghĩ và hành động của con người vì lý do đơn giản là chúng hoạt động theo một chương trình của người thiết kế đưa vào mà chương trình chính là các thuật toán là ý nghĩ của người lập trình Như vậy để một hệ thống có tính thông minh, tự động hoá cao thì phần mềm viết cho nó là vấn đề hết sức quan trọng
Một hệ thống với cùng một phần cứng nhưng nếu nó được viết hệ điều hành thì khả năng của nó sẽ trở nên mạnh hơn rất nhiều so với một hệ thống chỉ có một chương trình tuần tự Với mục đích không ngừng đáp ứng các nhu cầu của
Trang 10xã hội, hiện nay các môn học về hệ nhúng đã và đang được đưa vào giảng dạy tại các trường Cao đẳng và Đại học Tuy nhiên để có một hiệu qủa giảng dạy tốt nhất thì cần có một phương pháp nghiên cứu và thiết kế đúng chính tắc và cũng cần phải có một thiết bị phục vụ qua trình thí nghiệm
Trường Đại học Công nghiệp Hà nội là một trường đào tạo các cử nhân và các kỹ sư thực hành Trong chương trình đào tạo cũng đã có môn kỹ thuật vi điều khiển, đây có thể coi là nền tảng để tiếp cận với các hệ thống nhúng sử dụng vi điều khiển có hệ điều hành Việc nghiên cứu để đưa vào giảng dạy môn thiết kế hệ điều hành cho các hệ vi điều khiển là phù hợp với yêu cầu hiện tại
Với sự hướng dẫn của TS Nguyễn Linh Giang, trong khuôn khổ luận văn này, tôi mạnh dạn nghiên cứu về các nguyên tắc cơ bản khi thiết kế một hệ điều hành trên hệ vi điều khiển
Nội dung của luận văn bao gồm 4 chương, trong đó: Chương 1: Giới thiệu tổng quan hệ điều hành
Chương 2: Giới thiệu bộ vi điều khiển được sử dụng để viết hệ điều hành và ngôn ngữ lập trình cho vi điều khiển
Chương 3 Thiết kế phần cứng hệ vi điều khiển
Chương 4 Thiết kế hệ điều hành cho hệ vi điều khiển
Do thời gian và khả năng có hạn nên luận văn này sẽ còn nhiều thiếu sót Rất mong được sự góp ý và thông cảm của các thầy giáo, cô giáo
Hà nội, ngày 30 tháng 10 năm 2006 Học viên
Trang 11
Chương 1 - Tổng quan về hệ điều hành1.1 Khái niệm về hệ điều hành (OS-Operating System) 1.1.1 Khái niệm
Khó có một khái niệm hay định nghĩa chính xác về hệ điều hành, vì hệ điều hành là một bộ phận được nhiều đối tượng khai thác nhất, họ có thể là người sử dụng thông thường, có thể là lập trình viên, có thể là người quản lý hệ thống và tuỳ theo mức độ khai thức hệ điều hành mà họ có thể đưa ra những khái niệm khác nhau
Khái niệm 1: Hệ điều hành là hệ thống chương trình với các chức năng giám
sát điều khiển việc thực hiện các chương trình của người sử dụng quản lý và phân chia tài nguyên cho nhiều chương trình người sử dụng đồng thời sao cho việc khai thác chức năng của hệ thống máy tính của người sử dụng là thuận lợi và hiệu quả nhất
Khái niệm 2: Hệ điều hành là một chương trình đóng vai trò như giao diện
giữa người sử dụng và phần cứng máy tính nó quản lý và điều khiển phần cứng cũng như sự thực hiện của tất cả các chương trình
Khái niệm thứ hai rất gần với các hệ điều hành đang sử dụng trên các máy tính hiện nay trong khi khái niệm thứ nhất lại gần với các hệ thống đo lường điều khiển trong công nghiệp sử dụng các bộ điều khiển khả trình (Ví dụ như vi điều khiển)
1.1.2 Chức năng của hệ điều hành
Có thể nói hệ điều hành là 1 hệ thống các chương trình đóng vai trò trung gian giữa người sử dụng và phần cứng Nhiệm vụ chính của nó là cung cấp một môi trường thuận lợi để người sử dụng dễ dàng thực hiện các chương trình ứng dụng của họ trên máy tính và khai thác triệt để các chức năng của phần cứng
Trang 12Để đạt được mục tiêu trên hệ điều hành phải thực hiện 2 chức năng chính sau đây:
- Tạo ra một hệ thông mở rộng bao gồm các thành phần vật lý và các thành phần logic:
Như chúng ta biết, một hệ thống khả trình (ví dụ như máy tính) gồm các bộ phận chính như: Processor, Memory, I/O Device, Bus, vv, do đó để đối thoại hoặc khai thác máy tính người sử dụng phải hiểu được cơ chế hoạt động của các bộ phận này và phải tác động trực tiếp vào nó tất nhiên là bằng những con số 0,1 (ngôn ngữ máy) Điều này là quá khó đối với người sử dụng hệ điều hành phải che đậy các chi tiết phần cứng máy tính bởi một máy tính mở rộng, máy tính mở rộng này có đầy đủ các chức năng của một máy tính thực nhưng đơn giản và dễ sử dụng hơn Theo đó khi cần tác động vào máy tính thực người sử dụng chỉ cần tác động vào máy tính mở rộng mọi sự chuyển đổi thông tin điều khiển từ máy tính Mục đích của chức năng này kà: Giúp người sử dụng khai thức các chức năng của phần cứng máy tính dễ dàng và hiệu quả hơn
- Quản lý tài nguyên của hệ thống:
Tài nguyên hệ thống có thể là: prrocessor, Memory, I/O Device , đây là những tài nguyên mà hệ điều hành dùng để cấp phát cho các tiến trình, chương trình trong quá trình điều khiển sự hoạt động của hệ thống Khi người sử dụng cần thực hiện một chương trình hay một chương trình cần nạp thêm một tiến trình mới vào bộ nhớ thì hệ điều hành phải cấp phát không gian nhớ cho chương trình, tiến trình đó để chương trình, tíên trình đó nạp được vào bộ nhớ và hoạt động được Trong môi trường hệ điều hành đa nhiệm có thể có nhiều chương trình, tiến trình đồng thời cần được nạp vào bộ nhớ nhưng không gian lưu trữ củâ bộ nhớ có giới hạn do đó hệ điều hành phải tổ chức cấp phát bộ nhớ sao cho hợp lý để đảm bảo tất cả các chương trình tiến trình khi cần để được nạp vào bộ nhớ để hoạt động Ngoài ra hệ điều hành còn phải tổ chức bảo vệ các không gian nhớ đã cấp cho các chương trình tiến trình để tránh sự truy cập bất hợp lệ và sự tranh
Trang 13chấp bộ nhớ giữa các chương trình, tiến trình, đặc biệt là các tiến trình đồng thời hoạt động trên hệ thống Đây là một trong những nhiệm vụ quan trọng của hệ điều hành
Trong quá trình hoạt động của hệ thống đặc bệt là các hệ thống đa người dùng đa chương trình, đa tiến trình Còn xuất hiện một hiện tượng khác, đó là nhiều chương trình, tiến trình đồng thời sử dụng một không gian nhớ hau một tập tin (dữ liệu, chương trình) nào đó Trong trường hợp này hệ điều hành phải tổ chức việc chia sẻ và giám sát việc truy xuất đồng thời trên các tài nguyên nói trên sao cho việc sử dụng tài nguyên có hiệu quả nhưng tránh được sự mất mát dữ liệu và làm hỏng các tập tin
Hai dẫn chứng điển hình giúp chúng ra thấy vai trò của hệ điều hành trong việc quản lý tài nguyên hệ thống sau này chúng ra sẽ thấy việc cấp phát, chia sẻ, bảo vệ tài nguyên của hệ điều hành là một trong những công việc khó khăn và phức tạp nhất Hệ điều hành đã chi phí nhiều cho công việc nói trên để đát được mục tiêu: Trong mọi trường hợp tất cả các chương trình, tiến trình nếu cần được cấp phát tài nguyên để hoạt động thì sớm muộn nó đều được cấp phát và được đưa vào trạng thái hoạt động
1.1.3 Các thành phần của hệ điều hành
1.1.3.1 Thành phần quản lý tiến trình
Hệ điều hành phải có nhiệm vụ tạo lập tiến trình và đưa nó vào danh sách quản lý tíên trình của hệ thống Khi tiến trình kết thúc hệ điều hành phải loại bỏ tiến trình ra lhỏi danh sác quản lý tiến trình của hệ thống
Hệ điều hành phải cung cấp đầy đủ tài nguyên để tiến trình đi vào hoạt động và phải đảm bảo đủ tài nguyên để duy trì sự hoạt động của tiến trình cho đến khi tiến trình kết thúc Khi tiến trình kết thúc hệ điều hành phải thu hồi những tài nguyên mà hệ điều hành đã cấp cho tiến trình
Trang 14Trong quá trình hoạt động nếu vì một lý do nào đó tiến trình không thể tiếp rục hoạt động được thì hệ điều hành phải tạm dừng tiến trình thu hồi tài nguyên mà tiến trình đang chiếm giữ, sau đó nếu diều kiện thuận lợi thì hệ điều hành phải tái kích hoạt tiến trình để tiến trình tiếp tục hoạt động cho đến khi kết thúc
Trong các hệ thống có nhiều tiến trình hoạt động song song hệ điều hành phải giải quyết vấn đề tranh chấp tài nguyên giữa các tiến trình, đều phối processor cho các tiến trình, giúp các tiến trình trao đổi thông tin và hoạt động đồng bộ với nhau, đảm bảo nguyên tắc tất cả các tiến trình đã được khởi tạo phải được thực hiện và kết thúc được
Tóm lại, bộ phận quản lý tiến trình của hệ điều hành phải thực hiện nhứng nhiệm vụ sau đây:
Tạo lập, huỷ bỏ tiến trình
Tạm dừng, tái kích hoạt động tiến trình
Tạo cơ chế thông tin liên lạc giữa các tiến trình Tạo cơ chế đồng bộ hoá giữa các tiến trình
Khi chương trình, tiến trình có yêu cầu được nạp vào bộ nhớ thì hệ điều hành phải cấp phát không gian nhớ cho nó Khi chương trình, tiến trình kết thúc thì hệ điều hành phải thi hồi lại không gian nhớ đã cấp phát cho chương trình, tiến trình trước đó
Trang 15Trong các hệ thống đa chương hay đa tiến trình, trong bộ nhớ tồn tại nhiều chương trình/ nhiều tiến trình, hệ điều hành phải thực hiện nhiệm vụ bảo vệ các vùng nhớ đã cấp phát cho các chương trình/tiến trình, tránh sự vi phạm trên các vùng nhớ của nhau
Tóm lại, bộ phận quản lý bộ nhớ chính của hệ điều hành thực hiện những nhiệm vụ sau:
Cấp phát, thu hồi vùng nhớ Chi nhận trạng thái bộ nhớ Bảo vệ bộ nhớ
Quyết định tiến trình nào được nạp vào bộ nhớ
1.1.3.3 Thành phần quản lý vào ra
Một trong những mục tiêu của hệ điều hành là giúp người sử dụng khai thức hệ thống máy tính dễ dàng và hiệu quả, do đó các thao tác trao đổi thông tin trên thiết bị xuất / nhập phải trong suốt đối với người sử dụng
Để thực hiện được điều này hệ điều hành phải tồn tại một bộ phận điều khiển thiết bị, bộ phận này phối hợp cùng CPU để quản lý sự hoạt động và trao đổi thông tin giữa hệ thóng, chương trình người sử dụng và người sử dụng với các thiết bị xuâts/nhập
Bộ phận điều khiển thiết bị thực hiện những nhiệm vụ sau:
Gởi mã lệnh điều khiển đến thiết bị: Hệ điều hành điều khiển các thiết bị bằng các mã điều khiển, do đó trước khi bắt đầu một quá trình trao đổi dữ liệu với thiết bị thì hệ điều hành phải gởi mã điểu khiển đến thiết bị
Tiếp nhận yêu cần ngắt (Interrupt) từ các thiết bị khi cần trao đổi với hệ thống khi nó phát ra một tín hiệu yêu cầu ngắt, hệ điều hành tiếp nhận yêu cầu ngắt từ các thiết bị, xem xết và thực hiện một thủ tục để đáp ứng yêu cầu các thiết bị
Trang 16Phát hiện và xử lý lỗi: quá trình trao đổi dữ liệu thường xảy ra các lỗi như: thiết bị vào/ra chưa sẵn sàng, đường truyền hỏng, vv, do đó hệ điều hành phải tạo ra các cơ chế thích hợp để phát hiện lỗi sớm nhất và khằc phục các lỗi vừa xảy ra nếu có thể
1.2 Quản lý tiến trình
Tiến trình là một chương trình đang xử lý, nó sở hữu một con trỏ lệnh, lập các thanh ghi và các biến Để hoàn thành nhiệm vụ của mình, các tiến trình có thể còn yêu cầu một số tài nguyên hệ thống như: CPU, bộ nhớ và các thiết bị
1.2.1 Các trạng thái của một tiến trình
Trạng thái của tiến trình tại mỗi thời điểm được xác định bởi hoạt động hiện thời của tiến trình tại thời điểm đó Trong suốt khoảng thời gian tồn tại trong hệ thống, một tiến trình có thể thay đổi trạng thái do rất nhiều nguyên nhân như: Chờ đợi sự kiện nào đó xảy ra, đợi một thao tác vào/ra hoàn tất, hết thời gian xử lý
Tại mỗi thời điểm, tiến trình có thể nhận một trong các trạng thái sau: - Khởi tạo (new): Tiến trình đang được tạo lập
- Sẵn sàng (ready): Tiến trình chờ được cấp phát CPU để xử lý - Thực hiện (runing): Tiến trình được xử lý
- Đợi (waiting): Tiến trình phải dừng vì thiếu tài nguyên hoặc chờ một sự kiện nào đó
- Kết thúc (halt): Tiến trình đã hoàn tất công việc xử lý
Các trạng thái của tiến trình có thể được biểu diễn qua sơ đồ (hình 1.1)
Trang 17Hình 1.1 Các trạng thái của một tiến trình
Hệ điều hành quản lý hoạt động của các tiến trình trong hệ thống thông qua khối mô tả tiến trình (process control block - PCB) Khối mô tả tiến trình bao gồm các thành phần:
- Số thứ tự của tiến trình
- Con trỏ trạng thái của tiến trình (cho biết trạng thái hiện tại của tiến trình)
- Vùng nhớ lưu trữ giá trị các thanh ghi mà tiến trình đang sử dụng
- Thông tin về tài nguyên tiến trình đang sử dụng hoặc được phép sử dụng
1.2.2 Khái niệm về tài nguyên “găng” và đoạn tới hạn
Chúng ta cùng xem thuật toán sau:
In Out: 0 n-1 Counter: 0 n
Begin
(Tiến trình P)
Repeat
Waiting
Trang 18S¶n xuÊt th«ng tin vµ chøa trong NextP;
Buffer [In]:=NextP; In:= In + 1 mod n;
(TiÕn tr×nh C)
Repeat
NextC:= Buffer [Out];
Out:= Out + 1 mod n;
LÊy th«ng tin trong chøa trong NextC
End;
NhËn xÐt: V× hai tiÕn tr×nh P vµ C song hµnh nªn cã thÓ x¶y ra tr−êng hîp trong cïng 1 thêi ®iÓm, tiÕn tr×nh P t¨ng biÕn Counter lªn 1 (Counter:= Counter + 1) cßn tiÕn tr×nh C l¹i gi¶m biÕn Counter ®i 1 (Counter:= Counter – 1) dÉn tíi kÕt qu¶ sai Nh− vËy biÕn Counter trong tr−êng hîp nµy ®−îc gäi lµ tµi nguyªn “g¨ng” §o¹n tr×nh sö dông biÕn Counter gäi lµ ®o¹n tíi h¹n
Trang 191.2.3 Hiện t−ợng bế tắc
1.2.3.1 Khái niệm về bế tắc
Giả sử có hai tiến trình P1 và P song hành sử dụng các tài nguyên r1 và r, đ−ợc điều khiển bởi hai đèn hiệu S1 và S Tại mỗi thời điểm, mỗi tài nguyên chỉ phục vụ cho sự hoạt động của một tiến trình Xét trạng thái:
Bảng 1.1 Trạng thái của các tiến trình
Nh− vậy bế tắc là trạng thái khi hai hoặc nhiều tiến trình cùng chờ đợi một số sự kiện nào đó và nếu không có tác động đặc biệt từ bên ngoài thì sự chờ đợi đó là vô hạn
1.2.3.2 Điều kiện xảy ra bế tắc trong hệ thống
Hiện t−ợng bế tắc xảy ra khi và chỉ khi trong hệ thống tồn tại 4 điều kiện: - Có tài nguyên găng
- Có hiện t−ợng giữ và đợi, có một tiến trình đang giữ một số tài nguyên và đợi tài nguyên bổ sung đang đ−ợc giữ bởi các tiến trình khác
- Không có hệ thống phân phối lại tài nguyên: Việc sử dụng tài nguyên không bị ngắt
Trang 20- Có hiện tượng chờ đợi vòng tròn
1.2.3.3 Các mức phòng tránh bế tắc
Để tránh hiện tượng bế tắc, thông thường hệ thống áp dụng ba mức:
- Ngăn chặn: áp dụng các biện pháp để hệ thống rơi vào trạng thái bế tắc - Dự báo và tránh bế tắc: áp dụng các biện pháp để kiểm tra các tiến trình xem có bị rơi vào trạng thái bế tắc hay không Nếu có thì thông báo trước khi bế tắc xảy ra
- Nhận biết và khắc phục: Tìm cách phát hiện và giải quyết
1.3 Lập lịch cho CPU 1.3.1 Khái niệm giờ CPU
CPU là một loại tài nguyên quan trọng của máy tính Mọi tiến trình muốn hoạt động được đều phải có sự phục vụ của CPU (để xử lý, tính toán ) Thời gian mà CPU phục vụ cho tiến trình hoạt động được gọi là giờ CPU
Tại mỗi thời điểm nhất định, chỉ có một tiến trình được phân phối giờ CPU để hoạt động (thực hiện các lệnh của mình)
1.3.2 Các trạng thái của tiến trình liên quan đến giờ CPU
Trong chế độ đa chương trình, có ba trạng thái của tiến trình liên quan mật thiết đến giờ CPU bao gồm:
Hình 1.2 Các trạng thái của tiến trình liên quan đến giờ CPU
Waiting
Trang 21- Sẵn sàng (ready): Là trạng thái mà tiến trình đ−ợc phân phối đầy đủ mọi
tài nguyên cần thiết và đang chờ giờ CPU
- Thực hiện (running): Là trạng thái mà tiến trình đ−ợc phân phối đầy đủ
mọi tài nguyên cần thiết và giờ CPU
- Đợi (waiting): Là trạng thái tiến trình không thực hiện đ−ợc vì thiếu một
vài điều kiện nào đó (đợi dữ liệu vào/ra, đợi tài nguyên bổ sung ) Khi sự kiện mà nó chờ đợi xuất hiện, tiến trình sẽ quay trở lại trạng thái sẵn sàng
Nh− vậy, trong suốt thời gian tồn tại của mình, các tiến trình sẽ tuân thủ theo sơ đồ thực hiện sau:
Trang 221.3.3 Lập lịch cho CPU
1.3.3.1 Khái niệm
Để điều khiển tiến trình ở nhiều trạng thái khác, hệ thống thường tổ chức các từ trạng thái (thực chất là các khối điều khiển tiến trình) để ghi nhận tình trạng sử dụng tài nguyên và trạng thái tiến trình Các từ trạng thái được tổ chức theo kiểu đợi như sau:
Hình 1.4 Sơ đồ tổ chức hàng đợi các tiến trình
Như vậy, lập lịch cho CPU có nghĩa là tổ chức một hàng đợi các tiến trình sẵn sàng để phân phối giờ CPU cho chúng dựa trên độ ưu tiên của các tiến trình sao cho hiệu suất sử dụng CPU là tối ưu nhất
Mỗi tiến trình ở trạng thái sẵn sàng được gắn với một thứ tự ưu tiên Thứ tự ưu tiên này được xác định dựa vào các yếu tố như: Thời điểm hình thành tiến trình, thời gian thực hiện tiến trình, thời gian kết thúc tiến trình
Trang 231.3.3.2 Một số thuật toán lập lịch cho CPU
1 First Come First Served (FCFS)
Trong thuật toán này, độ ưu tiên phục vụ tiến trình căn cứ vào thời điểm hình thành tiến trình Hàng đợi các tiến trình được tổ chức theo kiểu FIFO Mọi tiến trình đều được phục vụ theo trình tự xuất hiện cho đến khi kết thúc hoặc bị ngắt
2 Shortest Job First (SJF)
Thuật toán SJF xác định thứ tự ưu tiên thực hiện tiến trình dựa vào tổng thời gian thực hiện tiến trình Tiến trình nào có tổng thời gian thực hiện ngắn sẽ được ưu tiên phục vụ trước
3 Shortest Remain Time (SRT)
Tương tự như SJF nhưng trong thuật toán này, độ ưu tiên thực hiện các tiến trình dựa vào thời gian cần thiết để thực hiện nốt tiến trình (bằng tổng thời gian = thời gian đã thực hiện) Như vậy trong thuật toán này cần phải thường xuyên cập nhật thông tin về thời gian đã thực hiện tiến trình Đồng thời chế độ phân bổ lại giờ CPU cũng phải được áp dụng nếu không sẽ làm mất tính ưu việt của thuật toán
4 Round Robin (RR)
Trong thuật toán này, hệ thống quy định một lượng tử thời gian (time quantum) khoảng từ 10-100 mili giây Mỗi tiến trình trong hàng đợi lần lượt được phân phối một lượng tử thời gian để thực hiện Sau khoảng thời gian đó, nếu tiến trình chưa kết thúc hoặc không rơi vào trạng thái đợi thì nó được chuyển về cuối hàng đợi
Hàng đợi các tiến trình được tổ chức theo kiểu vòng tròn và các tiến trình luôn luôn đảm bảo được phục vụ Khi có tiến trình mới phát sinh, nó sẽ được đưa
Trang 24vào hàng đợi vòng tròn và được đặt ở vị trí phục vụ ngay Các tiến trình dù ngắn hay dài đều có độ ưu tiên phục vụ như nhau
Trên thực tế, để đảm bảo độ ưu tiên cho các tiến trình dài, hệ thống sẽ phân chia các tiến trình thành m lớp Số lần được phục vụ và thời gian một lần phục vụ tiến trình tại mỗi lớp khác nhau (giả sử ở lớp thứ i, tiến trình được phục vụ k lần và mỗi lần với thời gian qi)
Nếu sau khoảng thời gian đã được phân phối mà tiến trình chưa kết thúc hoặc không bị ngắt thì nó được chuyển sang lớp thứ i+1 (với ki+1 và qi+1 lớn hơn) Lượng từ thời gian sẽ tăng dần cho đến khi tiến trình rơi vào lớp ngoài cùng (lớp m) ở đó nó sẽ được phục vụ với lượng tử qm không đổi Như vậy thứ tự ưu tiên của các tiến trình sẽ tăng dần theo thời gian xếp hàng đợi
Ưu điểm của phương pháp phục vụ đồng mức theo lớp sẽ cho phép hệ thống ưu tiên những tiến trình ngắn (vì nó kết thúc sớm) nhưng không gây tổn hại lớn cho các tiến trình dài
Nhược điểm là do phải thường xuyên phân phối lại giờ CPU nên thời gian chờ đợi trung bình của Round Robin có thể lớn hơn so với FCFS
Chú ý: Trong thụât toán, cần chọn giá trị lượng tử thời gian (time
quantum) thích hợp Nếu chọn giá trị time quantum lớn thì việc bổ sung tiến trình mới hoặc kích hoạt tiến trình bị ngắt sẽ làm tăng thời gian chờ đợi trung bình nhưng ngược lại nếu chọn giá trị time quantum nhỏ thì nó sẽ làm cho các tiến trình phải liên tục chuyển trạng thái dẫn đến giảm hệ số hữu ích của CPU
Thông thường giá trị time quantum được chọn theo công thức: q = t/n hoặc q=t/n – s Trong đó: t là thời gian khống chế trước; n là số tiến trình; s thời gian chuyển từ tiến trình này sang tiến trình khác
Ví dụ: Cho dãy tiến trình với thời gian thực hiện tương ứng theo bảng 1.2 và time quantum có giá trị q= 4
Trang 25Bảng 1.2 Thời gian thực hiện của các tiến trình
Tiến trình T thực hiện
P1 24 P2 3 P3 3
Sơ đồ Grant biểu thị thứ tự thực hiện các tiến trình như hình 1.5
P1 P2 P3 P1 P1 P1 P1 P1 0 4 7 10 14 18 22 26 30
Hình 1.5 Sơ đồ Grant
Theo sơ đồ này chúng ta thấy thời chờ đợi của các tiến trình như bảng 1.2
Bảng 1.3 Thời gian chờ của các tiến trình
P1 24 6 P3 3 1 P1 3 7 Tổng 30 17 Dẫn đến thời gian chờ đợi trung bình của các tiến trình là 17/3 = 5.66
1.4 Quản lý bộ nhớ
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 ngoà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 ngoà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ớ
Trang 26Hệ đ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
Trang 271.4.2.3 Sơ đồ hoán đổi (swapping)
Sơ đồ hoá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ớ ngoà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
Trang 28Chươ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
Trang 29Hì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
MemoryIntermal Devices
CPU
ROM 8Kb
RAM256 byte
I/O devices
Timer0Timer1Timer2(16 bit)
System Bus
ROM 64Kb
I/O devices
Extermal DevicesOscilla-
tior
Trang 302.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ụự rieõng bieọt cho chửụng trỡnh vaứ dửừ lieọu Nhử ủaừ noựi ụỷ treõn, caỷ boọ nhụự chửụng trỡnh vaứ dửừ lieọu coự saỹn ụỷ treõn chip tuy nhieõn dung lửụùng cuỷa caực boọ nhụự treõn chip laứ haùn cheỏ Khi thieỏt keỏ caực ửựng duùng ủoứi hoỷi boọ nhụự lụựn ngửụứi ta coự theồ duứng boọ nhụự ngoaứi vụựi dung lửụùng leõ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 ngoài (EPPOM ngoà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)
1FFFH
Trang 31đ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 phaõ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ự teõ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
89S52
Trang 32Các lệnh dùng các thanh ghi RO - R7 sẽ ngắn hơn và nhanh hơn so với các lệnh có chức năng tương ứng dùng kiểu địa chỉ trực tiếp Các dữ liệu được dùng thường xuyên nên dùng một trong các thanh ghi này
Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một bank thanh ghi được truy xuất bởi các thanh ghi RO - R7 đểà chuyển đổi việc truy xuất các bank thanh ghi ta phải thay đổi các bit chọn bank trong thanh ghi trạng thái
- RAM địa chỉ hóa từng bit có địa chỉ từ 20H đến 2FH
AT89S52 có 128 bit có chứa các byte định địa chỉ theo bit từ 20H đến 2FH
Ý tưởng truy xuất từng bit bằng phần mềm là các đăëc tính mạnh của các bộ vi điều khiển nói chung Các bit có thể được đặt, xóa, AND, OR, , với 1 lệnh đơn
- RAM đa dụng từ 30H đến FFH
-Các thanh ghi chức năng đặc biệt từ 80H đến FFH.
Trang 33B¶ng 2.1 Bé nhí d÷ liƯu trªn chÝp cđa AT89S52
FF
30
Vùng RAM đa dụng
2F 7F 7E 7D 7C 7B 7A 79 782E 77 76 75 74 73 72 71 702D 6F 6E 6D 6C 6B 6A 69 682C 67 66 65 64 63 62 61 602B 5F 5E 5D 5C 5B 5A 59 582A 57 56 55 54 53 52 51 5029 4F 4E 4D 4C 4B 4A 49 4828 47 46 45 44 43 42 41 4027 3F 3E 3D 3C 3B 3A 39 3826 37 36 35 34 33 32 31 3025 2F 2E 2D 2C 2B 2A 29 2824 27 26 25 24 23 22 21 2023 1F 1E 1D 1C 1B 1A 19 1822 17 16 15 14 13 12 11 1021 0F 0E 0D 0C 0B 0A 09 0820 07 06 05 04 03 02 01 00
Dành cho các thanh ghi đặc biệt (SFR)
Trang 34b Bộ nhớ dữ liệu ngoà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ớ
textAddress Bus (A0- A15)
Data Bus (D0-D7)
WEWR RD
Select another EPROM/RAMTới các vi mạch ROM/RAM khác
Trang 35Boọ nhụự dửừ lieọu ngoaứi laứ boọ nhụự RAM ủửụùc ủoùc hoaởc ghi bụỷi tớn hieọu /RD
vaứ WR.Caực RAM coự theồ giao tieỏp vụựi AT89S52 tửụng tửù caựch thửực nhử EPROM ngoaùi trửứ chaõn /RD cuỷa AT89S52 noỏi vụựi chaõn /OE (Output Enable) cuỷa RAM vaứ /chaõn WR cuỷa AT89S52 noỏi vụựi chaõn /WE cuỷa RAM (hỡnh 2.10)
Neỏu coự nhieàu vi maùch ROM vaứ RAM cuứng ủửụùc gheựp noỏi vụựi AT89S52 thỡ coự theồ duứng theõm vi maùch giaỷi maừ 74LS138 (hỡnh 2.5)
Nhử ủaừ noựi ụỷ treõn, boọ nhụự chửụng trỡnh vaứ boọ nhụự dửừ lieọu cuỷa AT89S52 coự theồ truứng ủũa chổ, ủieàu naứy cho pheựp ngửụứi thieỏt keỏ coự theồ xaõy dửùng moọt boọ nhụự dửừ lieọu chửựa chửụng trỡnh thửùc thi (boọ nhụự dửừ lieọu ủoù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 ủoõi taàn soỏ noỏi tieỏp vụựi nhau, chuựng nhaọn tớn hieọu vaứo laứm nguoàn xung nhũp, ngoừ ra cuỷa taàn soỏ cuoỏi laứm nguoàn xung nhũp cho flip-flop baựo traứn cuỷa Timer (flip-flop cụứ) Giaự trũ nhũ phaõn trong caực flip-flop cuỷa Timer coự theồ
RDPSEN
Trang 36xem nhử soỏ ủeỏm soỏ xung nhũp (hoaởc caực sửù kieọn) tửứ khi khụỷi ủoọng Timer Vớ duù Timer 16 bit seừ ủeỏm leõn tửứ 0000H ủeỏn FFFFH, cụứ baựo traứn seừ leõ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ọ hoaùt ủoọùng Ngửụứi ta sửỷ duùng caực Timer ủeồ: ẹũnh khoaỷng thụứi gian, ủeỏm sửù kieọn hoaởc taù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 ngoà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”)
Trang 37• 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 ngoà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, toà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ý đã hoà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 ngoài đến từ chân /INT0 - Ngắt ngoài đến từ chân /INT1 - Ngắt do bộ timer 0
- Ngắt do bộ timer 1 - Ngắt do bộ timer 2
Trang 38- Ngắt do Port nối tiếp
6 nguồn ngắt này được xoá 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
Trang 39Ngoà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 ngoà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ã hoá 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:
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 80 C0
Nếu tổng hợp lại thì mã của đoạn chương trình trên sẽ là B0 80 B3 12 80 C0.
Cách tra bảng mã lệnh và hoá lệnh sau đó tổng hợp thành mã chương trình có thể gây ra nhầm lẫn và mất rất nhiều thời gian chính vì vậy mà trình dịch hợp ngữ ra đời Có trong tay trình dịch hợp ngữ người lập trình có thể đã giảm bớt
Trang 40được khá nhiều công sức khi lập trình cho vi điều khiển Tuy nhiên chúng ta cùng xem xét ví dụ sau:
Thực hiện phép toán AX=7 * 9 + 12 * 8 Hợp ngữ:
MOV CX,AX ;chuyển kết quả vào thanh ghi khác để chuẩn bi cho phép ;nhân thứ hai
MOV AL,12 MOV BL,8 MUL BL
ADD AX,CX ;cộng hai tích với nhau AINSI C:
AX=7*9+12*8;
Rõ ràng với cùng một nhiệm vụ nhưng AINSI C chỉ cần 1 dòng lệnh trong khi hợp ngữ cần tới 8 dòng lệnh và cả 8 dòng lệnh trên đều phải thao tác trên các thanh ghi (phần cứng) Từ lý do này mà người ta nghĩ đến việc nên sử dụng một ngôn ngữ cấp cao hơn để thay thế cho hợp ngữ và xây dựng trình dịch (compiler) cho ngôn ngữ cấp cao đó
Khi thiết kế phần mềm cho một hệ thống nhúng nhỏ sử dụng 8085, việc sử dụng mã hợp ngữ (assembly code) để phát triển toàn bộ sản phẩm đã trở thành chuyện bình thường Đối với nhiều đề tài, đây là tiếp cận khả thi vì lượng mã cần được tạo ra thường nhỏ hơn 8 Kbyte và tương đối đơn giản về bản chất Nếu một kỹ sư phần cứng được giao nhiệm vụ thiết kế cả phần cứng lẫn phần mềm, người này thường có khuynh hướng viết phần mềm bằng hợp ngữ Người kỹ sư phần