Gỡ lỗi là một phần không thể thiếu khi phát triển phần mềm, đặc biệt là phần mềm nhúng. Việc gỡ lỗi cẩn thận, chi tiết giúp cho phát hiện những lỗi chương trình mà người viết nhiều khi không lường hết được, điều đó giúp cho chương trình có độ ổn định và tin cậy cao. Ngoài việc kiểm tra tính đúng đắn của thuật toán hay các kết quả nhận được sau khi xử lý dữ liệu nào đó, gỡ lỗi còn cho phép biết cụ thể sự làm việc giữa chương trình với thành phần chấp hành tại từng tình huống cụ thể. Điều đó cho phép người viết chương trình biết đoạn chương trình đó có đúng theo thiết kế hay không.
Có ba dạng gỡ lỗi đang được dùng phổ biến, đó là: - Giám sát ROM (ROM Monitor)
- Mô phỏng trên mạch (In-circuit Emulator) - Gỡ lỗi trên chip (On-chip debug)
Trước khi xét từng trường hợp cụ thể trên, hãy xét các định nghĩa sau:
Code Dowload nạp chương trình từ PC xuống bộ nhớ hệ thống đích (RAM hoặc flash ROM) với mục đích là thực thi chương trình
CodeBreakpoints Cho phép dừng chương trình thực thi khi lệnh đã chỉ ra được thực hiện. Breakpoints thường hoạt động bằng cách chèn một lệnh đặc biệt tại vị trí cần theo dõi (còn được gọi là Software breakpoints) hay giám sát các bus của vi điều khiển sử dụng một bộ so sánh và dừng chương trình khi một lệnh cụ thể được thực hiện (Hardware breakpoints)
Data Access Breakpoints. Cho phép dừng chương trình khi một vị trí bộ nhớ được truy cập để đọc hay ghi.
Complex/Advanced Breakpoints. Cho phép mô tả breakpoints ví dụ một dải địa chỉ được chỉ ra hay một mặt nạ được sử dụng cho phép thiết lập các điều kiện “không quan tâm”. Hơn nữa, một breakpoint chỉ xuất hiện khi một chuỗi các sự kiện đã định nghĩa trước xảy ra, ví dụ khi thực hiện một lệnh cho trước theo sau bởi một thao tác ghi dữ liệu tại địa chỉ xác định thì sẽ xác nhận breakpoint (nghĩa là dừng chương trình)
Memory/Register Access. Cho phép trình gỡ lỗi đọc thanh ghi hay bộ nhớ.
“On-the-fly” Access. Các chức năng gỡ lỗi vẫn được hoàn thành trong khi vi điều khiển vẫn đang thực thi. Rất nhiều ứng dụng nhúng thực hiện điều khiển thời gian thực như cánh tay máy... và gỡ lỗi những ứng dụng như vậy ở giai đoạn khởi động/dừng là không thực tế khi dừng VĐK sẽ làm cho hệ thống khởi động lại (và như vậy phần gỡ lỗi khởi động lại toàn bộ). “On-the-fly” áp dụng điều này cho phép truy cập các biến mà không phải dừng chương trình.
Real-time Trace and Watchpoints. Cung cấp một cơ chế bắt (catch) luồng chương trình (hoặc dữ liệu truy cập) theo thời gian thực. Thông thường, thông tin lần vết được tạo ra từ VĐK, bắt và gắn tem thời gian và lưu bởi bộ mô phỏng. Watchpoints hoạt động giống Breakpoints, tuy nhiên thay vì dừng VĐK chúng đơn giản là chỉ ra điều kiện đặt trước đã xảy ra và có thể dùng bộ mô phỏng lọc hay bắt các thông tin lần vết. Lần vết theo thời gian thực là điểm mạnh cho gỡ lỗi của các hệ thống nhúng. Nếu một ứng dụng thường xuyên đổ vỡ khi ngắt do tràn ngăn xếp, sử dụng lần vết thời gian thực có khả năng bắt được những gì ứng dụng thực hiện trước khi
đổ vỡ và như vậy xác định được nguyên nhân của vấn đề (bằng cách xem lại chuỗi lệnh ghi được trước khi đổ vỡ).