Table of Contents
Viết mã C xách tay cho thiết bị IoT là một kỹ năng cơ bản cho các nhà phát triển nhúng cần thiết để triển khai các ứng dụng trên các nền tảng phần cứng khác nhau. Hệ thống IoT bao gồm các bộ điều khiển vi mô với ARM Cortex-M, RISC-V, AVR, và tự động cấu trúc, với bản đồ bộ nhớ độc đáo, các bộ nhớ ngoại biên, và biên dịch sự kiện cố ý cho khả năng chuyển giao tiếp, mã thường hoạt động trên một mục tiêu khác, dẫn đến việc viết lại và bảo trì ác mộng. Bài này cung cấp hướng dẫn mở rộng để đạt được khả năng thật sự bền vững trong cổng C, bao gồm cả hai phương pháp chiến lược và thực tế.
Hiểu được tính chất cụ thể trong sự phát triển của Iot
Tính năng chuyển tiếp có nghĩa là mã nguồn có thể được biên dịch và chạy trên các cấu trúc phần cứng khác nhau mà không cần sửa đổi. Trong thế giới IoT, tính khả năng chuyển đổi không chỉ là một điều kiện tiện lợi - đó là một yêu cầu kinh doanh. Những xe đạp sinh sản được cung cấp, và các dây chuyền mới xuất hiện liên tục. Một cơ sở mã di động cho phép bạn sử dụng lại phần mềm đã có trong các thế hệ sản phẩm, nhanh chóng chuyển đổi thành thành phần khác trong thời gian khan hiếm, và giảm thời gian từ xe đạp điện đến đồ thị cho sản phẩm dẫn xuất.
Tính năng chuyển tiếp tồn tại trên một quang phổ. Ở đầu, mã hoàn toàn phụ thuộc vào nền tảng (v. d., các thuật toán sắp xếp chung) ở bất cứ nơi nào. Ở đầu kia, mã trực tiếp điều khiển phần cứng bộ nhớ không thể truy cập được. Mục tiêu của CT xách tay là cô lập các chi tiết không thể truy cập được đằng sau các lớp trừu tượng hóa để cho các thuật toán và logic cốt lõi vẫn có thể sử dụng lại được.
Những thử thách thông thường để giải mã tính chất hữu ích
Một số dịch bệnh khác nhau cấp thấp đã nhúng vào chức năng cổng C:
- Tính đa dạng. ARM Cortex và AVR là ít người dùng; một số kiến trúc cũ (v.g., Free size HC12) là lớn. Việc trực tiếp đưa con trỏ hoặc liên hiệp qua bởi thư mục dữ liệu im lặng.
- kích thước và định nghĩa. An có thể là 16 bit trên một AVR 8 bit, 32 bit trên một hệ thống CortexM0, và 64 bit trên một bộ vi xử lý RISC 64bit. Mã giả định [FL: 1] là 32 bit sẽ bị hư.
- khác biệt bản đồ. ) Ngay cả hai MCU từ cùng một nhà cung cấp thường có địa chỉ cơ bản khác nhau, trường bit và chuỗi cấu hình.
- Mở rộng Máy tính và pragmas. GCC, IAR, ARM Compiler 6, và Kil mỗi người có các phương ngữ lắp ráp riêng ) và các phương ngữ lắp ráp.
- Bố trí và canh lề. Một số nền tảng đòi hỏi sự thẳng hàng chặt chẽ cho 32 bit truy cập; những nền tảng khác xử lý truy cập bị sai với bộ quản lý lỗi.
- Việc tháo gỡ và xếp chồng. Ngắt đoạn véc- tơ, mô hình ưu tiên và hành vi làm tổ khác nhau.
Name
Lớp Trừu tượng Phần cứng (HAL)
Công cụ mạnh nhất trong kho vũ khí mã nguồn xách tay là lớp trừu tượng hóa khó chịu . Một giao diện được thiết kế tốt để vạch trần một bộ đồng phục ADI cho các vùng ngoại biên chung (GPI, UAT, I2C, SPI, Timers) trong khi ẩn các chức năng đăng ký [FLT: 1 bộ nhớ bên trong. g [FL: đầu], [FL], [FL], FL], [FL], [FT] và [T] ứng dụng mã nguồn gốc] thực hiện các chức năng đó. [L].
Một mô hình thực hiện HAL điển hình trông như thế này:
// hal_gpio.h (common)
typedef uint8_t gpio_pin_t;
typedef uint8_t gpio_port_t;
void hal_gpio_set_output(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_high(gpio_port_t port, gpio_pin_t pin);
void hal_gpio_set_low(gpio_port_t port, gpio_pin_t pin);
Tập tin đặc trưng nền (v. d., [FLT: 7) chứa các bộ nhớ thật. Khi chuyển tới MCU mới, chỉ có nguồn HU thấp cần được viết lại, trong khi tất cả các lớp cao hơn vẫn chưa được chạm đến.
Nhận thư viện thường
Các chức năng như , , các tiện ích dây và chức năng toán học có sẵn trên mỗi trình biên dịch khớp. Tránh những giả định về nội dung thư viện là quan trọng chưa bao giờ viết lại [FLT: 10] để làm việc trừ khi bạn đã xác nhận việc biên dịch của bạn là chưa đủ.
Đối với hệ thống IoT với bộ nhớ hạn hẹp, hãy xem xét sử dụng tập hợp con của thư viện chuẩn (như mới [FLT: 1] ) trong hệ sinh thái GCC], thay vì lăn dây riêng. Tương tự, vĩ lệnh và có sẵn. Liên kết: Tài liệu [FL: 2] [FL:] [FL: 2] [FL:] GB: T kinh điển [FL:] [FL:] Tham khảo] tương tự như vậy, vĩ mô tả tuyệt vời cho khả năng dễ dàng di chuyển.
Dùng loại dữ liệu cố định
Luôn luôn dùng các loại từ và , , [FLT] để tuyên bố các biến số với chiều rộng rõ rệt: , , [FLT: 21], , , etc. Tránh [FLT:], , [FLT],], [FL: 21] cho bất cứ điều gì phải có kích cỡ. Đối với vòng lặp và kích cỡ nhỏ, khi không quan trọng, nơi [L: 22], [L],], thực hiện [L] thay vì].
Khi bạn cần tuần tự dữ liệu qua byte di chuyển theo định hướng, kết hợp các loại dịch vụ chuyển đổi cố định [FLT:], , hoặc những phương tiện di chuyển tương đương của chúng. Không bao giờ chỉ cần thả một và gửi nó qua một mạng lưới sẽ cắn bạn.
Điều kiện
Chỉ thị tiền xử lý là một công cụ hợp pháp cho trình nền mã đặc trưng, nhưng phải được dùng một cách hợp pháp. Xác định một tập hợp cấu hình vĩ mô nhỏ trong một đầu trang trung tâm (v. d., ) thay vì rải qua mỗi tập tin. Ví dụ:
// platform_config.h
#if defined(STM32L4)
#define PLATFORM_STM32L4
#elif defined(EFM32GG)
#define PLATFORM_EFM32GG
#else
#error "Unsupported platform"
#endif
Sau đó, trong mã, sử dụng chung chỉ khi hoàn toàn cần thiết. Hãy nhớ rằng quá mức làm cho mã khó đọc và duy trì.
Thu nhỏ phụ thuộc bên ngoài
Mỗi thư viện mục bên thứ ba gồm có một mối nguy hiểm khả năng cổng. Trước khi thêm phụ thuộc vào nó, xác định rằng nó hỗ trợ tất cả các cấu trúc đích và không kéo trong giả định không thể di chuyển. Các thư viện được viết hoàn toàn bằng C. g., [FLT: 0] trước khi thêm vào [FLT: 0] [FLT: 1]] hoặc [FL:2] [FL:] an toàn hơn những người phụ thuộc vào đường dây hội nghị hoặc trình biên dịch P. g. Sau đó, xem xét thư viện trừu tượng có thể dễ dàng thay đổi mã mà không cần đến mã.
Liên kết: Bài báo [FLT: 0] Về mã C thực [FLT: 1] cho ta thêm một quan điểm về quản lý quan hệ phụ thuộc.
Lời khuyên thực tế để đẩy mạnh sự dễ dàng tiếp thu
Ghi mã Mô- đa- vi
Hãy chia phần cứng thành các mô- đun riêng, bằng các giao diện xác định tốt. Mỗi mô- đun nên hiển thị chức năng của nó thông qua một tập tin tựa và giấu các chi tiết nội bộ của nó. Sự phân chia này làm cho các mối quan tâm dễ dàng thay thế mô- đun bằng một phiên bản di động khi chuyển tới nền mới. Lấy thí dụ, mô- đun điều khiển động mô- đun điều khiển HWM nên nói chuyện với mô- đun phát ra PWM, không trực tiếp với bộ nhớ thời gian.
Phụ thuộc phần cứng Tài liệu
Rõ ràng là đánh dấu bất kỳ mã nào cho rằng ứng xử phần cứng đặc biệt. Dùng chú thích để giải thích tại sao một phương pháp không thể cập nhật được đã được chọn, nền tảng nào hoạt động, và điều nào cần thiết để thay đổi cho mục tiêu khác. Tài liệu này vô giá khi người phát triển không có khả năng và một kỹ sư mới phải gửi mã.
Dùng công cụ xây dựng chữ thập phân
Các hệ thống như [FLT: 0] Make [FLT: 0] [FLT: 1] hoặc [Fson có thể quản lý nhiều cấu hình đích từ một cấu trúc riêng lẻ. C Make, chẳng hạn, cho phép bạn xác định tập tin công cụ cho mỗi nền tảng và đặt định nghĩa dựa trên đích. Việc này loại bỏ cần thiết để giữ tập tin riêng lẻ cho IAR, Ke, và GCC. Link:[FL:] Tài liệu [FL: 5] cung cấp các tài liệu hướng dẫn [FL: khả năng in rộng các ví dụ về việc sắp xếp các tập tin qua đường cong.
Dùng các kỹ thuật điều khiển định dạng bit có thể lưu
Khi thiết lập hay xoá bit trong bộ nhớ, hãy tránh viết mặt nạ tuyệt đối mà giả định vị trí của trường phái này. Thay vào đó, hãy dùng hằng số tượng trưng được định nghĩa trong HAL, và dùng các chức năng vĩ mô hoặc nội bộ để hoạt động an toàn:
#define BIT_SET(reg, bit) ((reg) |= (1u << (bit)))
#define BIT_CLEAR(reg, bit) ((reg) &= ~(1u << (bit)))
Định nghĩa là một tham số trừu tượng thay vì số nguyên theo nghĩa đen. Bằng cách này, nếu vị trí bit thay đổi trên một MCU khác, chỉ định nghĩa không đổi, không phải là cách sử dụng trên toàn cơ sở mã.
Thử và kiểm tra qua các nền tảng
Cần phải xác nhận tính chất thực tế. Dùng sự tích hợp liên tục (CI) để xây dựng các nền tảng được hỗ trợ. Trong CI, chạy các công cụ phân tích tĩnh như [FLT: 0] PClint [FLT: 1] hoặc ) để mô phỏng tính năng ) tính khả năng quản lý [FLT:] để phát hiện việc sử dụng các cấu trúc không thể sử dụng. Để thử nghiệm chức năng, hãy sử dụng trình giả lập (v. d. QEM cho ARM hay RenoCV) để mô phỏng hệ thống mô phỏng hệ thống định dạng phần cứng (FLTTTTTTTTTTT: phần cứng, hoặc phần cứng của các thiết bị đốt cháy thường xuyên.
Một bài kiểm tra như “Hãy viết một mẫu đơn cho máy UXT, đọc lại trong một vòng lặp, xem xét thời gian hoặc cấu hình giữa các phép toán mô phỏng.
Kết luận
Viết mã C xách tay cho thiết bị IoT không phải là một thiết bị bù trừ, nó là một quy tắc phải được hấp dẫn vào kiến trúc từ ngày đầu tiên. Bằng cách đầu tư vào một lớp trừu tượng phần cứng, bám chặt vào các loại chuẩn và thư viện, sử dụng điều kiện tiết kiệm, và thử nghiệm chặt chẽ qua mục tiêu, bạn tạo ra phần mềm có thể sống sót qua các thay đổi không thể tránh được trong môi trường phần cứng. Các nỗ lực trước tiên trả giá trị ít bảo trì, chuyển tiếp sang các cổng silicon mới, và tăng cường độ bền vững để cung cấp tính năng tháo gỡ. Bắt đầu áp dụng các chiến lược này cho các dự án hỗ trợ tính năng của bạn ngày hôm nay để xử lý hệ thống « C ».