Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 37

Hệ điều hành thời gian thực

Hệ điều hành là gì?


Hệ điều hành là môi trường phần mềm cung cấp vùng đệm giữa người dùng và các
giao diện cấp thấp cho phần cứng trong hệ thống. Chúng cung cấp một giao diện không đổi và
một tập hợp các tiện ích để cho phép người dùng sử dụng hệ thống một cách nhanh chóng và
hiệu quả. Chúng cho phép phần mềm được chuyển từ hệ thống này sang hệ thống khác và do
đó có thể làm cho phần cứng của các chương trình ứng dụng trở nên độc lập. Các công cụ gỡ
rối chương trình thường được đi kèm để tăng tốc quá trình thử nghiệm. Nhiều ứng dụng không
yêu cầu bất kỳ hỗ trợ hệ điều hành nào và chạy trực tiếp trên phần cứng.

Phần cứng độc lập thông qua việc sử dụng hệ điều hành

Phần mềm này bao gồm các quá trình vào ra của riêng nó, ví dụ, để điều khiển các
cổng nối tiếp và song song. Tuy nhiên, với việc bổ sung dung lượng lưu trữ lớn và sự phức tạp
của việc truy cập đĩa và cấu trúc tệp, hầu hết các ứng dụng ngay lập tức ủy thác các tác vụ này
cho hệ điều hành.
Việc ủy quyền giảm thời gian phát triển phần mềm bằng cách cung cấp các lệnh gọi hệ
thống để cho phép phần mềm ứng dụng truy cập vào bất kỳ cơ sở hệ thống vào ra nào. Các
lệnh gọi này thường được thực hiện bằng cách xây dựng một khối tham số, tải một thanh ghi
được chỉ định với vị trí của nó và sau đó thực hiện lệnh ngắt phần mềm.

Cơ chế gọi hệ thống điển hình cho họ bộ xử lý M680x0

Lệnh TRAP là họ MC68000 tương đương với phần mềm ngắt và chuyển bộ xử lý sang
chế độ giám sát để thực hiện chức năng cần thiết. Nó cung cấp một cách hiệu quả mối liên hệ
giữa ứng dụng và nhân hệ điều hành. Nhân là trái tim của hệ điều hành, điều khiển phần cứng
và xử lý các ngắt, sử dụng bộ nhớ, hệ thống vào ra, v.v. Nó định vị một khối tham số bằng cách
sử dụng một con trỏ địa chỉ được lưu trữ trong một thanh ghi địa chỉ định trước. Nó nhận các
lệnh được lưu trữ trong một khối tham số và thực thi chúng. Khi làm như vậy, chính nhân điều
khiển phần cứng, biên dịch các lệnh được truyền cho nó thông qua một khối tham số. Sau khi
hoàn thành lệnh, thông tin trạng thái được ghi lại vào khối tham số và nhân chuyển quyền điều
khiển trở lại ứng dụng tiếp tục chạy ở chế độ người dùng. Ứng dụng sẽ tìm thấy chức năng vào
ra đã hoàn thành với dữ liệu và thông tin trạng thái được ghi vào khối tham số. Ứng dụng
không có quyền truy cập trực tiếp vào bộ nhớ hoặc phần cứng.

Các khối tham số này là tiêu chuẩn trong toàn bộ hệ điều hành và không phụ thuộc vào
phần cứng thực tế thực hiện các tác vụ vật lý. Không quan trọng nếu hệ thống sử dụng thiết bị
ngoại vi đa chức năng MC68901 hoặc bộ điều khiển giao tiếp nối tiếp 8530 để cung cấp các
cổng nối tiếp: phần mềm trình điều khiển hệ điều hành sẽ xử lý các phần phụ thuộc. Nếu các
khối tham số đủ phổ biến trong định nghĩa của chúng, thì dữ liệu có thể được cung cấp từ hầu
hết mọi nguồn trong hệ thống, ví dụ: tiện ích COPY có thể sử dụng các khối giống nhau để lấy
dữ liệu từ một cổng nối tiếp và sao chép nó vào một cổng song song, hoặc cho sao chép dữ
liệu từ tệp này sang tệp khác. Ý tưởng về sự độc lập của thiết bị và cổng vào ra thống nhất cho
phép phần mềm được sử dụng lại thay vì viết lại. Phần mềm có thể dễ dàng di chuyển từ hệ
thống này sang hệ thống khác. Điều này rất quan trọng đối với các thiết kế nhúng mô-đun, đặc
biệt là những thiết kế sử dụng bus tiêu chuẩn công nghiệp như VMEbus, nơi phần cứng hệ
thống có thể dễ dàng được nâng cấp hoặc mở rộng.

Hệ điều hành nội bộ

Hệ điều hành đầu tiên được sử dụng rộng rãi là CP / M, được phát triển cho bộ vi xử lý
Intel 8080 và hệ thống đĩa mềm 8 ". Nó hỗ trợ các cuộc gọi vào ra bởi hai bảng nhảy - BDOS
(hệ điều hành đĩa cơ bản) và BIOS (hệ thống vào ra cơ bản). Nó nhanh chóng trở thành một
tiêu chuẩn trong ngành và một lượng lớn phần mềm ứng dụng đã có sẵn cho nó. Nhiều máy
kinh doanh dựa trên vi mô của cuối những năm 1970 và đầu những năm 1980 dựa trên CP / M.
Ý tưởng của nó thậm chí còn hình thành nền tảng của MS-DOS, được IBM chọn cho máy tính
cá nhân của mình.
CP / M là một ví dụ điển hình về hệ điều hành tác vụ đơn lẻ. Chỉ một tác vụ hoặc ứng
dụng có thể được thực thi bất kỳ lúc nào và do đó nó chỉ hỗ trợ một người dùng tại một thời
điểm. Khi một ứng dụng được tải, nó sẽ cung cấp phần do người dùng xác định trong tổng số
chương trình ‘CP / M’.

Lớp phủ chương trình


Bất kỳ chương trình ứng dụng nào cũng phải hoàn chỉnh và do đó bộ nhớ khả dụng
thường trở thành yếu tố hạn chế. Lớp phủ chương trình thường được sử dụng để giải quyết
vấn đề này. Các phần của chương trình hoàn chỉnh được lưu trữ riêng biệt trên đĩa và được
truy xuất và tải qua vùng mã không sử dụng khi cần. Điều này cho phép các ứng dụng lớn hơn
bộ nhớ khả dụng chạy, nhưng nó đặt trách nhiệm kiểm soát lên ứng dụng. Điều này tương tự
như sơ đồ bộ nhớ ảo trong đó hệ điều hành chia bộ nhớ của tác vụ thành các trang và hoán đổi
chúng giữa bộ nhớ và bộ nhớ chung. Tuy nhiên, hệ điều hành giả định quyền kiểm soát hoàn
toàn và các sự sắp đặt như vậy hoàn toàn minh bạch đối với người dùng.

Với một hệ điều hành tác vụ duy nhất, không thể chạy nhiều tác vụ đồng thời. Các ứng
dụng lớn phải chạy tuần tự và không thể hỗ trợ các hoạt động đồng thời. Không có hỗ trợ
chuyển thông báo hoặc kiểm soát tác vụ, điều này sẽ cho phép các ứng dụng được chia thành
các thực thể riêng biệt. Nếu một hệ thống cần lấy dữ liệu nhật ký và lưu trữ trên đĩa, đồng thời
cho phép người dùng xử lý dữ liệu đó bằng gói cơ sở dữ liệu trực tuyến, thì một hệ điều hành
tác vụ duy nhất sẽ cần mọi thứ được tích hợp. Với hệ điều hành đa nhiệm, tác vụ ghi dữ liệu có
thể chạy cùng lúc với cơ sở dữ liệu. Dữ liệu có thể được truyền giữa mỗi phần tử bằng một tệp
chung trên đĩa và không tác vụ nào cần phải có bất kỳ kiến thức trực tiếp nào về tác vụ kia. Với
một hệ thống tác vụ duy nhất, rất có thể chương trình cơ sở dữ liệu sẽ phải được viết từ đầu.
Với hệ thống đa nhiệm, một chương trình thương mại có thể được sử dụng và phần mềm ghi
nhật ký giao tiếp với nó. Những hạn chế này buộc nhiều ứng dụng phải giao tiếp trực tiếp với
phần cứng và do đó mất đi tính độc lập phần cứng mà hệ điều hành cung cấp. Phần mềm như
vậy sẽ cần sửa đổi nhiều để chuyển nó sang một cấu hình khác.

Hệ điều hành đa nhiệm

Đối với phần lớn các hệ thống nhúng, một hệ điều hành tác vụ duy nhất là quá hạn chế.
Yêu cầu là một hệ điều hành có thể chạy nhiều ứng dụng đồng thời và cung cấp khả năng điều
khiển và giao tiếp giữa các nhiệm vụ. Những tiện ích trước đây chỉ dành cho người dùng máy
tính mini và máy tính lớn thì nay người dùng bộ vi xử lý 16/32 bit yêu cầu. Hệ điều hành đa
nhiệm hoạt động bằng cách chia thời gian của bộ xử lý thành các khe thời gian riêng biệt. Mỗi
ứng dụng hoặc tác vụ yêu cầu một số khe thời gian nhất định để hoàn thành việc thực thi. Nhân
hệ điều hành quyết định tác vụ nào có thể có vị trí tiếp theo, vì vậy thay vì một tác vụ thực thi
liên tục cho đến khi hoàn thành, việc thực thi của nó được xen kẽ với các tác vụ khác. Việc chia
sẻ thời gian xử lý giữa các tác vụ mang lại cho mỗi người dùng cảm tưởng rằng anh ta là người
duy nhất sử dụng hệ thống.

Chuyển đổi ngữ cảnh, bảng tác vụ và hạt nhân.


Hệ điều hành đa nhiệm dựa trên một hạt nhân đa nhiệm điều khiển các cơ chế phân
chia thời gian. Một lát cắt thời gian là khoảng thời gian mà mỗi tác vụ có để thực hiện trước khi
nó bị dừng và được thay thế trong quá trình chuyển đổi ngữ cảnh.. Điều này được kích hoạt
định kỳ bởi một ngắt phần cứng từ bộ đếm thời gian hệ thống. Ngắt này có thể cung cấp đồng
hồ hệ thống và một số ngắt có thể được thực thi và đếm trước khi thực hiện chuyển đổi ngữ
cảnh.
Khi chuyển đổi ngữ cảnh được thực hiện, tác vụ hiện tại bị gián đoạn, các thanh ghi của
bộ xử lý được lưu trong một bảng đặc biệt cho tác vụ cụ thể đó và tác vụ được đặt trở lại danh
sách "sẵn sàng" để chờ một lát cắt thời gian khác. Các bảng đặc biệt, thường được gọi là khối
điều khiển tác vụ, lưu trữ tất cả thông tin mà hệ thống yêu cầu về tác vụ, ví dụ như việc sử
dụng bộ nhớ, mức độ ưu tiên của nó trong hệ thống và xử lý lỗi của nó. Đó là thông tin ngữ
cảnh này được chuyển đổi khi một nhiệm vụ được thay thế bằng một nhiệm vụ khác.

Cơ chế lát cắt thời gian cho hệ điều hành đa nhiệm


Danh sách ‘sẵn sàng’ chứa tất cả các tác vụ và trạng thái của chúng và được bộ lập lịch
sử dụng để quyết định nhiệm vụ nào được phân bổ trong lát cắt thời gian tiếp theo. Thuật toán
lập lịch xác định trình tự và tính đến mức độ ưu tiên và trạng thái hiện tại của một công việc.
Nếu một nhiệm vụ đang chờ một cuộc gọi vào ra hoàn thành, nó sẽ bị tạm dừng cho đến khi
cuộc gọi hoàn tất

Khi một tác vụ được chọn, các đăng ký và trạng thái của bộ xử lý tại thời điểm chuyển
đổi ngữ cảnh cuối cùng của nó sẽ được tải trở lại bộ xử lý và bộ xử lý được khởi động. Nhiệm
vụ mới tiếp tục như thể không có gì xảy ra cho đến khi chuyển đổi ngữ cảnh tiếp theo diễn ra.
Đây là phương pháp cơ bản đằng sau tất cả các hệ điều hành đa nhiệm.

Biểu đồ cho thấy một biểu đồ trạng thái đơn giản hóa cho một hệ điều hành thời gian
thực điển hình sử dụng cơ chế lát cắt thời gian này. Trên mỗi công tắc ngữ cảnh, một tác vụ
được bộ lập lịch của hạt nhân chọn từ danh sách "sẵn sàng" và được đưa vào trạng thái chạy.
Sau đó nó được thực thi cho đến khi một chuyển đổi ngữ cảnh khác xảy ra. Điều này thường
được báo hiệu bởi một ngắt định kỳ từ một bộ định thời. Trong những trường hợp như vậy,
nhiệm vụ chỉ được chuyển ra ngoài và đưa trở lại danh sách "sẵn sàng", chờ vị trí tiếp theo của
nó.
Ngoài ra, việc thực thi có thể bị dừng lại bởi tác vụ thực thi các lệnh nhân nhất định. Nó
có thể tự tạm ngưng, nơi nó vẫn còn trong hệ thống nhưng không xảy ra thêm quá trình thực thi
nào. Nó có thể không hoạt động, đang chờ lệnh bắt đầu từ một tác vụ khác, hoặc thậm chí chỉ
đơn giản là chờ một tác vụ máy chủ trong hệ điều hành thực hiện một chức năng đặc biệt cho
nó. Ví dụ điển hình về tác vụ máy chủ là trình điều khiển thực hiện các chức năng đồ họa màn
hình đặc biệt. Lý do phổ biến nhất khiến một tác vụ thoát ra khỏi trạng thái đang chạy là đợi một
thông báo hoặc lệnh, hoặc tự trì hoãn trong một khoảng thời gian nhất định. Các chỉ thị chờ
khác nhau cho phép các tác vụ đồng bộ hóa và kiểm soát lẫn nhau trong hệ thống. Biểu đồ
trạng thái này là điển hình của nhiều hệ điều hành thời gian thực.

Cơ chế chuyển đổi ngữ cảnh

Nếu được yêu cầu, nó cũng kiểm soát việc chia sẻ bộ nhớ giữa các tác vụ, cho phép
chúng chia sẻ các mô-đun chương trình chung, chẳng hạn như thư viện thời gian chạy ngôn
ngữ cấp cao. Một tập hợp các bảng bộ nhớ được duy trì, được sử dụng để quyết định xem một
yêu cầu được chấp nhận hay bị từ chối. Điều này có nghĩa là các tài nguyên, chẳng hạn như bộ
nhớ vật lý và thiết bị ngoại vi, có thể được bảo vệ khỏi người dùng mà không cần sử dụng quản
lý bộ nhớ phần cứng với điều kiện tác vụ đủ kỷ luật để sử dụng hệ điều hành và không truy cập
trực tiếp vào tài nguyên. Đây là điều cần thiết để duy trì tính toàn vẹn của hệ thống.

Thông điệp truyền và điều khiển có thể được thực hiện trong các hệ thống như vậy
bằng cách sử dụng hạt nhân để hoạt động như một trình truyền thông điệp và điều khiển giữa
các tác vụ. Nếu tác vụ A muốn dừng tác vụ B, thì bằng cách thực hiện một lệnh gọi tới hạt
nhân, trạng thái của tác vụ B có thể được thay đổi và việc thực thi nó sẽ tạm dừng. Ngoài ra,
nhiệm vụ B có thể bị trì hoãn trong một khoảng thời gian đã định hoặc buộc phải đợi một tin
nhắn.

Với một hệ điều hành thời gian thực điển hình, có hai loại thông báo cơ bản mà hạt
nhân sẽ xử lý:
• cờ có thể điều khiển nhưng không thể mang bất kỳ thông tin ngầm nào - thường được gọi là
semaphores hoặc sự kiện và thông điệp có thể mang thông tin và tác vụ điều khiển thường
được gọi là thông điệp hoặc sự kiện.
Nhân duy trì các bảng cần thiết để lưu trữ thông tin này và chịu trách nhiệm đảm bảo
rằng các tác vụ được kiểm soát và nhận thông tin. Với cơ sở cho các tác vụ giao tiếp lẫn nhau,
hỗ trợ cuộc gọi hệ thống để truy cập vào ra, tải tác vụ từ đĩa, v.v., có thể đạt được bằng cách
chạy các tác vụ bổ sung, với trạng thái hệ thống đặc biệt. Các nhiệm vụ hệ thống này cung cấp
các phương tiện bổ sung và có thể được đưa vào theo yêu cầu.

Biểu đồ trạng thái cho một hạt nhân thời gian thực điển hình
Để biến một nhân thời gian thực thành một hệ điều hành đầy đủ với các hệ thống tệp,
v.v., yêu cầu bổ sung một số tác vụ như vậy để thực hiện các dịch vụ vào ra, dịch vụ xử lý tệp
và quản lý tệp, tải tác vụ, giao diện người dùng và phần mềm trình điều khiển. Điều gì xảy ra về
một nhân nhỏ có kích thước <16 kbyte thường sẽ phát triển thành một hệ điều hành lớn 120
kbyte. Các tiện ích bổ sung này được xây dựng thành các lớp bao quanh hạt nhân. Các tác vụ
ứng dụng sau đó phù hợp với bên ngoài. Một cấu trúc củ hành điển hình được lấy làm ví dụ.
Do cấu trúc mô-đun, các ứng dụng thường có thể truy cập trực tiếp vào bất kỳ cấp nào nếu
được yêu cầu. Do đó, các tác vụ ứng dụng chỉ yêu cầu các dịch vụ do hạt nhân cung cấp có thể
được phát triển và gỡ lỗi trong môi trường đầy đủ, và được gỡ bỏ để tích hợp vào phần cứng
đích.

Trong một hệ thống điển hình, tất cả các tác vụ và ứng dụng dịch vụ này được nhân
điều khiển, lập lịch và thực thi. Nếu ứng dụng muốn ghi một số dữ liệu vào đĩa cứng trong hệ
thống, quá trình bắt đầu bằng việc ứng dụng tạo một khối tham số và yêu cầu trình quản lý tệp
mở tệp. Lệnh gọi hệ thống này thường được thực hiện bởi lệnh TRAP. Sau đó, hạt nhân đặt
tác vụ vào danh sách 'chờ đợi' của nó cho đến khi trình quản lý tệp hoàn thành và chuyển
thông tin trạng thái trở lại tác vụ ứng dụng. Khi sự kiện này đã được nhận, nó sẽ thức dậy và
được đưa vào danh sách ‘sẵn sàng’ đang chờ một khoảng thời gian.
Các hành động này được thực hiện bởi hạt nhân. Lệnh ứng dụng tiếp theo yêu cầu các
dịch vụ xử lý tệp chỉ định một số nhận dạng - thường được gọi là số đơn vị logic (LUN) - cho
tệp trước khi truy cập thực tế. Điều này cần thiết sau đó cho cuộc gọi dịch vụ vào ra. Một lần
nữa, một khối tham số khác được tạo ra và trình xử lý tệp được yêu cầu gán LUN. Tác vụ gọi
được đặt trong danh sách ‘chờ’ cho đến khi yêu cầu này được hoàn thành và LUN được trả về
bởi trình xử lý tệp. LUN xác định một tài nguyên vào ra cụ thể như một cổng nối tiếp hoặc một
tệp mà không thực sự biết các đặc điểm vật lý của nó. Do đó, thiết bị được mô tả là logic hơn là
vật lý.

Với LUN, tác vụ có thể tạo một khối tham số khác, chứa dữ liệu và yêu cầu các dịch vụ
vào ra ghi dữ liệu vào tệp. Điều này có thể yêu cầu các dịch vụ vào ra thực hiện các cuộc gọi
hệ thống của riêng nó. Nó có thể cần gọi các dịch vụ tệp để có thêm dữ liệu hoặc để chuyển
thêm thông tin. Sau đó, dữ liệu được cung cấp cho trình điều khiển thiết bị thực thi các hướng
dẫn để ghi dữ liệu vào đĩa một cách vật lý. Nhìn chung, ở cấp độ này, bản chất logic của yêu
cầu vào ra được chuyển thành các đặc tính vật lý liên quan đến phần cứng. Bản dịch này phải
nằm trong miền của phần mềm trình điều khiển thiết bị. Ứng dụng người dùng không biết về
những đặc điểm này.

Một lệnh gọi hệ thống phức tạp có thể gây ra nhiều cuộc gọi giữa các tác vụ hệ thống.
Bộ tải chương trình được một tác vụ ứng dụng yêu cầu tải một tác vụ khác từ bộ nhớ cần gọi
các dịch vụ tệp và dịch vụ vào ra để lấy tệp từ đĩa và hạt nhân để cấp phát bộ nhớ cho tác vụ
được tải vật lý.

Kỹ thuật sử dụng tên, tệp và hoặc số đơn vị logic chuẩn để truy cập hệ thống vào ra làm
cho việc chuyển phần mềm ứng dụng từ hệ thống này sang hệ thống khác rất dễ dàng. Các
truy cập như vậy độc lập với phần cứng mà hệ thống đang chạy và cho phép các ứng dụng xử
lý dữ liệu nhận hoặc gửi theo cùng một cách, bất kể nguồn của nó.

Hệ điều hành thời gian thực là gì?

Nhiều hệ điều hành đa nhiệm hiện nay cũng được mô tả là 'thời gian thực'. Các hệ điều
hành này cung cấp các tiện ích bổ sung cho phép các ứng dụng thường giao tiếp trực tiếp với
kiến trúc bộ vi xử lý sử dụng ngắt và điều khiển thiết bị ngoại vi để làm điều đó mà không cần
hệ điều hành chặn các hoạt động đó. Nhiều hệ điều hành đa nhiệm ngăn người dùng truy cập
các tài nguyên nhạy cảm như vậy. Sự quan tâm quá mức này có thể khiến nhiều hệ điều hành
không được sử dụng trong các ứng dụng như điều khiển công nghiệp.

Một đặc điểm của hệ điều hành thời gian thực là thời gian đáp ứng xác định của nó đối
với các kích thích bên ngoài. Nếu một thiết bị ngoại vi tạo ra một ngắt, hệ thống thời gian thực
sẽ ghi nhận và bắt đầu phục vụ nó trong một thời gian xác định tối đa. Thời gian phản hồi như
vậy khác nhau giữa các hệ thống, nhưng thời gian tối đa được chỉ định là con số trong trường
hợp xấu nhất và sẽ không bị vượt quá do những thay đổi trong các yếu tố như khối lượng công
việc của hệ thống.
Bất kỳ hệ thống nào đáp ứng yêu cầu này đều có thể được mô tả là thời gian thực, bất
kể giá trị thực tế là bao nhiêu, nhưng các số liệu được ngành công nghiệp chấp nhận điển hình
về chuyển mạch ngữ cảnh và thời gian phản hồi ngắt là khoảng 10 micro giây. Con số này nhỏ
hơn khi bộ vi xử lý trở nên mạnh mẽ hơn và chạy ở tốc độ cao hơn. Với một số bộ vi xử lý có
cơ chế chuyển đổi ngữ cảnh giống nhau, thời gian chuyển đổi ngữ cảnh cuối cùng sẽ phụ thuộc
vào tốc độ đồng hồ của nó và thời gian truy cập bộ nhớ.

Ví dụ về phản hồi thời gian thực

Hậu quả đối với việc kiểm soát công nghiệp không có đặc tính thời gian thực có thể là
thảm họa. Nếu một hệ thống đang kiểm soát một dây chuyền lắp ráp tự động và không đáp ứng
kịp thời yêu cầu từ một công tắc giới hạn băng tải để dừng băng tải, kết quả rất dễ hình dung.
Phản ứng không cần phải tức thời - nếu công tắc hành trình được đặt sao cho có 3 giây để
dừng dây đai, bất kỳ hệ thống nào có phản ứng trong trường hợp xấu nhất được đảm bảo dưới
3 giây đều có thể đáp ứng yêu cầu thời gian thực này.

Để hệ điều hành hoạt động theo thời gian thực, các cơ chế bên trong của nó cần thể
hiện các đặc tính thời gian thực để các quy trình bên trong phản ứng tuần tự với các ngắt bên
ngoài trong thời gian đảm bảo.

Khi một ngắt được tạo ra, tác vụ hiện tại sẽ bị ngắt để cho phép hạt nhân thừa nhận
ngắt và lấy số vector mà nó cần để xác định cách xử lý. Một kỹ thuật điển hình là sử dụng trình
xử lý ngắt của nhân để cập nhật danh sách liên kết chứa thông tin về tất cả các tác vụ cần
được thông báo về ngắt.

Nếu một tác vụ được đính kèm với một vectơ được hệ điều hành sử dụng, hệ thống sẽ
thực hiện các yêu cầu của riêng nó trước khi tác vụ đó phản hồi thêm. Sau đó, trình xử lý sẽ
gửi một thông báo sự kiện đến các tác vụ được đính kèm với vectơ, có thể thay đổi trạng thái
của chúng và thay đổi hoàn toàn mức độ ưu tiên của danh sách sẵn sàng tác vụ. Bộ lập lịch
phân tích danh sách và gửi tác vụ ưu tiên cao nhất để chạy. Nếu mức độ ưu tiên ngắt và nhiệm
vụ đủ cao, đây có thể là lát sau.

Sơ đồ mô tả một cơ chế như vậy: bộ xử lý ngắt và tìm kiếm danh sách liên kết được
thực hiện bởi hạt nhân. Ưu tiên đầu tiên là phục vụ ngắt. Điều này có thể là từ bộ điều khiển đĩa
cho biết rằng nó đã hoàn tất quá trình truyền dữ liệu. Khi hạt nhân đã thỏa mãn nhu cầu của
chính nó, trình xử lý sẽ bắt đầu tìm kiếm danh sách liên kết. Danh sách bao gồm các khối tác
vụ xác định dữ liệu có quy trình dịch vụ riêng. Mỗi khối sẽ chứa một tham chiếu đến khối tiếp
theo, do đó là thuật ngữ danh sách liên kết.

Xử lý các quy trình ngắt trong hệ điều hành

Mỗi nhiệm vụ được xác định sau đó sẽ được gửi một tin nhắn đặc biệt. Thao tác này sẽ
bắt đầu quy trình dịch vụ của tác vụ khi nó nhận được phần thời gian tiếp theo. Bộ xử lý ngắt
hạt nhân cuối cùng sẽ thực hiện trả về RTE từ lệnh ngoại lệ, lệnh này sẽ khôi phục trạng thái bộ
xử lý trước khi ngắt. Theo cách sắp xếp như vậy, các quy trình dịch vụ tác vụ thực thi ở chế độ
USER. Hoạt động SUPERVISOR duy nhất là của hạt nhân và trình xử lý ngắt của chính nó.
Như có thể tưởng tượng, quá trình xử lý này có thể làm tăng độ trễ gián đoạn của tác vụ khá
đáng kể. Mức tăng gấp 10 lần không phải là hiếm.

Để thực tế, hệ điều hành thời gian thực phải đảm bảo thời gian đáp ứng tối đa cho trình
xử lý ngắt, cơ chế truyền sự kiện, thuật toán lập lịch và cung cấp các lệnh gọi hệ thống để cho
phép các tác vụ đính kèm và xử lý ngắt.

Với ví dụ về băng tải ở trên, một cấu hình phần mềm điển hình sẽ dành một nhiệm vụ
để điều khiển băng tải. Tác vụ này sẽ thực hiện một số lệnh gọi hệ thống khi khởi động để truy
cập thiết bị ngoại vi vào ra song song giao diện hệ thống với các thành phần như động cơ
truyền động và công tắc hành trình và thông báo với hạt nhân rằng một số vectơ ngắt nhất định
được gắn vào tác vụ và được xử lý bởi quy trình xử lý ngắt của riêng nó.

Một khi nhiệm vụ đã thiết lập mọi thứ, nó sẽ không hoạt động cho đến khi một sự kiện
được gửi bởi các nhiệm vụ khác để bật hoặc tắt vành đai. Nếu một công tắc giới hạn được kích
hoạt, nó sẽ thiết lập một ngắt buộc hạt nhân phải xử lý nó. Tác vụ hiện đang thực thi dừng lại,
bộ xử lý hạt nhân tìm kiếm danh sách liên kết phần đính kèm ngắt tác vụ và đặt tác vụ bộ điều
khiển vào danh sách sẵn sàng, với bộ xử lý của riêng nó sẵn sàng thực thi. Vào khoảng thời
gian thích hợp, bộ xử lý chạy, truy cập thiết bị ngoại vi và ngắt dây đai. Kết quả này có thể
không bình thường, và do đó tác vụ cũng gửi thông điệp sự kiện cho những người khác, thông
báo cho họ rằng nó đã hoạt động độc lập và có thể buộc các hành động khác. Khi điều này đã
được thực hiện, nhiệm vụ sẽ quay trở lại trạng thái không hoạt động chờ các lệnh tiếp theo.

Hệ điều hành thời gian thực có những ưu điểm khác: để ngăn hệ thống mất điện thường
cần thời gian đáp ứng đảm bảo để có thể sử dụng khoảng thời gian ngắn giữa việc nhận biết
và khi mất điện thực tế để lưu trữ dữ liệu quan trọng và đưa hệ thống xuống. Cách thức kiểm
soát. Nhiều hệ điều hành thực sự có mô-đun lỗi nguồn được tích hợp trong nhân để không bị
mất thời gian trong việc thực thi mã mô-đun.

Cho đến nay trong chương này, chúng tôi đã giải thích tổng quan về những điều cơ bản
đằng sau một hệ điều hành thời gian thực. Tuy nhiên, có một số biến thể có sẵn cho các chức
năng chính như hoán đổi tác vụ, v.v. Các phần tiếp theo sẽ đi sâu hơn vào các chủ đề này.

Phương pháp hoán đổi công việc

Việc lựa chọn các thuật toán của bộ lập lịch có thể đóng một vai trò quan trọng trong
việc thiết kế một hệ thống nhúng và có thể ảnh hưởng đáng kể đến thiết kế cơ bản của phần
mềm. Có thể sử dụng nhiều loại thuật toán lập lịch trình khác nhau, mỗi loại đều có các đặc
điểm khác nhau hoặc các cách tiếp cận khác nhau để giải quyết cùng một vấn đề về cách phân
công mức độ ưu tiên để lập lịch nhiệm vụ sao cho đảm bảo hoạt động chính xác.

Lát cắt thời gian

Phương pháp cắt thời gian đã được đề cập trước đây trong chương này với chủ đề đa
nhiệm và có thể được sử dụng trong một hệ thống nhúng nơi các hoạt động quan trọng về thời
gian không cần thiết. Để chính xác hơn về định nghĩa của nó, nó mô tả cơ chế chuyển đổi
nhiệm vụ chứ không phải thuật toán đằng sau nó mặc dù ý nghĩa của nó đã trở nên đồng nghĩa
với cả hai.

Lát cắt thời gian hoạt động bằng cách thực hiện nhiệm vụ chuyển đổi các điểm định kỳ
thường xuyên trong thời gian. Điều này có nghĩa là bất kỳ tác vụ nào cần chạy tiếp theo sẽ phải
đợi cho đến khi hoàn thành lát cắt thời gian hiện tại hoặc cho đến khi tác vụ hiện tại tạm dừng
hoạt động của nó. Kỹ thuật này cũng có thể được sử dụng như một phương pháp lập kế hoạch
như sẽ được giải thích ở phần sau của chương này. Việc lựa chọn tác vụ nào để chạy tiếp theo
được xác định bởi thuật toán lập lịch và do đó không liên quan gì đến cơ chế lát cắt thời gian.
Nó chỉ xảy ra rằng nhiều hệ thống dựa trên lát cắt thời gian sử dụng bộ lập lịch làm việc theo
vòng tròn hoặc cơ chế ngang bằng khác để phân phối các lát cắt thời gian trên tất cả các tác vụ
cần chạy.

Đối với các hệ thống thời gian thực mà tốc độ là cốt yếu, thì khoảng thời gian cộng với
thời gian chuyển đổi ngữ cảnh của bộ xử lý sẽ xác định thời gian chuyển đổi ngữ cảnh của hệ
thống. Với hầu hết các khoảng thời gian theo thứ tự mili giây, nó là yếu tố chi phối phản ứng
của hệ thống. Trong khi khoảng thời gian có thể được giảm xuống để cải thiện thời gian chuyển
đổi ngữ cảnh hệ thống, nó sẽ làm tăng số lượng chuyển đổi nhiệm vụ sẽ xảy ra và điều này sẽ
làm giảm hiệu quả của hệ thống. Số lượng công tắc càng lớn thì thời gian xử lý càng ít.

Quyền ưu tiên

Giải pháp thay thế cho việc cắt giảm thời gian là sử dụng tính năng ưu tiên trước trong
đó một tác vụ hiện đang chạy có thể được dừng và chuyển ra - được ưu tiên trước - bởi một
tác vụ hoạt động có mức ưu tiên cao hơn. Vòng loại hoạt động là quan trọng như ví dụ về pre-
emption ở phần sau của phần này sẽ hiển thị. Sự khác biệt chính là công tắc tác vụ không cần
đợi kết thúc một lát thời gian và do đó công tắc ngữ cảnh hệ thống bây giờ giống như công tắc
ngữ cảnh bộ xử lý.

Ví dụ về cách hoạt động của tính năng tiền quyền, hãy xem xét một hệ thống có hai tác
vụ A và B. A là một tác vụ có mức ưu tiên cao hoạt động như một ISR để phục vụ thiết bị ngoại
vi và được kích hoạt bởi bộ xử lý ngắt từ thiết bị ngoại vi. Trong khi nó không phục vụ thiết bị
ngoại vi, tác vụ vẫn không hoạt động và ở trạng thái treo.

Nhiệm vụ B là nhiệm vụ có mức độ ưu tiên thấp thực hiện công việc quản lý hệ thống.

Khi ngắt được bộ xử lý nhận ra, hệ điều hành sẽ xử lý nó và kích hoạt tác vụ A. Tác vụ
này với mức độ ưu tiên cao hơn so với tác vụ B sẽ khiến tác vụ B được ưu tiên và thay thế bởi
tác vụ A. Tác vụ A sẽ tiếp tục xử lý cho đến khi nó đã hoàn thành và sau đó tự đình chỉ. Tại thời
điểm này, nhiệm vụ B sẽ chuyển ngữ cảnh nhiệm vụ A ra vì nhiệm vụ A không còn hoạt động.
Điều này có thể được thực hiện với cơ chế lát thời gian miễn là tốc độ ngắt nhỏ hơn tốc độ lát
thời gian. Nếu nó cao hơn, điều này cũng có thể ổn với điều kiện có đủ bộ đệm để lưu trữ dữ
liệu mà không làm mất dữ liệu trong khi chờ thời điểm tiếp theo. Vấn đề xảy ra khi tỷ lệ ngắt
cao hơn hoặc nếu có nhiều ngắt và các tác vụ liên quan. Trong trường hợp này, nhiều tác vụ có
thể cạnh tranh cho cùng một mốc thời gian và khả năng chạy mặc dù tổng thời gian xử lý cần
thiết để chạy tất cả chúng có thể ít hơn đáng kể so với thời gian được cung cấp trong một khe
thời gian. Điều này có thể được giải quyết bằng cách tạo giả tạo thêm các điểm chuyển đổi ngữ
cảnh bằng cách tạm dừng mỗi nhiệm vụ sau khi hoàn thành. Điều này có thể chỉ cung cấp một
giải pháp một phần vì nhiệm vụ có mức độ ưu tiên cao hơn có thể vẫn phải đợi nhiệm vụ có
mức độ ưu tiên thấp hơn để hoàn thành. Với lát cắt thời gian, tác vụ có mức độ ưu tiên thấp
hơn không thể được ưu tiên trước và do đó tác vụ có mức độ ưu tiên cao hơn phải đợi kết thúc
lát thời gian hoặc tác vụ có mức độ ưu tiên thấp hơn để hoàn thành. Đây là một dạng đảo
ngược ưu tiên sẽ được giải thích chi tiết hơn ở phần sau.

Hầu hết các hệ điều hành thời gian thực đều hỗ trợ tính năng ưu tiên theo thời gian mặc
dù một số có thể hỗ trợ cả hai phương pháp đa nhiệm hợp tác. Đây là cơ chế đằng sau
Windows 3.1 và mặc dù không áp dụng cho hệ điều hành thời gian thực vì những lý do sẽ trở
nên rõ ràng, nó đã được đưa vào để tham khảo.

Ý tưởng về đa nhiệm hợp tác là các nhiệm vụ tự hợp tác với nhau để tạo ra cảm giác về
đa nhiệm. Điều này được thực hiện bằng cách định kỳ cho phép các tác vụ hoặc ứng dụng
khác có cơ hội thực thi. Điều này yêu cầu lập trình bên trong ứng dụng và hệ thống có thể bị
phá hủy bởi một chương trình giả mạo duy nhất chứa tất cả sức mạnh xử lý. Phương pháp này
có thể được chấp nhận đối với máy tính cá nhân để bàn nhưng nó không đủ tin cậy cho hầu hết
các hệ thống nhúng thời gian thực.

Các thuật toán của bộ lập lịch

Cho đến nay trong phần này, các phương pháp hoán đổi nhiệm vụ chính đã được thảo
luận. Rõ ràng là pre-emption là sự lựa chọn hàng đầu cho các hệ thống nhúng vì phản ứng hệ
thống tốt hơn của nó. Vấn đề tiếp theo cần giải quyết là làm thế nào để phân công các ưu tiên
nhiệm vụ để hệ thống hoạt động và đây là chủ đề đang được nghiên cứu hiện nay.

Xếp hạng đơn âm

Lập kế hoạch đơn điệu tỷ lệ (RMS) là một cách tiếp cận được sử dụng để chỉ định mức
độ ưu tiên nhiệm vụ cho hệ thống ưu tiên trước theo cách đảm bảo việc thực thi chính xác có
thể được đảm bảo. Nó giả định rằng các ưu tiên nhiệm vụ được cố định cho một tập hợp các
nhiệm vụ nhất định và không bị thay đổi động trong quá trình thực thi. Nó giả định rằng có đủ
mức độ ưu tiên nhiệm vụ cho bộ nhiệm vụ và bộ nhiệm vụ chỉ mô hình hóa các sự kiện định kỳ.
Điều này có nghĩa là một ngắt được tạo ra bởi một thiết bị ngoại vi cổng nối tiếp được mô hình
hóa như một sự kiện xảy ra theo tốc độ định kỳ được xác định bởi tốc độ dữ liệu, chẳng hạn.
Các sự kiện không đồng bộ như người dùng nhấn phím được xử lý theo cách khác như sẽ
được giải thích ở phần sau.

Chính sách quan trọng trong RMS là các tác vụ có thời gian thực hiện ngắn hơn được
ưu tiên cao nhất trong hệ thống. Điều này có nghĩa là các tác vụ thực thi nhanh hơn có thể xử
lý trước các tác vụ định kỳ chậm hơn để chúng có thể đáp ứng thời hạn của mình. Lợi thế này
mang lại cho nhà thiết kế hệ thống là dễ dàng hơn về mặt lý thuyết để chỉ định hệ thống sao
cho các tác vụ sẽ đáp ứng thời hạn của chúng mà không làm quá tải bộ xử lý. Điều này đòi hỏi
kiến thức chi tiết về từng nhiệm vụ và thời gian thực hiện. Điều này và chu kỳ của nó có thể
được sử dụng để tính toán tải của bộ xử lý.
Để xem chính sách này hoạt động như thế nào, hãy xem xét các ví dụ được hiển thị
trong sơ đồ trên trang tiếp theo. Trong sơ đồ, các sự kiện bắt đầu một nhiệm vụ được hiển thị
dưới dạng các đường cắt ngang dòng thời gian và các nhiệm vụ được hiển thị dưới dạng hình
chữ nhật có độ dài xác định thời gian thực hiện của chúng. Ví dụ 1 cho thấy một nhiệm vụ tuần
hoàn đơn trong đó nhiệm vụ t được thực hiện với chu kỳ thời gian t. Ví dụ thứ hai thêm một
nhiệm vụ thứ hai S trong đó chu kỳ của nó dài hơn nhiệm vụ đó. Mức độ ưu tiên của nhiệm vụ
được hiển thị với nhiệm vụ S có mức độ ưu tiên cao nhất. Trong trường hợp này, chính sách
RMS đã không được tuân theo vì nhiệm vụ dài nhất đã được ưu tiên cao hơn nhiệm vụ ngắn
nhất. Tuy nhiên, xin lưu ý rằng trong trường hợp này, hệ thống hoạt động tốt do thời gian của
các khoảng thời gian của nhiệm vụ.

Ví dụ 3 cho thấy điều gì có thể xảy ra nếu thay đổi thời gian và tính chu kỳ của nhiệm vụ
S tiếp cận với nhiệm vụ t. Khi t3 xảy ra, tác vụ t được kích hoạt và bắt đầu chạy. Nó không
hoàn thành vì S2 xảy ra và nhiệm vụ S được hoán đổi do mức độ ưu tiên cao hơn của nó. Khi
nhiệm vụ S hoàn thành, nhiệm vụ t tiếp tục nhưng trong quá trình thực hiện, sự kiện t4 xảy ra
và do đó nhiệm vụ t đã không đáp ứng được thời hạn của nhiệm vụ 3. Ví dụ, điều này có thể
dẫn đến dữ liệu bị bỏ sót hoặc bị hỏng. Khi nhiệm vụ t hoàn thành, nó sẽ được kích hoạt lại để
đối phó với sự kiện t4.

Ví dụ 1: Nhiệm vụ tuần hoàn đơn

Ví dụ 2: Hai nguyên công tuần hoàn (S và t)

Ví dụ 3: Hai nguyên công tuần hoàn (S và t)


S có mức độ ưu tiên cao nhất
Ví dụ 4: Hai nguyên công tuần hoàn (S và t)
t có ưu tiên cao nhất

Sử dụng các chính sách RMS

Ví dụ 4 cho thấy cùng một kịch bản với các mức độ ưu tiên của nhiệm vụ được đảo
ngược để nhiệm vụ t ưu tiên nhiệm vụ S. Trong trường hợp này, chính sách RMS đã được tuân
thủ và hệ thống hoạt động tốt với cả hai tác vụ đáp ứng thời hạn của chúng. Hệ thống này hữu
ích để hiểu và cho phép phân tích lý thuyết trước khi thực hiện để ngăn một thiết kế phải gán
các ưu tiên nhiệm vụ theo cách thủ công để làm cho nó hoạt động bằng cách sử dụng phương
pháp thử và sai. Điều quan trọng cần nhớ trong bất kỳ phép tính nào là phải tính đến thời gian
hoán đổi ngữ cảnh cần thiết để hoàn thành trước và tiếp tục công việc. Việc sử dụng bộ xử lý
cũng có thể được tính toán và do đó cung cấp một số ý tưởng về hiệu suất cần thiết hoặc bao
nhiêu hiệu suất dự phòng. Thông thường, việc sử dụng càng cao (> 80%), thì càng có nhiều
khả năng là việc phân bổ ưu tiên bị sai và hệ thống sẽ bị lỗi. Nếu việc sử dụng dưới mức này,
rất có thể hệ thống sẽ chạy chính xác.

Đây là một trong những vấn đề với phân tích lý thuyết của các hệ thống như vậy trong
đó thiết kế thực tế có thể phải phá vỡ một số giả định mà phân tích dựa trên. Hầu hết các hệ
thống nhúng sẽ có các sự kiện và tác vụ không đồng bộ đang chạy. Trong khi chúng có thể
được mô hình hóa như một nhiệm vụ định kỳ thăm dò sự kiện không đồng bộ và được phân
tích như thể chúng sẽ chạy, các yếu tố khác như tỷ lệ truy cập bộ nhớ đệm có thể làm mất hiệu
lực thời gian bằng cách kéo dài thời gian thực hiện của bất kỳ phân tích nào. Tương tự, hành
động đồng bộ hóa các nhiệm vụ bằng cách giao tiếp giữa các tác vụ cũng có thể gây ra khó
khăn trong bất kỳ phân tích nào.

Lập lịch đơn điệu thời hạn

Lập lịch đơn điệu thời hạn (DMS) là một chính sách ưu tiên nhiệm vụ khác sử dụng thời
hạn gần nhất làm tiêu chí để chỉ định mức độ ưu tiên nhiệm vụ. Đưa ra một tập hợp các nhiệm
vụ, nhiệm vụ nào có thời hạn gần nhất sẽ được ưu tiên cao nhất. Điều này có nghĩa là người
lập kế hoạch hoặc nhà thiết kế phải biết khi nào những thời hạn này sẽ diễn ra. Theo dõi và
trên thực tế, việc lấy thông tin này ngay từ đầu có thể khó khăn và đây thường là lý do đằng
sau việc lập lịch thời hạn thường là lựa chọn thứ hai so với RMS.

Nguyên tắc ưu tiên


Với một hệ thống có số lượng nhiệm vụ lớn hoặc hệ thống có số lượng cấp độ ưu tiên
nhỏ, nguyên tắc chung là gán các nhiệm vụ có thời gian tương tự cho cùng cấp độ. Trong hầu
hết các trường hợp, điều này không ảnh hưởng đến khả năng lên lịch chính xác. Nếu một tác
vụ có ngữ cảnh lớn, tức là nó có nhiều đăng ký và dữ liệu được lưu trữ hơn so với các tác vụ
khác, thì cần tăng mức độ ưu tiên của nó để giảm chi phí chuyển đổi ngữ cảnh. Điều này có thể
ngăn hệ thống lên lịch đúng cách nhưng có thể là một thử nghiệm đáng giá.

Đảo ngược ưu tiên

Cũng có thể nhận được một điều kiện được gọi là đảo ngược ưu tiên trong đó tác vụ có
mức độ ưu tiên thấp hơn có thể tiếp tục chạy mặc dù có một tác vụ có mức độ ưu tiên cao hơn
đang hoạt động và đang chờ xử lý trước.
Điều này có thể xảy ra nếu tác vụ có mức độ ưu tiên cao hơn theo một cách nào đó bị
chặn bởi tác vụ có mức độ ưu tiên thấp hơn thông qua việc nó phải đợi cho đến khi một thông
báo hoặc semaphore được xử lý. Điều này có thể xảy ra vì một số lý do.

Tắt ngắt

Khi đang ở trong quy trình dịch vụ ngắt, tất cả các ngắt khác sẽ bị vô hiệu hóa cho đến
khi quy trình hoàn thành. Điều này có thể gây ra sự cố nếu một ngắt khác được nhận và chờ xử
lý. Điều gì xảy ra là ngắt có mức độ ưu tiên cao hơn được giữ lại để thay thế cho mức độ ưu
tiên thấp hơn - mặc dù nó xảy ra trước. Kết quả là, đảo ngược mức độ ưu tiên diễn ra cho đến
khi các ngắt được kích hoạt lại, lúc này ngắt có mức ưu tiên cao hơn sẽ bắt đầu xử lý ngoại lệ
của nó, do đó kết thúc quá trình nghịch đảo ưu tiên.
Một số liệu của hệ điều hành là khoảng thời gian dài nhất mà tất cả các ngắt đều bị vô
hiệu hóa. Sau đó, điều này phải được thêm vào bất kỳ tính toán độ trễ gián đoạn nào khác để
xác định khoảng thời gian chờ thực tế.

Hàng đợi tin nhắn

Nếu một thông báo được gửi đến hệ điều hành để kích hoạt một tác vụ, nhiều hệ thống
sẽ xử lý thông báo đó rồi lên lịch lại cho phù hợp. Bằng cách này, thứ tự hàng đợi tin nhắn giờ
đây có thể xác định mức độ ưu tiên của tác vụ. Ví dụ: hãy xem xét một ISR gửi thông báo bỏ
chặn đến hai tác vụ A và B, bị chặn khi chờ thông báo. ISR gửi thông báo cho tác vụ A trước
sau đó là tác vụ B. ISR là một phần của hạt nhân RTOS và do đó có thể phải tuân theo một số
điều kiện có thể có:

Điều kiện 1
Mặc dù các cuộc gọi tin nhắn có thể đã hoàn thành, hành động của họ có thể bị RTOS
chờ xử lý để mọi quyền ưu tiên kết quả sẽ bị dừng chuyển đổi ISR.

Điều kiện 2
ISR có thể chỉ được phép thực hiện một lệnh gọi RTOS và khi làm như vậy, bản thân hệ
điều hành sẽ dọn dẹp mọi khung ngăn xếp. Sau đó, hệ điều hành sẽ gửi tin nhắn đến các tác
vụ thông báo về ngắt và theo cách này mô phỏng tín hiệu ngắt. Điều này thường được thực
hiện thông qua một danh sách.

Những điều kiện này có thể gây ra sự đảo ngược ưu tiên.

Với điều kiện 1, các bản tin ISR đang chờ xử lý và xử lý. Vấn đề nảy sinh với phương
pháp được hệ điều hành sử dụng để xử lý các thông báo đang chờ xử lý. Nếu nó xử lý tất cả
các tin nhắn, bỏ chặn hiệu quả cả hai tác vụ trước khi giục bộ lập lịch quyết định tác vụ tiếp
theo sẽ chạy, thì tất cả đều tốt. Nhiệm vụ B sẽ được lên lịch trước nhiệm vụ A vì mức độ ưu
tiên cao hơn. Nhược điểm là sự chậm trễ trong việc xử lý tất cả các thông báo trước khi chọn
tác vụ tiếp theo. Tuy nhiên, hầu hết các hệ điều hành chỉ có một cuộc gọi duy nhất để xử lý và
do đó trong hoạt động bình thường không mong đợi xử lý nhiều thông báo. Trong trường hợp
này, các thông báo được xử lý riêng lẻ để sau khi thông báo đầu tiên được xử lý, tác vụ A sẽ
được bỏ chặn và cho phép thực thi. Thông báo cho nhiệm vụ B sẽ bị bỏ qua hoặc được xử lý
như một phần của công việc dọn phòng ở lần chuyển ngữ cảnh tiếp theo. Đây là nơi mà sự đảo
ngược ưu tiên sẽ xảy ra. Theo mã của nó, ISR đã bỏ chặn cả hai tác vụ và do đó sẽ mong đợi
tác vụ B có mức độ ưu tiên cao hơn sẽ thực thi. Trong thực tế, chỉ có nhiệm vụ A được bỏ chặn
và đang chạy, mặc dù nó có mức độ ưu tiên thấp hơn. Tình huống này là một lỗi lập trình
nhưng rất dễ mắc phải.

Để giải quyết vấn đề này, một số triển khai RTOS hạn chế ISR thực hiện một hoặc
không có lệnh gọi hệ thống. Không có lệnh gọi hệ thống nào, bản thân hệ điều hành sẽ coi sự
kiện ISR như một thông báo nội bộ và sẽ bỏ chặn bất kỳ tác vụ nào đang chờ sự kiện ISR. Với
một lệnh gọi hệ thống, một nhiệm vụ sẽ chịu trách nhiệm kiểm soát thứ tự thông báo để đảm
bảo rằng việc đảo ngược ưu tiên không diễn ra. Đang chờ tài nguyên Nếu một tài nguyên được
chia sẻ với tác vụ có mức độ ưu tiên thấp và nó không giải phóng nó, thì tác vụ có mức độ ưu
tiên cao hơn cần nó có thể bị chặn cho đến khi nó được giải phóng. Một ví dụ điển hình về điều
này là nơi mà trình xử lý ngắt được phân phối trên toàn hệ thống và cần truy cập vào một bus
chung để xử lý ngắt. Ví dụ như trường hợp này xảy ra với hệ thống VMEbus.

Thông báo ngắt VMEbus VMEbus là một bus kết nối được phát triển vào đầu những
năm 1980 để sử dụng trong điều khiển công nghiệp và các ứng dụng thời gian thực khác. Bus
không đồng bộ và rất giống với của MC68000. Nó bao gồm các bus địa chỉ, dữ liệu, ngắt và
điều khiển riêng biệt.

Nếu một VMEbus MASTER muốn thông báo cho người khác rằng một thông báo đang
chờ hoặc cần phải có hành động khẩn cấp, một ngắt VMEbus có thể được tạo ra. VMEbus hỗ
trợ bảy mức ưu tiên ngắt để cho phép ưu tiên tài nguyên. Bất kỳ bảng nào cũng có thể tạo ra
một ngắt bằng cách xác nhận một trong các mức. Việc xử lý ngắt có thể được tập trung và
được xử lý bởi một MASTER hoặc có thể được phân phối cho nhiều người. Đối với các ứng
dụng đa xử lý, xử lý phân tán cho phép liên lạc trực tiếp nhanh chóng đến các MASTER riêng lẻ
bởi bất kỳ bo mạch nào trong hệ thống có khả năng tạo ngắt: MASTER đã được chỉ định xử lý
các yêu cầu ngắt trên bus và bắt đầu chu trình báo nhận ngắt. Ở đây, cần phải xem xét cẩn
thận cấp độ trọng tài được chọn cho MASTER. Thời gian đáp ứng ngắt phụ thuộc vào thời gian
trình xử lý thực hiện để có được bus trước khi báo nhận. Điều này phải được chỉ định chính xác
để đạt được hiệu suất cần thiết. Nếu nó có mức ưu tiên thấp, thời gian phản hồi tổng thể có thể
nhiều hơn thời gian thu được đối với ngắt có mức ưu tiên thấp hơn mà trình xử lý có mức trọng
tài cao hơn. Các sơ đồ dưới đây cho thấy mối quan hệ cho cả sơ đồ trọng tài ưu tiên và trọng
tài vòng tròn. Một lần nữa, như đối với trường hợp của các chương trình trọng tài, hệ thống đấu
vòng tròn được giả định là trung bình để cung cấp quyền truy cập bình đẳng cho tất cả các mức
độ ưu tiên.

Thời gian phản hồi ngắt VMEbus cho sơ đồ phân xử ưu tiên

Thời gian phản hồi ngắt VMEbus cho một sơ đồ trọng tài vòng tròn
Đảo ngược mức độ ưu tiên có thể xảy ra nếu một ngắt có mức độ ưu tiên thấp hơn có
thể được xử lý ưu tiên cho mức độ ưu tiên cao hơn, đơn giản là do các cấp độ trọng tài. Để có
được phản hồi tốt nhất, các ngắt có mức ưu tiên cao chỉ nên được gán cho các MASTER cấp
độ trọng tài cao. Các yếu tố tương tự, chẳng hạn như lưu lượng cục bộ trên VMEbus và thời
gian truy cập, làm tăng thời gian phản hồi khi mức độ ưu tiên giảm.

VMEbus chỉ cho phép tối đa bảy mức ngắt riêng biệt và điều này giới hạn số lượng trình
xử lý ngắt tối đa là bảy. Đối với hệ thống có số lượng MASTER lớn hơn, cần sử dụng tính năng
thăm dò cho các nhóm MASTER được gán cho một mức ngắt duy nhất. Cả hai phương án xử
lý ngắt tập trung và phân tán đều có vị trí trong một hệ thống đa xử lý. Các lược đồ phân tán
cho phép sử dụng các ngắt để chuyển các thông báo có thâm niên cao đến các trình xử lý,
mang lại thời gian phản hồi nhanh, điều này có thể rất quan trọng đối với ứng dụng thời gian
thực. Đối với các thiết kế đơn giản hơn, khi có MASTER điều khiển chi phối, một trình xử lý có
thể là đủ.

Hệ thống công bằng

Đôi khi hệ thống yêu cầu các đặc tính khác với những đặc điểm được cung cấp ban đầu
hoặc cách khác là muốn một phản hồi hệ thống không dựa trên mức độ ưu tiên. Điều này có
thể đạt được bằng cách sử dụng một hệ thống công bằng trong đó truy cập bus được phân
phối trên các bộ xử lý yêu cầu. Có nhiều chương trình khác nhau có sẵn như round-robin trong
đó quyền truy cập chỉ được chuyển từ bộ xử lý này sang bộ xử lý khác. Các phương pháp khác
có thể sử dụng chia sẻ thời gian trong đó bus được cấp cho bộ xử lý với hiểu rằng nó phải
được hủy bỏ trong một khung thời gian tối đa.

Loại hệ thống này có thể ảnh hưởng đến phản hồi ngắt vì truy cập bus thường cần thiết
để phục vụ ngắt.

Nhiệm vụ, chủ đề và quy trình Phần này của chương này thảo luận về danh pháp được
cấp cho các mô-đun phần mềm chạy trong môi trường RTOS. Thông thường, chúng được gọi
là nhiệm vụ nhưng các tên khác như luồng và quy trình cũng được sử dụng để chỉ các thực thể
trong RTOS. Chúng đôi khi được sử dụng thay thế như một sự thay thế có thể hoán đổi cho
nhiệm vụ thuật ngữ. Trên thực tế, chúng đề cập đến các khía cạnh khác nhau trong hệ thống.

Cho đến nay trong chương này, một nhiệm vụ đã được sử dụng để mô tả một thực thể
công việc trong một hệ điều hành có quyền kiểm soát tài nguyên. Khi một chuyển đổi ngữ cảnh
được thực hiện, nó sẽ chuyển sang một nhiệm vụ khác đảm nhận một cách hiệu quả. Nói một
cách chính xác, chuyển đổi ngữ cảnh có thể bao gồm thông tin bổ sung có liên quan đến tác vụ
như thông tin quản lý bộ nhớ, nằm ngoài việc hoán đổi thanh ghi đơn giản được thực hiện trong
bộ xử lý. Do đó, quy trình thuật ngữ thường được sử dụng để bao gồm nhiều hơn một chuyển
đổi ngữ cảnh đơn giản và do đó bao gồm thông tin bổ sung. Vấn đề là điều này rất giống với
chuyển đổi nhiệm vụ hoặc chuyển đổi ngữ cảnh mà các định nghĩa đã bị mờ và gần như có thể
hoán đổi cho nhau. Một nhiệm vụ hoặc quy trình có một số đặc điểm:
Nó sở hữu hoặc kiểm soát tài nguyên, ví dụ: truy cập vào các thiết bị ngoại vi, v.v.

Nó có các chuỗi thực thi. Đây là những đường dẫn thông qua mã chứa trong nhiệm vụ
hoặc quy trình. Thông thường, có một luồng duy nhất nhưng điều này có thể không phải lúc
nào cũng đúng. Nhiều luồng có thể được hỗ trợ nếu tác vụ hoặc quy trình có thể duy trì các
vùng dữ liệu riêng biệt cho mỗi luồng. Điều này cũng yêu cầu mã phải được viết theo cách
đăng nhập lại.

Nó yêu cầu thông tin bổ sung ngoài nội dung thanh ghi thông thường để duy trì tính toàn
vẹn của nó, ví dụ: thông tin quản lý bộ nhớ, xóa bộ nhớ cache, v.v. Khi một quy trình hoặc tác
vụ mới được hoán đổi, không chỉ các thanh ghi của bộ xử lý bị thay đổi mà còn phải thực hiện
các công việc bổ sung như làm mất hiệu lực bộ nhớ đệm để đảm bảo rằng quy trình hoặc tác
vụ mới không truy cập thông tin sai.

Một chủ đề có các đặc điểm khác nhau:


• Nó không có thông tin ngữ cảnh bổ sung nào ngoài thông tin được lưu trữ trong bộ thanh ghi
bộ xử lý.
• Quyền sở hữu tài nguyên của nó được kế thừa từ nhiệm vụ hoặc quy trình mẹ của nó.

Với một hệ điều hành đơn giản, không có sự khác biệt giữa chuyển đổi ngữ cảnh luồng
và chuyển đổi mức quy trình. Do đó, các thuật ngữ này gần như có thể hoán đổi cho nhau. Với
hệ điều hành đa người dùng, đa nhiệm thì không phải như vậy. Quy trình hoặc nhiệm vụ là cấp
cao hơn với (các) luồng là cấp thấp hơn. Một số hệ điều hành thực hiện thêm giai đoạn này và
xác định hệ thống phân cấp ba cấp: một quy trình bao gồm một tập hợp các tác vụ với mỗi tác
vụ có nhiều luồng. Hãy cảnh báo! Những thuật ngữ này có nhiều nghĩa khác nhau tùy thuộc
vào người đang sử dụng chúng.

Ngoại lệ

Với hầu hết các hệ thống nhúng, quyền truy cập vào trình xử lý ngoại lệ mức thấp là
điều cần thiết để cho phép các quy trình tùy chỉnh được viết để hỗ trợ hệ thống. Điều này có thể
bao gồm các quy trình ngắt để điều khiển các thiết bị ngoại vi bên ngoài, các quy trình mô
phỏng để mô phỏng các lệnh hoặc các phương tiện mà bộ xử lý không hỗ trợ - dấu chấm động
phần mềm là một ví dụ rất tốt về điều này - và các loại ngoại lệ khác.

Một số ngoại lệ này được RTOS cần để cung cấp các điểm nhập vào hạt nhân và cho
phép bộ định thời và các cơ sở khác hoạt động. Do đó, hầu hết các RTOS đã cung cấp chức
năng cơ bản để phục vụ các ngoại lệ và cung cấp các điểm truy cập vào chức năng này để cho
phép nhà thiết kế thêm các quy trình ngoại lệ tùy chỉnh. Điều này có thể được thực hiện theo
một số cách:

Vá bảng vectơ
Điều này tương đối dễ hiểu nếu vectơ không được RTOS sử dụng. Nếu đúng như vậy
thì bản vá sẽ vẫn hoạt động nhưng quy trình ngoại lệ do người dùng chèn phải bảo toàn ngữ
cảnh ngoại lệ và sau đó chuyển đến trình xử lý hiện có thay vì sử dụng lệnh trả về từ loại ngoại
lệ để khôi phục xử lý bình thường. Nếu nó đang chia sẻ một ngoại lệ với RTOS, thì phải có một
số hình thức kiểm tra để trình xử lý người dùng không ngăn quy trình RTOS hoạt động chính
xác.

Điều này rất giống với kỹ thuật trước đó là quy trình người dùng được thêm vào bất kỳ
quy trình RTOS hiện có nào. Sự khác biệt là cơ chế này chính thức hơn và không yêu cầu bản
vá bảng vectơ hoặc bất kỳ kiểm tra cụ thể nào bởi trình xử lý ngoại lệ người dùng.

Tạo ngoại lệ giả được xử lý bởi (các) trình xử lý ngoại lệ người dùng riêng biệt
Điều này thậm chí còn chính thức hơn - và chậm hơn - và thay thế hiệu quả quy trình
ngoại lệ cấp bộ xử lý bằng phiên bản cấp RTOS trong đó người dùng tạo bảng vectơ và các
quy trình ngoại lệ của riêng mình. Thông thường, tất cả điều này được thực hiện thông qua các
lệnh gọi hạt nhân đặc biệt đăng ký một tác vụ làm trình xử lý cho một ngoại lệ cụ thể. Khi hoàn
thành, trình xử lý sử dụng một trả về đặc biệt từ lệnh gọi ngoại lệ vào hạt nhân RTOS để biểu
thị rằng nó đã hoàn thành.

Mô hình bộ nhớ

Mô hình bộ nhớ mà bộ xử lý cung cấp có thể và thường thay đổi theo mô hình được xác
định bởi hệ điều hành và mở cho nhà thiết kế phần mềm sử dụng. Nói cách khác, mặc dù bộ
xử lý có thể hỗ trợ phạm vi địa chỉ 32 bit đầy đủ với vào ra được ánh xạ bộ nhớ đầy đủ và
quyền truy cập đọc / ghi ở bất kỳ đâu trong bản đồ ở cấp độ của một từ hoặc bản đồ riêng lẻ,
việc biểu diễn bản đồ bộ nhớ của hệ điều hành có thể chỉ có 28 bit, với quyền truy cập vào ra
được phân bổ trên cơ sở 512 byte với quyền truy cập chỉ đọc cho 4 Mbyte RAM đầu tiên, v.v.

Sự khác biệt này thậm chí có thể ngày càng rộng hơn, càng giảm sâu trong các cấp độ
bạn đi. Ví dụ: hầu hết các bộ vi xử lý có hỗ trợ bộ nhớ đệm phức tạp đều sử dụng đơn vị quản
lý bộ nhớ. Điều này sau đó yêu cầu thông tin khá chi tiết về các khối bộ nhớ riêng lẻ trong một
hệ thống. Thông tin này phải được cung cấp cho RTOS và thường được thực hiện bằng cách
sử dụng các kỹ thuật cấp phát bộ nhớ khác nhau, nơi thông tin được cung cấp khi phần mềm
hệ thống được biên dịch và trong quá trình hoạt động.

Cấp phát bộ nhớ

Hầu hết các hệ điều hành thời gian thực dành cho bộ xử lý mà bản đồ bộ nhớ có thể
được định cấu hình, ví dụ: những người có địa chỉ bộ nhớ lớn và sử dụng vào ra được ánh xạ
bộ nhớ, giải quyết vấn đề này bằng cách sử dụng một tệp đặc biệt xác định bản đồ bộ nhớ mà
hệ thống dự kiến sẽ sử dụng và hỗ trợ. Điều này sẽ xác định địa chỉ bộ nhớ nào tương ứng với
các khu vực vào ra, RAM, ROM, v.v. Khi một tác vụ được tạo, nó sẽ được cung cấp một lượng
bộ nhớ nhất định để giữ vùng mã của nó và cung cấp một số lưu trữ dữ liệu ban đầu. Nếu nó
yêu cầu nhiều bộ nhớ hơn, nó sẽ yêu cầu nó từ RTOS bằng cách sử dụng một cuộc gọi đặc
biệt như malloc (). RTOS sẽ xem xét yêu cầu bộ nhớ và cấp phát bộ nhớ bằng cách chuyển lại
một con trỏ tới bộ nhớ bổ sung. Yêu cầu bộ nhớ thông thường sẽ xác định các đặc tính của bộ
nhớ như truy cập đọc / ghi, kích thước, và thậm chí cả vị trí và các thuộc tính của nó như địa
chỉ vật lý hoặc logic.

Câu hỏi chính được đặt ra là tại sao lại cấp phát động bộ nhớ? Chắc chắn điều này có
thể được thực hiện khi các tác vụ được xây dựng và đi kèm với hệ điều hành? Câu trả lời là
không đơn giản. Nói một cách dễ hiểu, đó là có và đối với nhiều hệ thống nhúng đơn giản, điều
này là chính xác. Tuy nhiên, đối với các hệ thống phức tạp hơn, việc cấp phát bộ nhớ tĩnh này
không hiệu quả, trong bộ nhớ đó có thể được dành riêng hoặc cấp phát cho một tác vụ nhưng
hiếm khi có thể được sử dụng trong hoạt động của hệ thống. Bằng cách cấp phát động bộ nhớ,
tổng dung lượng bộ nhớ mà hệ thống yêu cầu cho một chức năng nhất định có thể được giảm
bớt bằng cách lấy lại và phân bổ lại bộ nhớ khi cần thiết bởi phần mềm hệ thống. Điều này sẽ
được giải thích chi tiết hơn ở phần sau.

Đặc điểm bộ nhớ

Các đặc tính của bộ nhớ rất quan trọng để hiểu đặc biệt khi các địa chỉ bộ nhớ khác
nhau tương ứng với bộ nhớ vật lý khác nhau. Do đó, việc yêu cầu một khối bộ nhớ cụ thể có
thể ảnh hưởng đến hiệu suất hệ thống. Ví dụ: hãy xem xét một bộ xử lý nhúng có cả bộ nhớ
trong và bộ nhớ ngoài. Bộ nhớ trong nhanh hơn bộ nhớ ngoài và do đó cải thiện hiệu suất bằng
cách không chèn trạng thái chờ khi truy cập bộ nhớ. Nếu một tác vụ yêu cầu bộ nhớ mong đợi
được cấp phát bộ nhớ trong nhưng thay vào đó lại nhận được một con trỏ đến bộ nhớ ngoài,
hiệu suất tác vụ sẽ bị giảm sút và hệ thống có thể bị lỗi. Đây không phải là một lỗi lập trình theo
đúng nghĩa của từ này vì mã yêu cầu và RTOS đã thực thi chính xác. Nếu yêu cầu không đủ cụ
thể, thì tác vụ nhận sẽ xảy ra trường hợp xấu nhất là loại bộ nhớ. Nếu nó không hoặc cần bộ
nhớ cụ thể, điều này nên được chỉ định trong yêu cầu. Điều này thường được thực hiện bằng
cách chỉ định địa chỉ bộ nhớ hoặc kiểu mà mã phân bổ bộ nhớ RTOS có thể kiểm tra đối với tệp
bản đồ bộ nhớ đã được sử dụng khi hệ thống được xây dựng.

Quyền đọc / ghi

Điều này đơn giản và xác định các quyền truy cập mà một tác vụ cần để truy cập một
khối bộ nhớ.
• Bộ nhớ trong / ngoài

Điều này thường liên quan đến các vấn đề về tốc độ và hiệu suất. Các loại bộ nhớ khác
nhau thường được xác định không phải bởi tốc độ của chúng mà gián tiếp thông qua vị trí địa
chỉ. Do đó, lập trình viên phải xác định và sử dụng bản đồ bộ nhớ để các địa chỉ của khối bộ
nhớ được yêu cầu khớp với bộ nhớ vật lý cần thiết và do đó tốc độ của nó. Một số RTOS thực
sự cung cấp các cờ hỗ trợ đơn giản như bên trong / bên ngoài nhưng điều này không phổ biến.

• Kích thước
Kích thước tối thiểu và tối đa phụ thuộc vào hệ thống và thường bị ảnh hưởng bởi kích
thước trang của bất kỳ phần cứng quản lý bộ nhớ nào có thể có mặt. Một số hệ thống có thể trả
về với các khối một phần, ví dụ: nếu yêu cầu ban đầu là 8 kbyte, RTOS có thể chỉ có 4 kbyte
trống và thay vì trả về lỗi, thay vào đó sẽ trả về một con trỏ đến khối 4 kbyte. Điều này giả định
rằng tác vụ yêu cầu sẽ kiểm tra kích thước được trả về chứ không chỉ đơn giản giả định rằng vì
không có lỗi, nó có tất cả 8 kbyte mà nó yêu cầu! Kiểm tra chi tiết RTOS một cách cẩn thận.

Vào/Ra

Điều này có một số tác động khi sử dụng các bộ xử lý thực hiện các lệnh không theo
thứ tự để loại bỏ các ngăn chặn đường ống và do đó đạt được hiệu suất. Việc thực thi các lệnh
truy cập các cổng vào ra không theo trình tự có thể phá vỡ tính toàn vẹn và cú pháp của
chương trình. Chương trình có thể xuất ra một byte và sau đó đọc một thanh ghi trạng thái. Nếu
điều này bị đảo ngược, trình tự chính xác đã bị phá hủy và phần mềm có thể sẽ bị sập. Bằng
cách khai báo địa chỉ vào ra là vào ra, bộ xử lý có thể được lập trình để đảm bảo trình tự chính
xác bất cứ khi nào các địa chỉ này được truy cập.

Bộ nhớ đệm hoặc không thể lưu trữ

Điều này tương tự như đoạn trước trên vào ra. Địa chỉ vào ra không nên được lưu vào
bộ nhớ đệm để ngăn ngừa hỏng dữ liệu. Các khối bộ nhớ dùng chung cần được xử lý cẩn thận
với bộ nhớ đệm và trong nhiều trường hợp trừ khi có một số hình thức dò tìm xe buýt để kiểm
tra xem nội dung của bộ nhớ đệm có còn hợp lệ hay không, các khu vực này cũng không nên
được lưu vào bộ nhớ đệm.

Chính sách kết hợp


Bộ nhớ đệm dữ liệu có thể có các chính sách kết hợp khác nhau như ghi qua, sao chép
lại, v.v. được sử dụng để đảm bảo đồng tiền dữ liệu trong hệ thống. Một lần nữa, khả năng chỉ
định hoặc thay đổi các chính sách này rất hữu ích.

Bản đồ bộ nhớ mẫu


Ví dụ đầu tiên là nó thường được sử dụng trong một bộ vi điều khiển đơn giản, nơi
không gian địa chỉ của nó được chia thành các loại bộ nhớ khác nhau. Ví dụ cho thấy ba: thiết
bị vào ra và thiết bị ngoại vi, RAM chương trình và ROM và RAM dữ liệu. Hai loại cuối cùng sau
đó đã được mở rộng để chỉ ra cách chúng có thể được cấp phát cho một hệ thống nhúng đơn
giản. Vùng chương trình chứa mã cho bốn tác vụ, mã RTOS và bảng vectơ bộ xử lý. RAM dữ
liệu được chia thành năm khu vực: một cho mỗi tác vụ và một khu vực thứ năm cho ngăn xếp.
Trong thực tế, các khu vực này thường được chia thành bộ nhớ trong và ngoài, EPROM và
EEPROM, SRAM và thậm chí DRAM, tùy thuộc vào kiến trúc và mô hình bộ xử lý. Ví dụ này sử
dụng một bản đồ bộ nhớ tĩnh cố định trong đó các yêu cầu bộ nhớ cho toàn bộ hệ thống được
xác định tại thời gian biên dịch và xây dựng. Điều này có nghĩa là các tác vụ không thể truy cập
vào bộ nhớ bổ sung bằng cách sử dụng một số bộ nhớ được phân bổ cho một tác vụ khác.
Ngoài ra, cần nhớ rằng mặc dù bản đồ bộ nhớ hiển thị các khu vực được phân chia độc đáo,
nhưng nó không ngụ ý cũng như không nên cho rằng nhiệm vụ A không thể truy cập vùng dữ
liệu của nhiệm vụ C. Trong các bộ xử lý và bản đồ bộ nhớ đơn giản này, tất cả các tác vụ đều
có khả năng truy cập vào bất kỳ vị trí bộ nhớ nào và chỉ có thiết kế và lập trình chính xác mới
đảm bảo rằng không có lỗi. Phần cứng có thể được sử dụng để cung cấp mức độ bảo vệ này
nhưng nó yêu cầu một số dạng đơn vị quản lý bộ nhớ để kiểm tra xem các chương trình có
tuân thủ thiết kế của chúng và không truy cập bộ nhớ mà chúng không nên. Quản lý bộ nhớ
được giải thích chi tiết trong phần tiếp theo.

Sơ đồ bộ nhớ vi điều khiển đơn giản

Bản đồ bộ nhớ trong và ngoài


Ví dụ thứ hai cho thấy một hệ thống tương tự như ví dụ đầu tiên ngoại trừ việc nó đã
được phân chia thêm thành bộ nhớ trong và ngoài. Bộ nhớ trong chạy nhanh hơn bộ nhớ ngoài
và vì nó không có bất kỳ trạng thái chờ nào nên thời gian truy cập nhanh hơn và hiệu suất của
bộ xử lý không bị suy giảm. Bộ nhớ ngoài chậm hơn có hai trạng thái chờ và với một bộ xử lý
chu kỳ đơn sẽ làm giảm hiệu suất 66% - ví dụ, mỗi lệnh sẽ có ba đồng hồ thay vì một đồng hồ.

Bản đồ bộ nhớ với phân bổ động - trạng thái ban đầu


Bản đồ bộ nhớ với phân bổ động - sau khi yêu cầu bộ nhớ

Với sự khác biệt về hiệu suất này, điều quan trọng là tài nguyên bộ nhớ được phân bổ
cẩn thận. Trong ví dụ, tác vụ A yêu cầu hiệu suất tốt nhất và hệ thống cần chuyển đổi tác vụ
nhanh chóng. Điều này có nghĩa là cả mã và dữ liệu của tác vụ A, cùng với RTOS và ngăn xếp
hệ thống, đều được phân bổ vào bộ nhớ trong, nơi nó sẽ có được hiệu suất tốt nhất. Tất cả mã
tác vụ và dữ liệu khác được lưu trữ bên ngoài vì tất cả bộ nhớ trong đều được sử dụng.

Ví dụ thứ ba cho thấy một hệ thống phân bổ động, nơi các tác vụ có thể yêu cầu bộ nhớ
bổ sung khi và khi chúng cần. Bản đồ đầu tiên hiển thị trạng thái ban đầu với bộ nhớ cơ bản
được phân bổ cho các tác vụ và RTOS. Điều này tương tự như các ví dụ trước, ngoại trừ việc
có một lượng lớn bộ nhớ có quyền bộ nhớ động được điều khiển bởi RTOS và có thể được cấp
phát động bởi nó cho các tác vụ khác theo yêu cầu. Hai sơ đồ tiếp theo cho thấy điều này đang
hoạt động. Yêu cầu đầu tiên của tác vụ C bắt đầu bằng cách gửi yêu cầu tới RTOS để có thêm
bộ nhớ. RTOS phân bổ một khối cho nhiệm vụ và trả về một con trỏ cho nó. Tác vụ C có thể sử
dụng quyền này để truy cập vào bộ nhớ này. Điều này có thể được lặp lại nếu cần và sơ đồ tiếp
theo cho thấy tác vụ C lặp lại yêu cầu và nhận quyền truy cập vào khối thứ hai. Các khối cũng
có thể được hủy bỏ và trả lại cho RTOS để phân bổ cho các nhiệm vụ khác vào một số ngày
khác. Quá trình này rất năng động và do đó có thể cung cấp một cơ chế để giảm thiểu việc sử
dụng bộ nhớ. Tác vụ C có thể được cấp phát tất cả bộ nhớ vào những thời điểm nhất định và
khi bộ nhớ được sử dụng và không còn cần thiết nữa, các khối có thể được phân bổ lại cho các
tác vụ khác nhau.

Bản đồ bộ nhớ với phân bổ động - sau khi yêu cầu bộ nhớ thứ hai

Vấn đề với điều này là trong việc tính toán dung lượng bộ nhớ tối thiểu mà hệ thống sẽ
yêu cầu. Điều này có thể khó ước tính và nhiều thiết kế bắt đầu với lượng bộ nhớ lớn, để hệ
thống chạy và sau đó theo kinh nghiệm tìm ra dung lượng bộ nhớ tối thiểu cần thiết.

Trong phần này, việc sử dụng quản lý bộ nhớ trong một thiết kế nhúng đã được đề cập
đến trong trường hợp bảo vệ bộ nhớ khỏi bị hỏng. Mặc dù đây là một công dụng quan trọng,
nhưng nó là một lợi thế thứ yếu so với khả năng tái sử dụng bộ nhớ thông qua dịch địa chỉ.
Trước khi quay lại ý tưởng về bảo vệ bộ nhớ, hãy xem xét cách dịch địa chỉ hoạt động và ảnh
hưởng đến bản đồ bộ nhớ.

Biên dịch địa chỉ quản lý bộ nhớ

Mặc dù việc sử dụng quản lý bộ nhớ thường ngụ ý việc sử dụng hệ điều hành để loại bỏ
công việc tốn thời gian xác định và viết phần mềm trình điều khiển, nhưng điều đó không có
nghĩa là mọi hệ điều hành đều hỗ trợ quản lý bộ nhớ.
Nguyên tắc quản lý bộ nhớ

Nhiều người không hoặc rất hạn chế về loại phương tiện quản lý bộ nhớ mà chúng hỗ
trợ. Đối với các hệ điều hành có hỗ trợ nó, người thiết kế có thể truy cập vào phần mềm tiêu
chuẩn điều khiển việc dịch các địa chỉ logic sang các địa chỉ vật lý khác nhau như thể hiện trong
sơ đồ. Trong ví dụ này, bộ xử lý nghĩ rằng nó đang truy cập bộ nhớ ở cuối bản đồ bộ nhớ của
nó, trong khi thực tế nó đang được tìm nạp từ các vị trí khác nhau trong bản đồ bộ nhớ chính.
Bộ nhớ thậm chí không cần phải liền kề: khối hoặc bộ nhớ đơn của bộ xử lý có thể được chia
thành các khối nhỏ hơn, mỗi khối có một địa chỉ dịch khác nhau.
Chuyển động chính xác của mã có thể di dời

Dịch địa chỉ này cực kỳ mạnh mẽ và cho phép nhà thiết kế hệ thống nhúng nhiều tùy
chọn để cung cấp khả năng phát hiện lỗi và / hoặc bảo mật cao hơn trong hệ thống hoặc thậm
chí giảm chi phí thông qua việc sử dụng bộ nhớ ảo. Điểm mấu chốt là việc quản lý bộ nhớ chia
bản đồ bộ nhớ của bộ xử lý thành các vùng có thể xác định được với các thuộc tính khác nhau
chẳng hạn như quyền truy cập chỉ đọc và ghi đối với truyền dữ liệu một cách và tác vụ hoặc
quy trình truy cập bộ nhớ cụ thể.

Nếu không có phần cứng quản lý bộ nhớ, hầu hết các hệ điều hành có thể thay thế cơ
sở dịch địa chỉ cơ bản của chúng bằng một sơ đồ dựa trên phần mềm, miễn là mã được viết để
độc lập về vị trí và có thể di chuyển lại được. Các kỹ thuật phức tạp hơn bắt đầu áp đặt chi phí
phần mềm lớn mà trong nhiều trường hợp khó có thể biện minh được trong một hệ thống đơn
giản. Dịch địa chỉ thường cần thiết để thực thi các chương trình ở các vị trí khác nhau mà
chúng được tạo ra. Điều này cho phép sử dụng lại các mô-đun phần mềm hiện có và tạo điều
kiện dễ dàng chuyển phần mềm từ nguyên mẫu sang hệ thống cuối cùng.
Chuyển động không chính xác của mã có thể định vị lại

Các kỹ thuật di dời dựa trên phần mềm bổ sung được tích hợp trong bộ nạp chương
trình hoặc thậm chí trong chính hệ điều hành. Nếu bộ nạp chương trình của hệ điều hành
không thể cấp phát bộ nhớ gốc, chương trình sẽ được chuyển vào khối có sẵn tiếp theo và
chương trình được phép thực thi. Mã định vị lại không có bất kỳ giá trị định địa chỉ tức thời nào
và sử dụng rộng rãi cách định địa chỉ tương đối của chương trình. Vùng dữ liệu hoặc chương
trình con phần mềm không được tham chiếu một cách rõ ràng nhưng được định vị bởi các chế
độ địa chỉ tương đối sử dụng các hiệu số:

Địa chỉ rõ ràng, ví dụ: rẽ nhánh tới chương trình con tại địa chỉ $ 0F04FF.
• Địa chỉ tương đối
ví dụ. rẽ nhánh đến chương trình con được bù đắp từ đây $ 50 byte.

Với điều kiện các hiệu số được duy trì, thì việc định địa chỉ tương đối sẽ định vị dữ liệu
và mã ở bất cứ nơi nào các khối được đặt trong bộ nhớ. Hầu hết các trình biên dịch hiện đại sẽ
sử dụng các kỹ thuật này nhưng không cho rằng tất cả chúng đều làm được. Tuy nhiên, có
nhiều cách thay thế thao tác địa chỉ để cung cấp bản dịch địa chỉ.
Chuyển đổi ngân hàng

Khi bộ vi xử lý 8 bit đầu tiên được cung cấp với không gian bộ nhớ 64 kbytes, đã có
nhiều nhận xét về việc liệu có cần lượng bộ nhớ này hay không. Khi PC IBM xuất hiện với bản
đồ bộ nhớ 640 kbyte, các nhận xét tương tự cũng được đưa ra và ngày nay chúng ta đang sử
dụng các PC có thể có 32 Mbyte RAM. Vấn đề mà nhiều kiến trúc bộ xử lý đời đầu gặp phải với
bản đồ bộ nhớ nhỏ 64 kbyte là làm thế nào để mở rộng không gian mà không cần phải thay đổi
kiến trúc và tăng kích thước thanh ghi, v.v.

Một kỹ thuật được sử dụng là chuyển đổi ngân hàng. Với kỹ thuật này, các bit bổ sung
được sử dụng để chọn các ngân hàng bộ nhớ khác nhau. Mỗi ngân hàng có kích thước đầy đủ
là 64 kbyte và được sử dụng theo cách thông thường. Bằng cách ghi vào các bit lựa chọn riêng
lẻ, một ngân hàng riêng lẻ có thể được chọn và sử dụng. Có thể lập luận rằng điều này không
khác gì việc thêm các bit địa chỉ bổ sung. Sử dụng hai bit lựa chọn sẽ hỗ trợ bốn ngân hàng 64
kbyte cho tổng không gian bộ nhớ là 256 kbyte. Đây là cùng một lượng bộ nhớ có thể được xử
lý bằng cách tăng số lượng bit địa chỉ từ 16 lên 18. Tuy nhiên, sự khác biệt là việc thêm các bit
địa chỉ ngụ ý rằng mô hình lập trình và bộ xử lý biết về không gian địa chỉ rộng hơn và có thể sử
dụng nó. . Với chuyển mạch ngân hàng, điều này không đúng, và sự kiểm soát và thao tác của
các ngân hàng nằm dưới sự kiểm soát của chương trình mà bộ xử lý đang chạy. Nói cách
khác, bản thân bộ xử lý không biết rằng việc chuyển đổi ngân hàng đang diễn ra. Nó chỉ đơn
giản là xem không gian địa chỉ 64 kbyte bình thường.

Cách tiếp cận này thường được sử dụng với các bộ vi điều khiển có không gian địa chỉ
bên ngoài nhỏ hoặc các bus địa chỉ bên ngoài bị hạn chế. Các bit lựa chọn được tạo ra bằng
cách dành các bit từ các đường vào ra song song của vi điều khiển và sử dụng các bit này để
chọn và chuyển đổi các ngân hàng bộ nhớ ngoài. Việc chuyển mạch ngân hàng được điều
khiển bằng cách ghi vào các bit này trong cổng vào ra. Điều này có một số hậu quả thú vị đối
với các thiết kế sử dụng RTOS. Vấn đề chính là chương trình phải hiểu khi nào bối cảnh hệ
thống đủ an toàn để cho phép thực hiện chuyển đổi ngân hàng. Điều này có nghĩa là các thực
thể hệ thống như cấu trúc dữ liệu, bộ đệm và bất kỳ thứ gì khác được lưu trữ trong bộ nhớ bao
gồm phần mềm chương trình phải phù hợp với ranh giới do chuyển mạch ngân hàng tạo ra.
Điều này có thể khá đơn giản nhưng cũng có thể cực kỳ phức tạp. Ví dụ, nếu chuyển mạch
ngân hàng được sử dụng để mở rộng cơ sở dữ liệu, thì việc chuyển mạch có thể dễ dàng kiểm
soát bằng cách chèn séc cho ranh giới ngân hàng bộ nhớ. Hồ sơ 1–100 có thể ở ngân hàng A,
với ngân hàng B giữ hồ sơ 101–200. Bằng cách kiểm tra số hồ sơ, phần mềm có thể chuyển
đổi giữa các ngân hàng khi cần thiết. Việc triển khai như vậy có thể xác định một chương trình
con là điểm truy cập vào dữ liệu và trong quy trình này, việc chuyển mạch ngân hàng được
quản lý để nó minh bạch với phần còn lại của phần mềm.

Mặt khác, việc sử dụng chuyển mạch ngân hàng để hỗ trợ các ngăn xếp lớn hoặc cấu
trúc dữ liệu khó hơn vì các cơ chế sử dụng dữ liệu liên quan đến truy cập tự động và được
kiểm soát bằng phần mềm. Các ngắt có thể khiến các ngăn xếp tự động tăng lên và không có
cách nào dễ dàng để kiểm tra xem có tràn và sau đó kết hợp chuyển mạch ngân hàng, v.v. cần
thiết để sử dụng nó. Tóm lại, chuyển mạch ngân hàng được sử dụng và có những bộ xử lý 8 bit
có các bit chuyên dụng để hỗ trợ nó nhưng vấn đề phần mềm để sử dụng nó là rất lớn. Do đó,
người thiết kế hệ thống thường phải tìm ra cách sử dụng nó trong một thiết kế. Do đó, rất ít,
nếu có, môi trường RTOS hỗ trợ mô hình bộ nhớ này.

Phân đoạn

Phân đoạn có thể được mô tả như một dạng chuyển mạch ngân hàng mà kiến trúc bộ
xử lý đã biết! Nó hoạt động bằng cách cung cấp một bus địa chỉ bên ngoài lớn nhưng duy trì
các thanh ghi và con trỏ địa chỉ nhỏ hơn trong kiến trúc 8 bit ban đầu. Để thu hẹp khoảng cách,
bộ nhớ được phân đoạn bên trong thành các khối nhỏ hơn phù hợp với địa chỉ bên trong và các
thanh ghi bổ sung được gọi là thanh ghi phân đoạn được sử dụng để giữ dữ liệu địa chỉ bổ
sung cần thiết để hoàn thành địa chỉ bên ngoài lớn hơn. Có lẽ cách triển khai nổi tiếng nhất là
kiến trúc Intel 8086.

Bộ nhớ ảo

Với việc định địa chỉ tuyến tính lớn được cung cấp bởi các bộ vi xử lý 32 bit ngày nay,
việc tạo các ứng dụng phần mềm lớn sử dụng rất nhiều bộ nhớ là tương đối dễ dàng. Mặc dù
có thể khả thi khi cài đặt 64 Mbyte RAM trong một máy trạm, nhưng chi phí rất đắt so với 64
Mbyte của một đĩa cứng. Khi nhu cầu bộ nhớ tăng lên, sự khác biệt này tăng lên. Một giải pháp
là sử dụng đĩa lưu trữ làm phương tiện lưu trữ chính, chia chương trình đã lưu trữ thành các
khối nhỏ và chỉ giữ lại các khối trong bộ nhớ hệ thống xử lý cần thiết. Kỹ thuật này được gọi là
bộ nhớ ảo và dựa vào sự hiện diện trong hệ thống của một đơn vị quản lý bộ nhớ.

Khi chương trình thực thi, MMU có thể theo dõi cách chương trình sử dụng các khối và
hoán đổi chúng đến và từ đĩa nếu cần. Nếu một khối không có trong bộ nhớ, điều này gây ra lỗi
trang và buộc một số xử lý ngoại lệ thực hiện thao tác hoán đổi. Bằng cách này, hệ thống
dường như có một lượng lớn RAM hệ thống trong khi thực tế thì không. Kỹ thuật bộ nhớ ảo này
thường được sử dụng trong các máy trạm và trong hệ điều hành UNIX. Sự hấp dẫn của nó
trong các hệ thống nhúng bị hạn chế vì khả năng chậm truy cập bộ nhớ có thể xảy ra nếu một
khối được hoán đổi sang đĩa.
Sử dụng bộ nhớ ảo để hỗ trợ các ứng dụng lớn

Chọn hệ điều hành

So sánh một hệ điều hành từ 10 năm trước với một hệ điều hành được cung cấp ngày
nay cho thấy công nghệ hệ điều hành đã phát triển như thế nào trong những năm qua. Mặc dù
các chức năng cơ bản được cung cấp bởi hệ điều hành cũ và mới hơn - tất cả đều cung cấp
khả năng đa nhiệm, phản hồi thời gian thực, v.v. - vẫn còn tồn tại, nhưng đã có một số thay đổi
cơ bản trong việc cải thiện tính dễ sử dụng, hiệu suất và cơ sở gỡ lỗi . So sánh một chiếc xe
hơi ngày nay với một chiếc xe từ những năm 1920 là một sự tương đồng tốt.

Các cơ chế và nguyên lý cơ bản hầu như không thay đổi - đó là động cơ, hộp số,
phanh, truyền động - nhưng đã có sự cải tiến lớn về tính dễ lái, sự thoải mái và tiện nghi. Điều
này tương tự như những gì đã xảy ra với hệ điều hành. Các cơ chế cơ bản của chuyển mạch
ngữ cảnh, khối điều khiển tác vụ, danh sách liên kết, v.v. là những nguyên tắc cơ bản cơ bản
của bất kỳ hệ điều hành hoặc hạt nhân nào.

Do đó, có thể khá khó khăn để chọn một hệ điều hành. Để đưa ra lựa chọn như vậy,
cần phải hiểu những cách khác nhau mà hệ điều hành đã phát triển trong những năm qua và
những ưu điểm mà điều này mang lại. Phần còn lại của chương này thảo luận về những thay
đổi này và có thể giúp hình thành các tiêu chí có thể được sử dụng để đưa ra quyết định.

Assembler so với ngôn ngữ cấp cao

Vào đầu những năm 1980, các hệ điều hành được phát triển để đáp ứng với các hệ
điều hành của máy tính mini, nơi tập trung vào việc cung cấp các tiện nghi và hiệu suất do các
máy tính mini cung cấp. Để đạt được hiệu suất, chúng thường được viết bằng trình hợp dịch
hơn là bằng ngôn ngữ cấp cao như C hoặc PASCAL. Lý do cho điều này đơn giản là do hiệu
suất: công nghệ trình biên dịch không đủ tiên tiến để cung cấp mã nhỏ gọn và nhanh chóng cần
thiết để chạy một hệ điều hành. Ví dụ, nhiều trình biên dịch từ đầu những năm 1980 đã không
sử dụng tất cả các thanh ghi địa chỉ và dữ liệu M68000 và chỉ giới hạn ở một hoặc hai. Kết quả
là mã cực kỳ kém hiệu quả khi so sánh với trình hợp dịch mã hóa thủ công sử dụng tất cả các
thanh ghi của bộ xử lý. Điểm bất lợi là mã trình hợp dịch khó viết và khó bảo trì hơn so với ngôn
ngữ cấp cao và cực kỳ khó di chuyển sang các kiến trúc khác. Ngoài ra, giao diện giữa hệ điều
hành và một ngôn ngữ cấp cao không được phát triển tốt và trong một số trường hợp không
tồn tại! Viết thư viện giao diện được coi là một phần của nhiệm vụ phần mềm. Khi cả hiệu suất
bộ xử lý và công nghệ trình biên dịch đều được cải thiện, việc cung cấp một hệ điều hành được
viết bằng ngôn ngữ cấp cao như C trở nên khả thi, cung cấp sự tích hợp liền mạch giữa giao
diện hệ điều hành và ngôn ngữ phát triển ứng dụng.

Việc lựa chọn sử dụng trình hợp dịch hoặc một ngôn ngữ cấp cao với một số trình hợp
dịch so với việc sử dụng một hệ điều hành tích hợp và ngôn ngữ cấp cao là khá rõ ràng. Những
gì có thể chấp nhận được một vài năm trước đây không còn nữa và các hệ điều hành thành
công ngày nay được tích hợp rất nhiều với công nghệ trình biên dịch của chúng.

Mã có thể ROM

Với các hệ điều hành ban đầu, những hạn chế trong quá trình phát triển mã thường
ngăn hệ điều hành và trình biên dịch tạo ra mã có thể được đưa vào bộ nhớ chỉ đọc cho một
ứng dụng nhúng. Các lý do thường là lịch sử hơn là kỹ thuật, mặc dù lập luận rằng hầu hết các
ứng dụng quá lớn để phù hợp với kích thước tương đối nhỏ của EPROM sẵn có chắc chắn đã
đúng trong nhiều năm. Ngày nay, hầu hết người dùng tuyên bố yêu cầu này là bắt buộc và nó
là yêu cầu tiêu chuẩn từ các trình biên dịch cũng như các nhà cung cấp hệ điều hành.

Lập lịch thuật toán

Một lĩnh vực tranh luận liên tục là các thuật toán lập lịch được sử dụng để chọn nhiệm
vụ sẽ thực hiện tiếp theo. Có một số cách tiếp cận khác nhau có thể được sử dụng. Đầu tiên là
chỉ chuyển đổi nhiệm vụ khi kết thúc một lát thời gian. Điều này cho phép phân phối công bằng
hơn sức mạnh xử lý trên một số lượng lớn các tác vụ nhưng phải trả giá bằng thời gian phản
hồi. Một cách khác là thực hiện cách tiếp cận đầu tiên nhưng cho phép các sự kiện nhất định
buộc chuyển đổi một nhiệm vụ ngay cả khi nhiệm vụ hiện tại chưa sử dụng hết phần thời gian
được phân bổ của nó. Điều này cho phép các ngắt bên ngoài nhận được phản hồi nhanh hơn.
Một sự kiện khác có thể được sử dụng để ngắt tác vụ là một cuộc gọi hệ điều hành. Những
người khác đã triển khai các hệ thống ưu tiên trong đó mức độ ưu tiên và trạng thái của nhiệm
vụ trong danh sách sẵn sàng có thể được thay đổi bởi chính nó, hệ điều hành hoặc thậm chí
bởi các tác vụ khác. Những người khác có một hệ thống ưu tiên cố định trong đó mức độ được
cố định khi nhiệm vụ được tạo.
Một số hệ điều hành thậm chí còn cho phép các thuật toán lập lịch trình khác nhau được
thực hiện để một nhà thiết kế có thể thay đổi chúng để đưa ra một phản ứng cụ thể. Thay đổi
các thuật toán, v.v. thường là dấu hiệu của việc cố gắng vắt kiệt hiệu suất cuối cùng của hệ
thống và trong những trường hợp như vậy, tốt hơn là sử dụng bộ xử lý nhanh hơn, hoặc thậm
chí trong trường hợp cực đoan thực sự chấp nhận rằng hệ điều hành không thể đáp ứng hiệu
suất cần thiết và sử dụng cái khác.

Lên lịch trước

Một yêu cầu nhất quán đã xuất hiện là lập lịch trước. Điều này đề cập đến một thuật
toán lập lịch cụ thể trong đó tác vụ có mức độ ưu tiên cao nhất sẽ làm gián đoạn hoặc đánh dấu
trước một tác vụ hiện đang thực thi bất kể nó đã sử dụng lát thời gian được phân bổ hay chưa
và sẽ tiếp tục chạy cho đến khi tác vụ cấp cao hơn đã sẵn sàng. Điều này mang lại phản ứng
tốt nhất cho các sự cố và gián đoạn nhưng có thể hơi nguy hiểm. Nếu một nhiệm vụ được đưa
ra mức độ ưu tiên cao nhất và không tự hạ thấp mức độ ưu tiên của nó hoặc tính trước thì các
tác vụ khác sẽ không có cơ hội để thực thi. Do đó, khả năng làm trước thường bị hạn chế đối
với các nhiệm vụ đặc biệt với các quy trình thời gian quan trọng.

Phương pháp mô-đun

Ý tưởng sử dụng lại mã bất cứ khi nào có thể không phải là một ý tưởng mới nhưng có
thể khó thực hiện. Các ứng cử viên hiển nhiên với hệ điều hành là trình điều khiển thiết bị cho
vào ra và hạt nhân cho các bộ xử lý khác nhau. Điều quan trọng là xác định một giao diện tiêu
chuẩn cho phép các mô-đun đó được sử dụng lại mà không cần phải thay đổi hoặc thay đổi
mã. Điều này có nghĩa là bản đồ bộ nhớ không được cố định hoặc các giả định do trình điều
khiển hoặc hệ điều hành thực hiện. Một trong những vấn đề với các phiên bản đầu tiên của
nhiều hệ điều hành là thực tế là phải đến khá muộn trong quá trình phát triển của chúng,
phương pháp tiếp cận mô-đun cho trình điều khiển thiết bị mới có sẵn. Do đó, bản phát hành
tiêu chuẩn bao gồm một số trình điều khiển cho cùng một chip ngoại vi, tùy thuộc vào bo mạch
VMEbus mà nó được đặt.

Ngày nay, cách tiếp cận này không còn được chấp nhận và các hệ điều hành có nhiều
mô đun hơn trong cách tiếp cận và thiết kế của chúng. Ưu điểm cho người dùng là mã nhỏ gọn
hơn, thời gian phát triển ngắn hơn và khả năng tái sử dụng mã. Một trình điều khiển đặc biệt có
thể được sử dụng lại mà không cần sửa đổi. Điều này cùng với nhu cầu cập nhật số lượng bo
mạch cần có cổng tiêu chuẩn đã dẫn đến sự phát triển của các hệ thống xây dựng tự động có
thể sử dụng trình điều khiển mô-đun và tạo phiên bản mới cực kỳ nhanh chóng.

Mã đăng ký lại

Điều này tiếp tục từ chủ đề trước nhưng có một điểm khác biệt cơ bản ở chỗ một mô-
đun phần mềm đăng nhập lại có thể được chia sẻ nhiều tác vụ và cũng bị gián đoạn tại bất kỳ
thời điểm nào và được sử dụng lại mà không gặp bất kỳ vấn đề gì. Ví dụ, hãy xem xét mô-đun
A được chia sẻ bởi hai nhiệm vụ B và C. Nếu nhiệm vụ B sử dụng mô-đun A và thoát khỏi nó,
mô-đun sẽ được để ở trạng thái đã biết, sẵn sàng cho một tác vụ khác sử dụng nó. Nếu nhiệm
vụ C bắt đầu sử dụng nó và ở giữa quá trình thực hiện của nó được chuyển sang có lợi cho
nhiệm vụ B, thì vấn đề có thể xuất hiện. Nếu nhiệm vụ B bắt đầu sử dụng mô-đun A, nó có thể
gặp sự cố vì A sẽ ở trạng thái không xác định. Ngay cả khi nó không, các vấn đề khác vẫn có
thể rình rập. Nếu mô-đun A sử dụng các biến toàn cục, thì nhiệm vụ B sẽ khiến chúng được đặt
lại. Khi nhiệm vụ C quay trở lại để tiếp tục thực hiện, dữ liệu toàn cục của nó sẽ bị hủy.

Một mô-đun đăng nhập lại có thể chịu được những gián đoạn như vậy mà không gặp
phải các loại sự cố này. Quy tắc vàng dành cho mô-đun chỉ truy cập dữ liệu được liên kết với
tác vụ đang sử dụng mã mô-đun. Các biến được lưu trữ trên ngăn xếp, trong thanh ghi hoặc
trong vùng bộ nhớ dành riêng cho nhiệm vụ chứ không phải mô-đun. Nếu các mô-đun được
chia sẻ không được tham gia lại, cần phải cẩn thận để đảm bảo rằng một chuyển đổi ngữ cảnh
không xảy ra trong quá trình thực thi của nó. Điều này có thể có nghĩa là vô hiệu hóa hoặc khóa
người lên lịch hoặc người điều phối. Nền tảng phát triển chéo

Ngày nay, hầu hết việc phát triển phần mềm được thực hiện trên các nền tảng phát triển
chéo như máy trạm Sun, hệ thống UNIX và PC IBM. Điều này trái ngược trực tiếp với các hệ
thống ban đầu vốn yêu cầu một hệ thống phát triển phần mềm chuyên dụng. Mức độ hỗ trợ nền
tảng và sự sẵn có của các công cụ phát triển tốt vượt ra ngoài tiêu chuẩn gỡ lỗi cấp độ tượng
trưng đã trở thành một điểm bán sản phẩm chính.

Mạng tích hợp

Đây là một lĩnh vực khác đang trở nên cực kỳ quan trọng. Khả năng sử dụng mạng như
TCP / IP trên Ethernet để điều khiển các bo mạch mục tiêu, tải xuống mã và lấy thông tin gỡ lỗi
nhanh chóng trở thành một yêu cầu bắt buộc. Nó đang nhanh chóng thay thế phương pháp
truyền thống hơn là sử dụng các liên kết RS232 nối tiếp để đạt được cùng một đầu.

Hỗ trợ đa xử lý

Đây là một lĩnh vực khác đã thay đổi đáng kể. Mười năm trước, có thể sử dụng nhiều bộ
xử lý với điều kiện là nhà phát triển đã thiết kế và mã hóa tất cả các giao tiếp giữa các bộ xử lý.
Giờ đây, nhiều hệ điều hành ngày nay có thể cung cấp các mô-đun tùy chọn sẽ tự động thực
hiện việc này. Tuy nhiên, các kỹ thuật đa xử lý thường bị hiểu lầm và vì đây là một chủ đề lớn
đối với cả các nhà phát triển phần cứng và phần mềm, nên phần sau của văn bản này sẽ được
đề cập sâu hơn.

You might also like