Tôi nên biết gì khi làm thư viện cho Arduino?


8

Nó xảy ra với tôi rằng, ngoài vấn đề hiện tại của tôi, tôi phải hỏi, "Tôi nên biết gì khi làm một thư viện cho Arduino?"

Đầu tiên, những gì tôi đang làm:

Tôi đang sử dụng Eclipse làm trình soạn thảo của mình và viết mã bằng C ++. Tôi đã viết một ứng dụng Arduino đơn giản bao gồm tệp tiêu đề của tôi và đang khắc phục lỗi.

Vấn đề đầu tiên: làm thế nào để tôi thực hiện 'xây dựng sạch'? Tôi đang thấy các lỗi mà tôi nghĩ rằng tôi đã sửa, gần như là tệp tiêu đề được lưu trữ. (Vâng, rất có thể tôi đang làm điều gì đó ngu ngốc [ chỉnh sửa : Tôi đã], nhưng tôi vẫn muốn biết cách làm sạch thư viện và không biết các tệp đối tượng ở đâu).

Thứ hai: tôi cần lưu ý những quy ước nào? Tôi chưa sử dụng Arduino nhiều như tôi muốn và cảm thấy thật tuyệt khi được lập trình trong C ++, nhưng tôi biết mục đích của các thư viện là giữ mọi thứ tốt đẹp và đơn giản cho người dùng. Có quy ước cho tên chức năng? Tạo các hằng số (có vẻ như không gian tên toàn cầu bị ô nhiễm với #defines)? Và như thế.

Cuối cùng, có điều gì khác tôi nên biết không?

Tôi nên đề cập rằng tôi đã xem Hướng dẫn về Thư viện Arduino , điều này tốt, nhưng không đi quá xa. Tôi cũng đã xem qua một số thư viện được cài đặt trên hệ thống của tôi.


1
Bạn đã thử Arduino IDE và từ bỏ nó chưa? Tôi biết rằng với bộ tính năng năng suất lập trình chung của Eclipse-as-IDE, Arduino-IDE đã nhạt đi. Tuy nhiên, trong tình huống này, nếu bạn chưa thử Arduino-IDE, bạn có thể muốn làm như vậy. Mặc dù tôi thấy nó chậm chạp, nhưng biên dịch lại rõ ràng hoạt động, giống như họ nên làm.
icarus74

Câu trả lời:


3

Tôi sẽ đâm một nhát. Tôi chưa viết mã cho Arduino, nhưng tôi đã thực hiện rất nhiều chương trình C và C ++. Nó sẽ giúp nếu tôi thực sự thấy lỗi của bạn, nhưng dù sao.

Điều chính bạn cần luôn nhớ khi sử dụng C ++ với mã C là mã C ++ của bạn cần các hàm được khai báo bằng "extern" C "" nếu bạn muốn mã C có thể liên kết với mã C ++. "Extern" C "" là thông báo cho trình biên dịch C ++ rằng tôi đang tạo mã liên kết cho các tệp C hoặc tôi đang sử dụng mã từ các tệp C. Vì vậy, tất cả các hàm của bạn trong tiêu đề API thư viện sẽ tương quan với một hàm trong tệp nguồn được xác định là "extern" C "void dos somebody ()". Nếu bạn đang cố gắng sử dụng các lớp trong C ++, hãy nhớ rằng mã C không thể gọi nó, bạn sẽ cần tạo các hàm (extern "C") để truy cập đối tượng. Bây giờ, nếu mã C của bạn được biên dịch bằng trình biên dịch C ++, thì đừng lo lắng về "extern" C "".

Nếu bạn muốn gọi mã C bên trong mã C ++ của mình, thì bạn cần bọc tiêu đề C bằng cấu trúc như sau:

#ifdef ___cplusplus
extern "C" {
#endif

///all my C function declarations... yada yada

#ifdef __cplusplus
}  //end extern "C"
#endif

Nếu bạn làm việc trong C ++, đừng sử dụng nhiều #defines trừ khi bạn tạo các cờ thời gian biên dịch như "DEBUG" hoặc "VERSION2" để tạo các bộ mã đặc biệt. Mặt khác, sử dụng "const int / char / float" cho số xác định để kiểm tra loại an toàn. Các trình biên dịch thường đủ thông minh để tối ưu hóa các mục này, vì vậy chúng cuộn lên trong không gian ROM / mã (mặc dù phụ thuộc). Ngoài ra, không tạo MACROS, sử dụng các hàm nội tuyến. Ngoài ra, đừng luôn tuân theo quy ước khi lập trình nếu điều đó thật ngu ngốc, chẳng hạn như sử dụng nhiều macro và số được định nghĩa trong C ++. Điều tương tự cũng áp dụng cho phiên bản C99 của C, nó đã thêm những thứ như hàm nội tuyến và consts từ C ++. Ngành công nghiệp nhận ra bao nhiêu mã lỗi và khó duy trì mã đến từ việc sử dụng quá mức ngôn ngữ tiền xử lý.

Eclipse thường lưu trữ các tệp obj trong một thư mục trong dự án của bạn. Nếu bạn đang thực hiện bản dựng "Gỡ lỗi", thì nó nằm trong thư mục "Gỡ lỗi" trong thư mục dự án của bạn. Nếu bạn đang thực hiện một bản dựng "Phát hành", thì hãy xem phần "Phát hành", v.v. Thông thường, một bản dựng sạch sẽ chỉ hoạt động với tôi trong Eclipse, vì vậy tôi không biết điều gì xảy ra với thiết lập của bạn. Tôi đoán chắc chắn rằng bạn không tạo các tiêu đề được biên dịch trước.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.