1.3.1.1. Vấn đề chung về thiết kế hệ nhúng
Thiết kế các hệ thống nhúng là thiết kế phần cứng và phần mềm phối hợp bao gồm những bước sau:
- Mô hình hoá hệ thống: Mô tả các khối chức năng với các đặc tính và thuật toán xử lý.
- Phân bố chức năng cho phần cứng và mềm (hardware (HW) – software (SW)).
- Đồng bộ hoạt động của hệ thống.
- Cài đặt các chức năng thiết kế vào phần cứng (hardware) và phần mềm (software) hoặc phần nhão (firm-ware).
Cách thiết kế cổ điển là các chức năng phần mềm (SW) và phần cứng (HW) được xác định trước rồi sau đó các bước thiết kế chi tiết được tiến hành một cách độc lập ở hai khối. Hiện nay đa số các hệ thống tự động hoá thiết kế (CAD) thường dành cho thiết kế phần cứng. Các hệ thống nhúng sử dụng đồng thời nhiều công nghệ như vi xử lý, DSP, mạng và các chuẩn phối ghép, protocol, do vậy xu thế thiết kế các hệ nhúng hiện nay đòi hỏi có khả năng thay đổi mềm dẻo hơn trong quá trình thiết kế hai phần HW và SW. Để có được thiết kế cuối cùng tối ưu quá trình thiết kế SW và HW phải phối hợp với nhau chặt chẽ và có thể thay đổi sau mỗi lần thử chức năng hoạt động tổng hợp.
Thiết kế các hệ nhúng đòi hỏi kiến thức đa ngành về điện tử, xử lý tín hiệu, vi xử lý, thuật điều khiển và lập trình thời gian thực.
Khi thiết kế hệ nhúng có một số vấn đề mà các nhà thiết kế hệ nhúng cần phải đặc biệt xem xét, đó là:
Độ tin cậy: Một hệ nhúng phải đảm bảo được tính tin cậy, nó không thể phá hủy và cũng không thểđược cập nhật.
Hiệu suất thực hiện và tiêu thụ năng lượng:
+ Hệ thời gian thực được sử dụng trong nhiều ứng dụng.
+ Sản phẩm có thể phải thực thi được trên nguồn năng lượng là pin + Giới hạn về mặt bộ nhớ và sự tiêu thụđiện năng.
Về mặt chi phí: Các sản phẩm phải đảm bảo được thị trường tiếp nhận và tiếp cận nhanh chóng với thị trường. Sản phẩm liên quan đến người tiêu dùng nên có tính cạnh tranh về mặt giá cả. Vì vậy chi phí sản xuất cần được coi trọng.
1.3.1.2. Nền tảng của hệ thống nhúng a) Bộ nhớ trong thiết bị nhúng
Hầu hết các thiết bị nhúng hiện tại sử dụng hai kiểu bộ nhớ, DRAM hoặc đôi khi là SRAM cho bộ nhớ chính và bộ nhớ Flash hoặc bộ nhớ ROM cho việc lưu trữ non-volatile như trình bày ở dưới. (Cần cả hai loại bộ nhớ volatile và non- volatile memory). [5]
• Bộ nhớ flash thường được sử dụng thay cho các ổđĩa vì:
o Tiêu hao ít điện năng hơn
o Nhỏ hơn
o Và độ tin cậy cao hơn.
• Lưu trữ hệđiều hành và các ứng dụng trong bộ nhớ Flash
Hệ điều hành và các chương trình ứng dụng thường được lưu trong flash, vì hầu hết các thiết bị nhúng không có ổđĩa cứng. Các ổđĩa cứng thường đòi hỏi cần có một không gian lớn hơn, và tiêu thụ nhiều điện năng hơn, vì vậy chúng không phải là một lựa chọn thích hợp cho nhiều thiết kế nhúng đặc biệt trong các cầm tay nhỏ và các thiết bịđiều khiển bằng pin.
• Khởi động từ bộ nhớ flash khi khởi động (bật nguồn)
• Flash rất chậm so với RAM: sao chép mã lệnh từ SRAM hoặc SDRAM để thực thi?
• Cần các công cụ phát triển phần mềm hỗ trợ việc lưu trữ và thực thi mã lệnh trong ROM.
b) Hệđiều hành cho hệ thống nhúng
Chúng ta cần phải có một hệ điều hành cho hệ thống nhúng là do thị trường của các sản phẩm nhúng tăng mạnh nên các nhà sản xuất ngày cần sử dụng các hệđiều hành nhúng để bảo đảm sản phẩm có sức cạnh tranh.
Mặt khác hầu hết các thiết bị có phần mềm phức tạp cần hệđiều hành để: • Hỗ trợ các tác vụđa nhiệm, lập lịch biểu và đồng bộ hóa các tác vụ. • Hỗ trợ cho một tập các thiết bị vào/ra.
• Hỗ trợ các hệ thống file. • Hỗ trợ cho hoạt động mạng
• Hỗ trợ việc quản lý bộ nhớ và bảo mật. • Hỗ trợ màn hình đồ họa…
Một hệ điều hành có thể cung cấp tất cả các đặc điểm trên để phát triển ứng dụng. Các nhà phát triển ứng dụng cần thực hiện nhiều vì họ có thể làm việc ở mức trừu tượng hóa cao bằng việc sử dụng các đặc điểm đã được hệ điều hành cung cấp.
Một vài thiết bị nhúng đơn giản có thể không cần đến hệđiều hành, nhưng các thiết bị mới phức tạp hơn cần thiết phải có một hệ điều hành riêng để có thể phát triển các mã lệnh mà hệ điều hành cung cấp. Hơn nữa chi phí cho hệ điều hành nhúng ít hơn chi phí của một hệđiều hành cho máy tính thông thường. Các hệ điều hành nhúng hiện nay trước tiên phải kể đến là Embedded Linux, hiện đang phát triển mạnh và chiếm vị trí số 1. Hiện nay 40% các nhà thiết kế các hệ nhúng cân nhắc đầu tiên sử dụng Embedded Linux cho các ứng dụng mới của mình và sau đó mới đến các hệđiều hành nhúng truyền thống nhu VxWorks, Win CE. Các đối thủ cạnh tranh của Embedded Linux hiện nay là các hệđiều hành nhúng tự tạo và Windows CE.
1.3.2. Phần mềm nhúng
Hiện nay phần lớn các phần mềm nhúng nằm trong các sản phẩm truyền thông và các sản phẩm điện tử tiêu dùng, tiếp đến là trong các sản phẩm ô tô, phương tiện vận chuyển, máy móc thiết bị y tế, các thiết bị năng lượng, các thiết bị cảnh báo bảo vệ và các sản phẩm đo và điều khiển. Phần mềm nhúng ngày càng có tỷ lệ giá trị cao trong giá trị của các sản phẩm nhúng.
Để có thể tồn tại và phát triển, các sản phẩm công nghiệp và tiêu dùng cần phải thường xuyên đổi mới và ngày càng có nhiều chức năng tiện dụng và thông minh hơn. Các chức năng này phần lớn do các chương trình nhúng tạo nên.
1.3.2.1. Vấn đề chung khi viết phần mềm nhúng
Có một số vấn đề cần lưu ý khi viết một phần mềm nhúng, khác với viết các phần mềm ứng dụng:
• Thông lượng (Throughput): Hệ thống có thể cần phải xử lý rất nhiều dữ liệu trong một khoảng thời gian ngắn.
• Đáp ứng (Respond): Hệ thống có thể cần phải tác động trở lại với các sự kiện một cách nhanh chóng.
• Kiểm thử (Testability): Việc đưa ra thiết bị để kiểm thử phần mềm nhúng có thể rất khó khăn.
• Gỡ rối (Debugability): Các hệ thống nhúng có thể không có màn hình hay bàn phím, nên việc tìm ra những lỗi của phần mềm đang thực hiện là một vấn đề khó khăn.
• Độ tin cậy (Realiability): Các hệ thống nhúng phải có khả năng xử lý bất kỳ các tình huống mà không có sự can thiệp của con người. Cụ thể, trong các tình huống khó xử, phần mềm ứng dụng có thể đưa ra một thông báo và yêu cầu người sử dụng thực hiện một số công việc nào đó, nhưng các hệ thống nhúng không thể có sự lựa chọn đó, phần mềm phải có khả năng xử lý mà không có sự can thiệp của con người.
• Không gian bộ nhớ (Memory Space): Bộ nhớ bị giới hạn trong các hệ thống nhúng, và thường bị chia sẻ thành hai phần – một phần dùng để lưu trữ chương trình, một phần dùng để lưu trữ dữ liệu. Không giống như các ứng dụng cho destop, các chương trình và dữ liệu được lưu trữ trong cung bộ nhớ, các hệ thống nhúng sử dụng các bộ nhớ khác nhau cho các mục đích. Vì một hệ thống nhúng điển hình không có ổđĩa để nạp các chương trình từ đó, các chương trình cần phải được lưu trữ trong bộ nhớ, thậm chí cả khi nguồn nuôi tắt. Như vậy hệ thống nhúng cần phải có kiểu bộ nhớđặc biệt để ghi nhận chương trình ngay cả khi không có nguồn nuôi. Tuy nhiên, kiểu bộ nhớ đặc biệt này lại không phù hợp để lưu trữ dữ liệu, do đó các hệ thống nhúng cần phải có bộ
nhớ thông thường để lưu trữ dữ liệu. Như vậy chúng ta phải làm sao cho phần mềm và dữ liệu khớp với các bộ nhớđang có.
• Cài đặt chương trình (Program Installation): Cần phải có các công cụ đặc biệt đểđưa phần mềm vào trong các hệ thống nhúng.
• Sự tiêu hao năng lượng (Power Consumption): Các hệ thống xách tay thường phải chạy bằng pin hoặc ắcquy và phần mềm trong các hệ thống này nên tiết kiệm năng lượng.
• Processor Hogs: Việc tính toán yêu cầu lượng lớn thời gian CPU có thể làm phức tạp vấn đềđáp ứng.
• Chi phí (Cost): Việc giảm chi phí phần cứng là mối quan tâm trong nhiều dự án xây dựng hệ thống nhúng. Các hệ thống nhúng phải đảm bảo là có chi phí sản xuất bé nhất, đáp ứng nhanh nhất yêu cầu thị trường, không có cơ hội chỉnh sửa trong tương lai.
1.3.2.2. Các kiến trúc phần mềm hệ thống nhúng
Một số loại kiến trúc phần mềm thông dụng trong các hệ thống nhúng như sau:
Vòng lặp kiểm soát đơn giản
Theo thiết kế này, phần mềm được tổ chức thành một vòng lặp đơn giản. Vòng lặp gọi đến các chương trình con, mỗi chương trình con quản lý một phần của hệ thống phần cứng hoặc phần mềm.
Hệ thống ngắt điều khiển
Các hệ thống nhúng thường được điểu khiển bằng các ngắt. Có nghĩa là các tác vụ của hệ thống nhúng được kích hoạt bởi các loại sự kiện khác nhau. Ví dụ, một ngắt có thể được sinh ra bởi một bộ định thời sau một chu kỳđược định nghĩa trước, hoặc bởi sự kiện khi cổng nối tiếp nhận được một byte nào đó.
Loại kiến trúc này thường được sử dụng trong các hệ thống có bộ quản lý sự kiện đơn giản, ngắn gọn và cần độ trễ thấp. Hệ thống này thường thực hiện một tác vụ đơn giản trong một vòng lặp chính. Đôi khi, các tác vụ phức tạp hơn
sẽ được thêm vào một cấu trúc hàng đợi trong bộ quản lý ngắt đểđược vòng lặp xử lý sau đó. Lúc này, hệ thống gần giống với kiểu nhân đa nhiệm với các tiến trình rời rạc.
Đa nhiệm tương tác
Một hệ thống đa nhiệm không ưu tiên cũng gần giống với kỹ thuật vòng lặp kiểm soát đơn giản ngoại trừ việc vòng lặp này được ẩn giấu thông qua một giao diện lập trình API. Các nhà lập trình định nghĩa một loạt các nhiệm vụ, mỗi nhiệm vụ chạy trong một môi trường riêng của nó. Khi không cần thực hiện nhiệm vụ đó thì nó gọi đến các tiến trình con tạm nghỉ (bằng cách gọi “pause”, “wait”, “yeild”…).
Ưu điểm và nhược điểm của loại kiến trúc này cũng giống với kiểm vòng lặp kiểm soát đơn giản. Tuy nhiên, việc thêm một phần mềm mới được thực hiện dễ dàng hơn bằng cách lập trình một tác vụ mới hoặc thêm vào hàng đợi thông dịch (queue-interpreter).
Đa nhiệm ưu tiên
Ở loại kiến trúc này, hệ thống thường có một đoạn mã ở mức thấp thực hiện việc chuyển đổi giữa các tác vụ khác nhau thông qua một bộđịnh thời. Đoạn mã này thường nằm ở mức mà hệ thống được coi là có một hệ điều hành và vì thế cũng gặp phải tất cả những phức tạp trong việc quản lý đa nhiệm.
Bất kỳ tác vụ nào có thể phá hủy dữ liệu của một tác vụ khác đều cần phải được tách biệt một cách chính xác. Việc truy cập tới các dữ liệu chia sẻ có thể được quản lý bằng một số kỹ thuật đồng bộ hóa như hàng đợi thông điệp (message queues), semaphores,… Vì những phức tạp nói trên nên một giải pháp thường được đưa ra đó là sử dụng một hệ điều hành thời gian thực. Lúc đó, các nhà lập trình có thể tập trung vào việc phát triển các chức năng của thiết bị chứ không cần quan tâm đến các dịch vụ của hệđiều hành nữa.
Vi nhân (Microkernel) và nhân ngoại (Exokernel)
Khái niệm vi nhân (microkernel) là một bước tiếp cận gần hơn tới khái niệm hệđiều hành thời gian thực. Lúc này, nhân hệ điều hành thực hiện việc cấp phát bộ nhớ và chuyển CPU cho các luồng thực thi. Còn các tiến trình người dùng sử dụng các chức năng chính như hệ thống file, giao diện mạng lưới,… Nói chung, kiến trúc này thường được áp dụng trong các hệ thống mà việc chuyển đổi và giao tiếp giữa các tác vụ là nhanh.
Còn nhân ngoại (exokernel) tiến hành giao tiếp hiệu quả bằng cách sử dụng các lời gọi chương trình con thông thường. Phần cứng và toàn bộ phần mềm trong hệ thống luôn đáp ứng và có thểđược mở rộng bởi các ứng dụng.
Nhân khối (monolithic kernels)
Trong kiến trúc này, một nhân đầy đủ với các khả năng phức tạp được chuyển đổi để phù hợp với môi trường nhúng. Điều này giúp các nhà lập trình có được một môi trường giống với hệ điều hành trong các máy để bàn như Linux hay Microsoft Windows và vì thế rất thuận lợi cho việc phát triển. Tuy nhiên, nó lại đòi hỏi đáng kể các tài nguyên phần cứng làm tăng chi phí của hệ thống. Một số loại nhân khối thông dụng là Embedded Linux và Windows CE. Mặc dù chi phí phần cứng tăng lên nhưng loại hệ thống nhúng này đang tăng trưởng rất mạnh, đặc biệt là trong các thiết bị nhúng mạnh như Wireless router hoặc hệ thống định vị GPS. Lý do của điều này là:
• Hệ thống này có cổng để kết nối đến các chip nhúng thông dụng
• Hệ thống cho phép sử dụng lại các đoạn mã sẵn có phổ biến như các trình điều khiển thiết bị, Web Servers, Firewalls, …
• Việc phát triển hệ thống có thểđược tiến hành với một tập nhiều loại đặc tính, chức năng còn sau đó lúc phân phối sản phẩm, hệ thống có thểđược cấu hình để loại bỏ một số chức năng không cần thiết. Điều này giúp tiết kiệm được những vùng nhớ mà các chức năng đó chiếm giữ.
• Hệ thống có chếđộ người dùng để dễ dàng chạy các ứng dụng và gỡ rối. Nhờ đó, qui trình phát triển được thực hiện dễ dàng hơn và việc lập trình có tính linh động hơn.
• Có nhiều hệ thống nhúng thiếu các yêu cầu chặt chẽ về tính thời gian thực của hệ thống quản lý. Còn một hệ thống như Embedded Linux có tốc độ đủ nhanh để trả lời cho nhiều ứng dụng. Các chức năng cần đến sự phản ứng nhanh cũng có thểđược đặt vào phần cứng.
Vấn đềđặt ra: Chọn kiến trúc phần mềm nào?
Một sốđề nghị cho việc chọn kiến trúc phần mềm:
- Chọn kiến trúc đơn giản nhất đáp ứng được yêu cầu. Việc viết phần mềm cho hệ thống nhúng cũng đủ phức tạp cho nên không chọn một kiến trúc phức tạp mà không cần thiết (viết phần mềm cho hệ nhúng đòi hỏi phải có một kiến thức nhất định về phần cứng, không giống như viết các ứng dụng cho desktop) - Nếu hệ thống của chúng ta phải đáp ứng các yêu cầu mà có thể đòi hỏi phải sử dụng một hệ điều hành thời gian thực, chúng ta nên thiên về việc sử dụng một hệđiều hành thời gian thực - Có thể tạo ra một kiến trúc lai giữa các kiến trúc trên. Ví dụ, nếu ta sử dụng một hệ thống thời gian thực, có thể có một tác vụ ưu tiên mức thấp thăm dò các phần của phần cứng không cần thiết phải đáp ứng nhanh. Tương tự, trong kiến trúc Round-Robin-with-Interrupts, vòng lặp chính có thể thăm dò các phần chậm hơn của phần cứng một cách trực tiếp hơn so với việc đọc các cờ thiết lập bởi các chu trình ngắt.
Trong bài toán điều khiển môi trường nhà kính, kiến trúc phần mềm được chọn cho vi điều khiển là vòng lặp kiểm soát đơn giản và hệ thống ngắt điều khiển.
1.3.3. Các công cụ phát triển phần mềm nhúng
Các lập trình viên ứng dụng điển hình thực hiện công việc của họ trên cùng một kiểu máy tính trên đó ứng dụng sẽ chạy. Ví dụ như một người viết một