Rất nhiều câu trả lời ở đây ... chủ yếu là giải quyết vấn đề theo nhiều cách khác nhau.
Tôi đã viết phần mềm và chương trình cơ sở nhúng thấp trong hơn 25 năm bằng nhiều ngôn ngữ - chủ yếu là C (nhưng có sự chuyển hướng sang Ada, Occam2, PL / M và nhiều bộ lắp ráp trên đường đi).
Sau một thời gian dài suy nghĩ và thử nghiệm và sai sót, tôi đã giải quyết một phương pháp thu được kết quả khá nhanh và khá dễ dàng để tạo các hàm bao và khai thác thử nghiệm (trong đó chúng THÊM GIÁ TRỊ!)
Phương thức này giống như thế này:
Viết một trình điều khiển mã trừu tượng phần cứng hoặc trình điều khiển cho mỗi thiết bị ngoại vi chính mà bạn muốn sử dụng. Đồng thời viết một cái để khởi tạo bộ xử lý và thiết lập mọi thứ (điều này làm cho môi trường thân thiện). Thông thường trên các bộ xử lý nhúng nhỏ - AVR của bạn là một ví dụ - có thể có 10 - 20 đơn vị như vậy, tất cả đều nhỏ. Đây có thể là các đơn vị để khởi tạo, chuyển đổi A / D thành bộ đệm bộ nhớ không được quét, đầu ra bitwise, đầu vào nút bấm (không gỡ lỗi chỉ lấy mẫu), trình điều khiển độ rộng xung, trình điều khiển nối tiếp UART / đơn giản sử dụng ngắt và bộ đệm I / O nhỏ. Có thể có thêm một vài - ví dụ trình điều khiển I2C hoặc SPI cho các thiết bị EEPROM, EPROM hoặc các thiết bị I2C / SPI khác.
Đối với mỗi đơn vị trừu tượng hóa phần cứng (HAL) / trình điều khiển, sau đó tôi viết chương trình thử nghiệm. Điều này phụ thuộc vào một cổng nối tiếp (UART) và init bộ xử lý - vì vậy chương trình thử nghiệm đầu tiên chỉ sử dụng 2 đơn vị đó và chỉ thực hiện một số đầu vào và đầu ra cơ bản. Điều này cho phép tôi kiểm tra rằng tôi có thể khởi động bộ xử lý và tôi có hoạt động gỡ lỗi cơ bản hỗ trợ I / O nối tiếp. Khi nó hoạt động (và chỉ sau đó), sau đó tôi sẽ phát triển các chương trình thử nghiệm HAL khác, xây dựng các chương trình này trên đầu các đơn vị UART và INIT tốt đã biết. Vì vậy, tôi có thể có các chương trình thử nghiệm để đọc các đầu vào bitwise và hiển thị các đầu vào này ở dạng đẹp (hex, thập phân, bất cứ thứ gì) trên thiết bị đầu cuối gỡ lỗi nối tiếp của tôi. Sau đó tôi có thể chuyển sang những thứ lớn hơn và phức tạp hơn như các chương trình thử nghiệm EEPROM hoặc EPROM - Tôi thực hiện hầu hết các menu này để tôi có thể chọn một thử nghiệm để chạy, chạy nó và xem kết quả. Tôi không thể SCRIPT nhưng thường thì tôi không '
Khi tôi có tất cả HAL của mình đang chạy, sau đó tôi tìm cách để đánh dấu vào bộ đếm thời gian thông thường. Điều này thường ở tốc độ khoảng 4 đến 20 ms. Điều này phải thường xuyên, được tạo ra trong một ngắt. Rollover / tràn bộ đếm thường là làm thế nào điều này có thể được thực hiện. Trình xử lý ngắt sau đó TĂNG một kích thước byte "semaphore". Tại thời điểm này, bạn cũng có thể loay hoay với quản lý năng lượng nếu bạn cần. Ý tưởng của semaphore là nếu giá trị của nó> 0, bạn cần chạy "vòng lặp chính".
EXECUTIVE chạy vòng lặp chính. Nó gần như chỉ chờ đợi semaphore đó trở thành số 0 (tôi tóm tắt chi tiết này đi). Tại thời điểm này, bạn có thể chơi với các bộ đếm để đếm các tích tắc này (vì bạn biết tỷ lệ đánh dấu) và do đó bạn có thể đặt cờ hiển thị nếu dấu kiểm điều hành hiện tại là trong khoảng thời gian 1 giây, 1 phút và các khoảng thời gian phổ biến khác bạn có thể muốn sử dụng. Khi giám đốc điều hành biết rằng semaphore> 0, nó sẽ chạy một lượt thông qua mọi chức năng "cập nhật" của ứng dụng.
Các quy trình ứng dụng có hiệu quả ngồi cạnh nhau và được chạy thường xuyên bằng cách đánh dấu "cập nhật". Đây chỉ là một chức năng được gọi bởi giám đốc điều hành. Đây thực sự là một người nghèo đa nhiệm với một RTOS được trồng tại nhà rất đơn giản, dựa trên tất cả các ứng dụng nhập vào, thực hiện một công việc nhỏ và thoát ra. Các ứng dụng cần duy trì các biến trạng thái của riêng chúng và không thể thực hiện các phép tính chạy dài vì không có hệ điều hành ưu tiên để buộc sự công bằng. NGHIÊM TÚC thời gian chạy của các ứng dụng (tích lũy) phải nhỏ hơn thời gian đánh dấu chính.
Cách tiếp cận trên có thể dễ dàng mở rộng để bạn có thể có những thứ như ngăn xếp giao tiếp được thêm chạy không đồng bộ và tin nhắn comms sau đó có thể được gửi đến các ứng dụng (bạn thêm một chức năng mới cho mỗi "rx_message_handler" và bạn viết một bộ điều phối tin nhắn. ra ứng dụng nào để gửi đến).
Cách tiếp cận này hoạt động với hầu hết mọi hệ thống truyền thông mà bạn quan tâm để đặt tên - nó có thể (và đã thực hiện) hoạt động cho nhiều hệ thống độc quyền, các hệ thống tiêu chuẩn mở, thậm chí nó hoạt động cho các ngăn xếp TCP / IP.
Nó cũng có lợi thế là được xây dựng trong các phần mô-đun với giao diện được xác định rõ. Bạn có thể kéo các mảnh vào và ra bất cứ lúc nào, thay thế các mảnh khác nhau. Tại mỗi điểm trên đường đi, bạn có thể thêm khai thác thử nghiệm hoặc trình xử lý dựa trên các phần lớp dưới tốt đã biết (công cụ bên dưới). Tôi đã thấy rằng khoảng 30% đến 50% thiết kế có thể được hưởng lợi từ việc thêm các bài kiểm tra đơn vị bằng văn bản đặc biệt thường được thêm vào khá dễ dàng.
Tôi đã tiến xa hơn một bước (một ý tưởng mà tôi đặt biệt danh từ một người khác đã thực hiện điều này) và thay thế lớp HAL bằng một lớp tương đương cho PC. Vì vậy, ví dụ, bạn có thể sử dụng C / C ++ và winforms hoặc tương tự trên PC và bằng cách viết mã CẨN THẬN, bạn có thể mô phỏng từng giao diện (ví dụ EEPROM = một tệp đĩa đọc vào bộ nhớ PC) và sau đó chạy toàn bộ ứng dụng nhúng trên PC. Khả năng sử dụng một môi trường gỡ lỗi thân thiện có thể tiết kiệm một lượng lớn thời gian và công sức. Chỉ những dự án thực sự lớn thường có thể biện minh cho lượng nỗ lực này.
Mô tả ở trên là một cái gì đó không phải là duy nhất đối với cách tôi làm mọi thứ trên nền tảng nhúng - tôi đã bắt gặp rất nhiều tổ chức thương mại làm tương tự. Cách thức thực hiện của nó thường rất khác nhau trong việc thực hiện nhưng các nguyên tắc thường giống nhau nhiều.
Tôi hy vọng những điều trên mang lại một chút hương vị ... phương pháp này hoạt động đối với các hệ thống nhúng nhỏ chạy trong một vài kB với khả năng quản lý pin tích cực thông qua các quái vật từ 100K trở lên chạy bằng nguồn vĩnh viễn. Nếu bạn chạy "nhúng" trên một hệ điều hành lớn như Windows CE hoặc hơn thì tất cả những điều trên là hoàn toàn không quan trọng. Nhưng dù sao đó không phải là chương trình nhúng THỰC SỰ.