9. Other available methods for kernel configuration include: # make config
4.2.5 Gở rối và mụ phỏng
Mụ phỏng và gở rối là hai cụng cụ thường được dựng để thử nghiệm cỏc đoạn phần mềm quan trọng và khi kết hợp để thử nghiệm cả hai: phần cứng và phần mềm, vớ dụ TĐKTB. Núi chung cỏc đoạn mó phần mềm như vậy cú ảnh hưởng lớn tới hoạt động hệ thống, đặc biệt khi liờn quan tới thời gian thực.
Đ Với phần mềm từ ngụn ngữ cấp cao, cú thể chạy kiểm tra cả một phần lớn code mà khụng cần cú phần cứng, thậm chớ cỏc code khụng liờn quan tới I/O hay cỏc tiện ớch hệ thống (của HĐH), cú thể chạy thử trờn một mỏy khỏc (PC chẳn hạn). Cỏch làm này cho phộp phỏt triển song song đồng thời cả phần cứng và phần mềm, mà khi hợp nhất đảm bảo hệ sẽ làm việc. Đối với cỏc dữ liệu cho mụ phỏng cú thể nhận từ bàn phớm hay tạo ra cỏc bảng dữ liệu để chạy thử cỏc xử lớ, mà khụng cần cú cỏc hoạt động I/O thật sự. Tuy nhiờn hạn chế của phương phỏp này là ở chổ mụ phỏng là sẽ chạy và dựng thư viện của HĐH trờn mỏy thử chứ khụng phải trờn mụi trường của hệ đớch. Cũn nếu thư viện sử dụng là một phần của code sẽ chạy trờn mỏy đớch, thỡ việc sử code thư viện là cần thiết. Lớ tưởng nhất là HĐH mỏy chạy mụ phỏng giống như HĐH HTN đớch, vớ dụ dựng PC cài Linux chạy mụ phỏng cho HTN sẽ chạy Linux. Hiện nay rất nhiều HTN sử dụng HĐH đớch cú nguồn gốc từ
258
UNIX/Linux (Android (cho rất nhiều thiết bị nhỳng), Ubuntu, bada,,Firefox OS (project name: Boot to Gecko), Openmoko Linux, OPhone, MeeGo (from merger of Maemo &
Moblin), Mobilinux, MotoMagx, Qt Extended, Sailfish OS, Tizen (earlier called LiMo Platform), webOS, ipodlinux, Apple IOS, BusyBox (tập hợp cỏc tiện ớch của UNIX thu nhỏ), hay Microsoft Windows (Windows Embedded CE, Windows Phone OS), cho cỏc HTN.
Đ Mụ phỏng mức thấp cú cỏc cụng cụ để chạy mụ phỏng hoạt động của CPU, bộ nhớ và một số thiết bị ngoại vi đớch, chạy băng ngụn ngữ mỏy (hợp ngữ). cỏc mụ phỏng này liờn quan tới mụ hỡnh chương trỡnh di với mụ hỡnh bộ nhớ với khả năng gỡ rối. cỏch mụ phỏng cấp thấp này thường khụng cho cỏc thực thi liờn quan tới định thời, tức cỏc code cú rang buộc thời gian (cho hệ thời gian thực). Tuy nhiờn đõy là phương phỏp thiết kế ớt tốn kộm khi cú cỏc dự ỏm HTN lớn và phức tạp.
Đ Gỡ rối trờn bo mạch, là cỏch gỡ rối trực tiếp trờn phần cứng THN đớch. Cỏc nhà sản xuất luụn cài sẳn trong EPROM chương trỡnh gừa rối (Debuger), hay một tập cỏc khối thực thi (routine) cú thể hợp nhất vào cỏc ứng dụng (tương lai). Cỏc cụng cụ như vậy tạo điều kiện thử nghiệm hệ thống rất nhanh và chuẩn xỏc. Cỏc đoạn coe này thường cú:
Đ Khởi động CPU và cỏc Chip khả trỡnh trờn bo mạch vào trạng thỏi ban đầu, hay chạy ở chế độ chờ với dấu nhắc (prompt) trờn màn hỡnh;
Đ Người phỏt triển chạy Debuger, truy nhập vào cỏc phần cứng qua lập trỡnh đơn giản với cỏc chức năng cú sẳn, hay đoạn code nối với cổng truyền thụng (COM port) với hệ phỏt triển đẻ tải xuống cỏc phần mềm (HĐH, ứng dụng nhỳng). Lần sau khi khởi động nguội bo mạch, CPU sẽ tỡm trong bảng vector ngắt vector RESET cú trong EPROM, khởi động bo, và chuyển điều khiển tử EPROM sang code trong RAM. Lưu ý là EPROM phải nằm ở vung địa chỉ phự hợp với địa chỉ đầu tiờn sau khi RESET. Debuger cho phộp truy nhập, theo dừi, thay đổi giỏ trị cỏc thanh ghi của CPU, rất tiện cho gỡ rối code. Cỏc giỏ trị thường biểu diễn ở dạng số hệ 16 (hexadecimal). Để tiện cho gỡ rối, khi lập trỡnh cần tạo cỏc bảng kớ hiệu (symbol table, hay bảng cỏc biến) khi dịch hay khi link phần mềm, tạo khả năng tra chộo giữa cỏc nhón và tờn kớ hiệu qui chiếu vào địa chỉ vật lớ, từ đú theo dừi dễ dàng cỏc giỏ trị cần quan sỏt ứng với cỏc kớ hiệu đú. Cú thể theo dừi khi debug khi dựng với tệp hợp dịch ( listing file, là cỏc tệp cú phần mở rộng *.lst tạo ra sau khi dịch tệp hợp ngữ *.asm) thỡ rất dễ theo dừi. Debug mức thấp mang lại kết quả tin cậy về hoạt động của hệ đớch, đặc biệt với cỏc HTN khú chạy theo cỏch mụ phỏng, hay mụ phỏng khụng thực tế sỏt với hệ đớch.
Đ Gỡ rối ở mức tỏc vụ (task debug). Một số trường hợp gỡ rối mức thấp khụng nhiều hiệu quả tuy cú thể debug cả một khối lệnh (hay routine) khi chọn điểm dừng (break point) code rồi quan sỏt kết quả. Thực tế cần debug cho cả cỏc task và cỏch này cần debug ở mức độ HĐH, bởi cỏc task khi chạy phụ thuộc nhiều vào bối cảnh thực thi code, nờn điểm dừng chỉ cú thể đặt qua (ở) cỏc thụng điệp, cỏc sự kiện xuất hiện/kết thỳc, cỏc xử lớ ngắt (bắt
259
đầu/kết thỳc). Xử lớ sự kiện cú thể dựng cỏch lọc (bỏ/chấp nhận), ghi lại (trace) kết quả thực thi cỏc thụng tin về thời gian, suwrb dụng bộ nhớ, trạng thỏi tỏc vụ, giỏ trị cỏc thanh ghi CPU để phỏn đoỏn, đỏnh giỏ cỏc kết quả.
Đ Gỡ rối kớ hiệu (symbolic debug): Khi gỡ rối bằng ngụn ngữ bậc cao, như C, thay vỡ dựng
tệp hợp dịch để xỏc định địa chi điểm dừng, gỡ rối tượng trưng cho phộp dừng ở dũng lệnh hay tại tờn của hàm. Cỏch tương tỏc như vậy hiệu quả hơn so với khi dựng hợp ngữ. Lớ do sử dụng phương phỏp này đú là cỏch mà gỡ rối tượng trung làm việc: cú thể coi đõy là kiểu đầu cuối của gỡ rối hợp ngữ khi phần mềm gỡ rối tra cứu (look-up) và chuyển đổi giữa cấu trỳc của ngụn ngữ bậc cao và cỏch tớnh địa chỉ, nội dung của hợp ngữ. Chỡa khúa của cỏch này là tạo ra bảng cỏc kớ hiệu (symbol) cú khả năng cung cấp cỏc thụng tin tra chộo (look- up) mà gỡ rối cần đến. Một tệp dạng nhị phõn liờn quan tới object và tệp chứa địa chỉ tuyệt đối được ra, hoặc 2 tệp tỏch biệt. Khi gỡ rối kớch hoạt tệp này. Nú sẽ tỡm cỏc thụng tin kớ tự để hiển thi cỏc thụng tin cú nhiều ý nghĩa, và điểm dừng chương trỡnh cú thể đặt ở cỏc cõu lệnh cũng như địa chỉ cụ thể. Núi cỏch khỏc cú thể gỡ rối theo giỏi code (trace) qua từng dũng lệnh, hay từng lệnh CPU. Cú chỳt vấn đề xảy ra là: bảng kớ hiệu sẽ lớn, cần nhiều bộ nhớ, kớch thước tệp cũng lớn theo. Điều này sẽ rắc rối khi xõy dựng ừn dụng cho một HĐH mới. Lỗi sẽ xuất hiện khi link là ‘bảng kớ hiệu bị tràn (symbol table overflow error). Cú thể xử lớ bằng cỏch chặn (dừng) gỡ rối kớ hiệu hay cấp thờm bộ nhúe cho trỡnh liờn kết (linker). Cú thể cũn cú nhiều mẹo hơn khi gỡ rối !
Đ Tối ưu code: tối ưu code cú thể thực hiện vào lỳc biờn dịch mó nguồn với tựy chọn đặt với thụng số tối ưu ở dũng lệnh. Khi dịch chương trỡnh dịch sẽ kiểm tra code, thay đổi (code, trỡnh tự gọi code …) để tăng hiệu quả thực thi mà khụng làm thay đụỉ tư duy logic của chương trỡnh. Cú nhiều cỏch, tuy nhiờn cú hai cỏch phổ biến sau đõy: gỡ bỏ hay thờm hay thay đổi code. Chương trỡnh dịch cú thể boỏ ài biến, hay cỏc đoạn code thực thi (routine) khụng bao giờ sử dụng hay trả lại bất kỡ hàm chức năng nào. Cỏc vũng lặp cũng cần tối ưu để bỏ đi cỏc trễ rẻ nhỏnh (ở cỏc chương trỡnh lớn). Đoạn code thực thi dấu phẩy động cú thể thay vào bằng cỏc dũng lệnh dấu phẩy động trực tiếp. kết quử cuối cựng cú thể khỏc so với tệp *.lst trước đú, tương tự bảng cỏc kớ hiệu (symbol table) cũng cú thay đổi khụng như hoài vọng từ mó nguồn. Tuy nhiờn cỏch tối ưu này cũng khụng hẳn là đạt yờu cầu, bởi như trỡnh bày, cú thể một vài biến bị loại trừ, vũng lặp hay hàm delay cú thể sẽ bị thay bằng NOP đơn giản. Hiệu quả thời gian thực thi cú thể nhanh, nhưng kết quả tớnh toỏn thỡ cần thẩm định ! Hóy thận trọng với cỏc đoạn code liờn quan tới I/O và liờn quan tới ỏnh xạ I/O vào bộ nhớ, tối ưu code cú thể xẩy ra lỗi ! Để chắc chắn và thẩm định lại code, hóy so sỏnh hai kết quả thể hiện ở cỏc tờp *.lst sau khi dịch cú tối ưu và khụng tối ưu !
Đ Xray (Soi tỡm lỗi kiểu chụp X quang): Gỡ rối phần mềm như mụ tả cú vẽ nhiều bước, tuy nhiờn cũng tồn tại phần mềm mang đặc điểm hợp nhất cho gỡ rối. Đú là phần mềm của cụng ty Microtec cú tờn Xray. Xray là tập cỏc cụng cụ hổ trợ gỡ rối hợp nhất của compiler, cụng cụ debuger liờn kết với emulator, hổ trợ gỡ rối tới mức tỏc vụ trờn bo mạch.
260
Xray structure:
261
262
Hỡnh 4.21 Liờn kết giữ hệ phỏt triển và hệ đớch đang được gở rối
Đ Hệ phỏt triển-HPT (development system): Một giải phỏp khỏc để phỏt triển phần mềm cho HTN là sử dụng HĐH đớch là cụng cụ phỏt triển ngay trờn bo mạch hay trờn một mỏy tớnh khỏc tương tự. Cỏch này là cỏch truyền thống trước khi cú cỏc PC giỏ rẻ kết hợp phần mềm dịch chộo (cross-compilation) hợp nhất trờn đú. Thuận lợi khi dựng HPT là code tạo ra chớnh là code cho hệ đớch, kể cả cỏc thư viện động, khụng cú thay đổi. Phần mềm đớch cú thể thử nghiệm trờn HPT trước khi tải xuống hệ đớch. HPT cú HĐH đầy đủ và cú sẳn cụng cụ gỡ rối mà cụng cụ này khụng cú trờn hệ đớch. Tuy nhiờn cũng cú vài điểm cần lưu ý:
Đ Chức năng dấu phẩy động và quản lớ bộ nhớ (Floating point and memory management). Hai thành phần này cú trờn HPT, nhưng hệ đớch khụng cú. Cú nghĩa là code tạo ra trờn HPT sẽ khụng chạy trờn hệ đớch, do đú cần viết lại cỏc code này và liờn kết vào code đớch. Ngược lại code mới này cú thể khụng chạy trờn HPT, lớ do là hệ mụ phỏng.
Đ Kỉ thuật mụ phỏng (Emulation): Một trong cỏc kỉ thuật mụ phỏng là In-circuit emulation (ICE) dựng để chạy mụ phỏng một CPU trong quỏ trinh thiết kế HTN. ICE cho ta một ‘cửa sổ” để tương tỏc với hệ đớch. Thụng thường phần mềm này sẽ nối vào đế cắm của CPU hệ đớch (bo khụng cú CPU!) qua một thiết bị hổ trợ (cổng JTAG-Joint Test Action Group hay BDM- Background Debug Mode), dựng phần mềm mụ phỏng CPU, lập trỡnh và chạy chương trỡnh. Hệ chủ cú thể là một mỏy Analyzer logic với nhiều đầu tớn hiệu để ghi nhớ cỏc giỏ trịn trờn BUS của CPU. Đõy là cụng cụ mạnh và khỏ đắt, nhưng rất hiệu quả để phỏt triển HTN. Ngoài ra cũn cú một thiết bị khỏc kết hợp với Analyzer logic với cỏc đầu cặp (probe) vào bất kỡ tớn hiệu nào trờn bo mạch để kiểm tra, gỡ rối, đú là OnCE (on-chip emulation).
(Đọc thờm cỏc thiết bị liờn quan !)