Tìm hiểu hệ điều hành contiki
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN - - Báo cáo Môn: Các hệ thống thời gian thực Đề tài: Tìm hiểu hệ điều hành Contiki Giảng viên hướng dẫn: PGS.TS Nguyễn Quốc Cường Sinh viên thực hiện: Lê Hồng Nhật 20122197 Lê Anh Phương 20122245 Nguyễn Minh Sang 20122325 Bùi Đức Thắng 20122466 Hà Nội - 2016 Mục lục Mục lục Danh mục hình vẽ I Contiki Contiki giấy phép Tìm hiểu giấy phép BSD a Nhà phát hành b Nội dung Kiến trúc hệ điều hành Contiki II Giới thiệu contiki Kiến trúc Contiki a Nhân Kernel b Process c Preemptive Multi-threading 10 Đặc điểm hệ điều hành Contiki 10 III Cài đặt Contiki cho phần cứng 12 Các thành phần Contiki 12 Build System Contiki 15 Các bước port Contiki lên phần cứng 16 Cài đặt Contiki lên Kit MSP430 17 IV Lập trình ứng dụng hệ điều hành Contiki 22 Yêu cầu toán 22 Các công cụ hệ điều hành Contiki 22 a Process 22 b Event 24 c Các module Timer 26 d Mức ưu tiên Contiki 29 e Semaphore 30 Tìm giải pháp cho tốn 30 Lập trình 30 a Code 30 b Chỉnh thông số liên quan đến Tần số, Cấu hình thạch anh 34 c Biên dịch nạp code 34 Danh mục hình vẽ Hình Giấy phép BSD Hình 2: Danh sách phần cứng Contiki hỗ trợ 14 Hình 3: Giao diện phần mềm Instant Contiki 16 Hình 4: Giao diện kiểm tra kích hoạt MSP430 17 Hình 5: Giao diện dòng lệnh Terminal 17 Hình 6: Đánh lệnh vào Terminal 18 Hình 7: File tạo sau chạy câu lệnh make TARGET=Launchpad 18 Hình 8: File hex tạo sau lệnh make blink.upload 19 Hình 9: Giao diện Terminal upload thành công 19 LỜI NÓI ĐẦU Hệ điều hành contiki hệ điều hành mã nguồn mở, nghiên cứu, thiết kế phát triển nhóm nhà phát triển từ viện khoa học máy tính Thụy Điển, người đứng đầu Adam Dunkels Nhóm phát triển Contiki gồm nhiều thành viên đến từ SICS, CISCO, nhiều tổ chức trường đại học khác giới Hệ điều hành Contiki thiết kế cho vi điều khiển có nhớ nhỏ, với thơng số 2KB RAM 40KB ROM Nhờ đó, Contiki sử dụng cho hệ thống nhúng ứng dụng mạng cảm biến không dây Contiki bắt đầu nghiên cứu từ năm 2001 phát hành phiên Contiki 1.0 năm 2003 Hình 3.1 cho thấy lịch sử phát triển Contiki năm qua Phiên Contiki 2.4, với nhiều thay đổi, bổ sung phát triển vượt bậc Trong thực tế, Contiki ứng dụng nhiều dự án giám sát đường hầm xe lửa, theo dõi nước biển Baltic,… Nhiều chế, ý tưởng Contiki ứng dụng rộng rãi công nghiệp Điển mơ hình uIP phát hành năm 2001 sử dụng hệ thống ứng dụng hàng trăm công ty lĩnh vực hàng hải, thơng tin vệ tinh, khai thác dầu mỏ,…; mơ hình Protothreads công bố lần năm 2005, đến sử dụng nhiều ứng dụng giải mã kỹ thuật số thiết bị cảm biến rung không dây I Contiki Contiki giấy phép Các mã nguồn Contiki phát hành theo giấy phép BSD khoản Theo giấy phép này, Contiki sử dụng cách tự hai hệ thống thương mại phi thương mại miễn tiêu đề quyền tập tin mã nguồn giữ lại Bản quyền mã nguồn Contiki sở hữu cá nhân tổ chức có đóng góp cho Contiki, tất người góp phần theo điều kiện giấy phép BSD khoản Mã bạn riêng bạn Các Contiki giấy phép mã nguồn mở khơng đòi hỏi mã để chia sẻ với người khác Nếu bạn sử dụng Contiki để phát triển mã, mã bạn riêng bạn bạn khơng cần phải chia sẻ với Điều nói rằng, họ thực đánh giá cao đóng góp mã cho Contiki Nếu bạn muốn đóng góp mã nguồn cho dự án Contiki, nhiên, họ yêu cầu mã kèm theo giấy phép tương tự phần lại Contiki Tái phân phối sử dụng mã nguồn dạng nhị phân, có khơng có sửa đổi, cho phép cung cấp điều kiện sau đáp ứng: Việc phân phối lại mã nguồn phải giữ lại quyền thông báo, danh sách điều kiện khuyến cáo kèm theo Việc phân phối lại dạng nhị phân phải tạo lại quyền thông báo, danh sách điều kiện khuyến cáo kèm theo tài liệu / tài liệu khác cung cấp với phân bố Tên tác giả khơng sử dụng để nhận quảng bá sản phẩm có nguồn gốc từ phần mềm mà khơng có trước cho phép cụ thể văn Phần mềm cung cấp tác giả `` as is '' trình bày đảm bảo, kèm theo không giới hạn hay đảm bảo đảm thương mại phù hợp cho mục đích cụ thể thể bị bác bỏ Trong trường hợp tác giả không chịu trách nhiệm cho hành vi trực tiếp, gián tiếp, đặc biệt, hay tổn hại (các khoản kèm theo không giới hạn, sử dụng sản phẩm thay dịch vụ; mát sử dụng, liệu hay lợi nhuận; kinh doanh gián đoạn) gây trách nhiệm pháp lý, dù hợp đồng, trách nhiệm pháp lý nghiêm ngặt lỗi (bao gồm cẩn khác) phát sinh cách việc sử dụng phần mềm, khuyến cáo khả thiệt hại Tìm hiểu giấy phép BSD Hình Giấy phép BSD a Nhà phát hành Giấy phép BSD (Berkeley Software Distribution License) giấy phép phần mềm tự với điều kiện đơn giản sử dụng rộng rãi cho phần mềm máy tính Ban đầu giấy phép BSD thiết kế Đại học California Berkeley năm 1980 cho dự án BSD (Berkeley Source Distribution) b Nội dung Quyền lợi: Giấy phép BSD cho phép sử dụng phân phối lại mã nguồn sản phẩm, có khơng có sửa đổi, miễn tn thủ yêu cầu sau Nghĩa vụ: Phải giữ nguyên thông báo quyền sản phẩm Yêu cầu nhằm đảm bảo người dùng khơng thể tuyên bố viết phần mềm thực khơng viết Phải kèm theo thông báo: Danh sách điều kiện từ chối trách nhiệm Không sử dụng tên dự án hay tên nhà phân phối vào mục đích quảng bá thân khơng cho phép Như vậy, thấy đặc điểm lớn BSD cho phép nhà phát triển phần mềm thương mại hóa cách thực sản phẩm phần mềm có sử dụng mã nguồn mở dùng giấy phép BSD, tức kiếm tiền dựa mã nguồn chương trình (chủ yếu mã nguồn họ viết thêm giữ lại mã nguồn sửa đổi cho thân mà khơng cơng bố) thay kiếm tiền từ hoạt động không trực tiếp gắn với phần mềm bảo hành, phát hành, đào tạo hướng dẫn sử dụng … Ngồi ra, giấy phép BSD cho phép nhà phát triển thay thế, bổ sung thêm điều khoản vào giấy phép cho phù hợp với mình, chí sử dụng giấy phép khác II Kiến trúc hệ điều hành Contiki Giới thiệu contiki Contiki OS lập trình ngơn ngữ C, hoạt động dựa chế event-driven ( hướng kiện) có đặc điểm phù hợp với hệ thống nhúng mạng cảm biến không dây: + Contiki chia thành nhiều module hoạt động độc lập Nhờ ứng dụng sử dụng module cách linh động load module cần thiết + Cơ chế hoạt động điều khiển event-driven làm giảm lượng tiêu hao hạn chế dung lượng nhớ cần sử dụng + Có thể sử dụng IP mạng cảm biến thông qua uIP stack xây dựng dựa TCP/IP + Có module cho phép ước lượng quản lý lượng cách hiệu + Các giao thức tương tác lớp node mạng dễ dàng + Sử dụng RIME stack phục vụ giao thức dành cho mạng lượng thấp cách hiệu Bên cạnh đó, Contiki cung cấp cơng cụ hỗ trợ mô với giao diện đơn giản, dễ sử dụng hỗ trợ tốt thiết bị thực tế, phục vụ mục đích nghiên cứu, mô triển khai giao thức Kiến trúc Contiki Hệ điều hành Contiki xây dựng theo kiểu kiến trúc module Tức chia nhỏ yêu cầu phần mềm thành phần không trùng lặp, hỗ trợ làm việc song song module dễ bảo trì Kiến trúc module giúp cho việc tái sử dụng thành phần hệ thống khả mở rộng tốt Hệ điều hành Contiki chia thành phần : Loaded Program: Chứa chương trình nạp Core: bao gồm + Nhân kernel + Tập process + Các thư viện : Chứa hàm C cho việc thực thi hệ thống + Program loader : Nạp chương trình vào hệ thống a Nhân Kernel Theo mơ hình điều khiển Event-driven Các Process thực thi xử lý event, chạy đến hồn thành event Trong mơ hình Event-driven, process thay process stack số mơ hình khác process sử dụng stack, giúp cho hiệu chia sẻ nhớ hạn chế tất process Hai xử lý kiện không chạy đồng thời với Nhân Contiki bao gồm lập lịch event làm nhiệm vụ gửi event tới process chạy, định kì gọi xử lý polling process i Event chia thành loại: Event đồng : gửi đến target process để lập lịch Event không đồng : xếp hàng nhân gửi đến target process sau Process chạy event event trước hồn thành ii iii Lập lịch event Các event gửi đến process Việc lập lịch event hoàn thành level Các event không chen hàng lẫn Chỉ bị chen hàng ngắt Không cho phép vô hiệu hóa ngắt Do đó, khơng cho phép event gửi xử lý ngắt Cơ chế polling Contiki cung cấp cờ polling, sử dụng để yêu cầu event poll Là event ưu tiên cao, lập lịch event không đồng Khi có yêu cầu polling, cờ cung cấp xử lý ngắt để thực thi event poll Một process yêu cầu poll hàm process_poll() Khi gọi process lập lịch nhanh Khi event poll lập lịch, process mà thực thi xử lý poll, gọi, theo thứ tự ưu tiên chúng Polling cách để process chạy từ ngắt b Process Process service chương trình ứng dụng Các đặc điểm process: Thường bắt đầu khởi động hệ thống Được định nghĩa hàm xử lý event tùy chọn hàm xử lý poll Process chạy có event gửi tới Tất process chia sẻ không gian địa Truyền thông interprocess thông qua Nhân, việc gửi event Gồm phần : Process control block : lưu RAM, chứa thông tin như: tên, trạng thái, trỏ… Process thread : code process, lưu ROM Trạng thái process chứa nhớ riêng biệt Trạng thái process chiếm khoảng 23 bytes ( ESB platform) Hình 8: File hex tạo sau lệnh make blink.upload Lệnh make blink.upload tự động biên dịch ứng dụng Contiki trước tải vào phần cứng Hình 9: Giao diện Terminal upload thành công 21 IV Lập trình ứng dụng hệ điều hành Contiki Yêu cầu toán tác vụ độc lập: Đọc nhiệt độ - 50ms Kiểm tra bàn phím – 30ms Hiển thị lên LCD – 50ms Truyền tin lên cổng nối tiếp – 50ms Báo động 50ms Các công cụ hệ điều hành Contiki a Process Các chương trình Contiki process Một process đoạn code thực cách đặn hệ điều hành Process kích hoạt khởi động hệ thống module chức process nạp vào hệ thống Các process giao tiếp với thông qua việc post event Code hệ điều hành Contiki thực theo hai ngữ cảnh: cooperative preemptive Code cooperative thực tuần tự, code preemptive dừng tạm thời code cooperative để chiếm dụng tài nguyên cpu Các process Contiki chạy ngữ cảnh cooperative, ngắt real – time task lập lịch với deadline chạy ngữ cảnh preemptive Code cooperative (process) phải chạy hoàn thành, trước code cooperative phép chạy Code preemptive dừng code cooperative lúc Khi bị dừng, code cooperative không tiếp tục chạy code preemptive hoàn thành Cấu trúc Process 22 Một process Contiki bao gồm hai phần: khối điều khiển thread Khối điều khiển lưu trữ RAM, chứa thông tin run – time process tên, trạng thái trỏ tới thread process Thread code process lưu trữ ROM Process Control Block Khối điều khiển process chứa thông tin process tên, trạng thái trỏ tới thread process Khối điều khiển sử dụng nhân HĐH không truy cập trực tiếp process struct process { struct process *next; const char *name; int (* thread)(struct pt *, process_event_t, process_data_t); struct pt pt; unsigned char state, needspoll; }; Khối điều khiển chiếm vài byte nhớ Cấu trúc khối điều khiển process trình bày Lưu ý, khơng có trường khối điều khiển truy cập trực tiếp code người dùng Trường next trỏ đến khối điều khiển process danh sách liên kết process hoạt động Trường name trỏ đến tên văn process Trường thread trỏ hàm, trỏ đến thread process Trường pt giữ trạng thái protothread Trường state needspoll cờ giữ trạng thái process Cờ needspoll set hàm process_poll() process hỏi vòng Khối điều khiển process không khai báo trực tiếp, mà gián tiếp thơng qua macro PROCESS() Ví dụ: PROCESS(hello_world_process, "Hello world process"); Trong đó, tham số tên biến khối điều khiển, dùng truy cập process Tham số thứ hai tên process Process Thread 23 Chứa code process Mỗi process thread chất protothread, gọi lập lịch process Ví dụ process thread: PROCESS_THREAD(hello_world_process, ev, data) { PROCESS_BEGIN(); printf("Hello, world\n"); PROCESS_END(); } Protothread Protothread giải pháp tổ chức code, cho phép hệ thống thực hoạt động khác chờ đợi kiện Ý tưởng protothread khơng sử dụng HĐH Contiki mà bắt gặp nhiều hệ thống khác Protothread giúp cho hàm ngôn ngữ C hoạt động thread, lại không tốn dung lượng nhớ thread Protothread hàm chuẩn ngôn ngữ C Các hàm bắt đầu kết thúc hai macro đặc biệt, PT_BEGIN() PT_END() Process Contiki bổ sung thêm từ protothread nó, điều cho phép process đợi kiện xảy Các câu lệnh protothread sử dụng process Contiki bao gồm: PROCESS_BEGIN(); // Declares the beginning of a process' protothread PROCESS_END(); // Declares the end of a process' protothread PROCESS_EXIT(); // Exit the process PROCESS_WAIT_EVENT(); // Wait for any event PROCESS_WAIT_EVENT_UNTIL(); // Wait for an event, but with a condition PROCESS_YIELD(); // Wait for any event, equivalent to PROCESS_WAIT_EVENT() PROCESS_WAIT_UNTIL(); // Wait for a given condition; may not yield the process PROCESS_PAUSE(); // Temporarily yield the process b Event Trong Contiki, process khởi chạy nhận event Có hai loại event: không đồng đồng 24 Khi event khơng đồng post, đưa vào hàng đợi event nhân HĐH chuyển đến process đích sau khoảng thời gian Khi event đồng post, chuyển đến process đích Polling Poll request dạng đặc biệt event Một process thực thi polling nhờ vào hàm process_poll() gọi từ process hành Hàm có tác dụng làm cho process lập lịch nhanh Khi gọi hàm này, process nhận event đặc biệt Đây hàm an toàn gọi từ ngữ cảnh preemtive Mã định danh Event Các event có có mã định danh riêng, số 8bit truyền đến process nhận event Mã định danh giúp cho process nhận event xác định công việc phải làm Mã định danh có giá trị 128 cho phép người dùng tự định nghĩa để phục vụ process lập trình Trong đó, mã có giá trị từ 128 dùng để giao tiếp process khác quản lý nhân hệ điều hành Các mã định danh dành riêng cho nhân Contiki: #define #define #define #define PROCESS_EVENT_NONE PROCESS_EVENT_INIT PROCESS_EVENT_POLL PROCESS_EVENT_EXIT 128 129 130 131 25 #define #define #define #define PROCESS_EVENT_CONTINUE PROCESS_EVENT_MSG PROCESS_EVENT_EXITED PROCESS_EVENT_TIMER 133 134 135 136 PROCESS_EVENT_NONE: Mã không sử dụng PROCESS_EVENT_INIT: Event có mã định danh gửi đến process khởi tạo PROCESS_EVENT_POLL: Event gửi đến process bị polling PROCESS_EVENT_EXIT: Event gửi đến process bị hủy nhân Contiki, giúp process có khả tự dọn dẹp phân vùng tài nguyên chiếm giữ Khi nhận event này, process khơng thể gọi lại sau PROCESS_EVENT_CONTINUE: Event gửi nhân Contiki đến process tạm dừng câu lệnh PROCESS_YIELD() PROCESS_EVENT_MSG: Event gửi đến process vừa nhận thông điệp truyền thông PROCESS_EVENT_EXITED: Event gửi đến tồn process thực thi để báo có process exit Con trỏ trỏ đến Process Control Block process exit truyền theo event PROCESS_EVENT_TIMER: Event gửi đến process event timer kết thúc Ngoài mã định nghĩa sẵn trên, người lập trình định nghĩa process mã khác có giá trị 128 để giao tiếp process với Ví dụ: process_event_t new_event; Process sử dụng event để giao tiếp với process khác phải tạo phân vùng cho PROCESS_THREAD với cú pháp: new_event = process_alloc_event(); Sau hai bước khai báo trên, process thực thi nhận event này, event định nghĩa sẵn hệ điều hành c Các module Timer Contiki cung cấp tập thư viện Timer phục vụ cho nhân hệ điều hành lập trình ứng dụng, bao gồm module clock module: timer, stimer, ctimer, etimer rtimer Sự khác biệt module nằm chỗ: số chạy thời gian dài với độ phân giải ( granularity ) thấp, số có độ phân giải cao khoảng thời gian hoạt động ngắn, có module dùng cho ngắt ( rtimer ) số khác khơng thể 26 Module Clock cung cấp hàm để get system time ( system time thời gian hoạt động hệ thống, = HĐH khởi động ) block CPU khoảng thời gian ngắn (delay, wait ) Các module Timer hoạt động dựa chức module Clock Module timer stimer hoạt động timer túy, cung cấp công cụ để kiểm tra xem khoảng thời gian cài đặt trơi qua hay chưa Timer dùng xung clock hệ thống stimer thay đổi theo đơn vị giây (s), cho phép chu kì dài Khác với module timer khác, timer stimer không bị tác động ngắt etimer cung cấp event timer, dùng để lập lịch kiện ctimer dùng để tạo callback timer có khả gọi callback function sau khoảng thời gian Cả event timer ctimer tác dụng chờ khoảng thời gian hệ thống nghỉ hay trạng thái low power rtimer dùng cho việc lập lịch tác vụ thời gian thực rtimer chen hàng process chạy để thực thi tác vụ thời gian thực thời điểm lập lịch Module Clock Clock Module API: clock_time_t clock_time(); // Get the system time unsigned long clock_seconds(); // Get the system time in seconds void clock_delay(unsigned int delay); // Delay the CPU void clock_wait(int delay); // Delay the CPU for a number of clock ticks void clock_init(void); // Initialize the clock module CLOCK_SECOND; // The number of ticks per second Hàm clock_init() gọi hệ thống lúc khởi động, hàm lại sử dụng để lập trình ứng dụng Hàm clock_time() clock_seconds() trả thời gian hệ thống tính theo số tick số giây kể từ bắt đầu hoạt động Module timer Thư viện timer cung cấp hàm để set, reset, restart kiểm tra timer kết thúc hay chưa Các ứng dụng phải tự check xem timer kết thúc hay chưa, module timer không cho phép tự động kiểm tra (khác với etimer) Thư viện timer dùng chung hàm clock_time() với module Clock để get thời gian hệ thống Một timer khai báo cấu trúc: struct timer timer Library API: void timer_set(struct timer *t, clock_time_t interval); // Start the timer void timer_reset(struct timer *t); // Restart the timer from the previous expiration time void timer_restart(struct timer *t); // Restart the timer from current time int timer_expired(struct timer *t); // Check if the timer has expired 27 clock_time_t timer_remaining(struct timer *t); // Get the time until the timer expires Hàm timer_set() dùng để khởi động timer với thời gian chạy kể từ thời điểm đến kết thúc định rõ thông qua tham số interval Sau dùng hàm timer_set(), muốn dùng lại timer với thời gian chạy (interval) cũ, ta dùng hai hàm timer_reset() timer_restart() Điểm khác hai hàm hàm timer_reset() tính thời gian bắt đầu kể từ lần kết thúc trước đó, hàm timer_restart() tính thời gian bắt đầu timer theo thời gian lúc hàm gọi Hàm timer_expired() để kiểm tra xem timer kết thúc hay chưa Hàm timer_remaining() get thời gian lại trước kết thúc timer, timer kết thúc giá trị trả không xác định Module stimer – seconds timer Thư viện stimer tương tự thư viện timer, dùng giá trị thời gian đơn vị giây thay cho số tick cpu Điều cho phép khai báo timer có thời gian dài stimer Library API: void stimer_set(struct stimer *t, unsigned long interval); // Start the timer void stimer_reset(struct stimer *t); // Restart the stimer from the previous expiration time void stimer_restart(struct stimer *t); // Restart the stimer from current time int stimer_expired(struct stimer *t); // Check if the stimer has expired unsigned long stimer_remaining(struct stimer *t); // Get the time until the timer expires Module etimer – event timer Cung cấp chế để tạo event định trước thời gian xảy Khi even timer kết thúc, post event PROCESS_EVENT_TIMER đến process khai báo event timer Event timer khai báo dạng cấu trúc struct etimer, toàn truy cập đến event timer thực trỏ đến event timer khai báo Lưu ý: event timer bị chen hàng ngắt etimer Library API: void etimer_set(struct etimer *t, clock_time_t interval); // Start the timer void etimer_reset(struct etimer *t); // Restart the timer from the previous expiration time 28 void etimer_restart(struct etimer *t); // Restart the timer from current time void etimer_stop(struct etimer *t); // Stop the timer int etimer_expired(struct etimer *t); // Check if the timer has expired int etimer_pending(); // Check if there are any non-expired event timers clock_time_t etimer_next_expiration_time(); // Get the next event timer expiration time void etimer_request_poll(); // Inform the etimer library that the system clock has changed Module ctimer – callback timer Cung cấp chế để gọi hàm timer kết thúc Ctimer dùng lại module Clock nói void ctimer_set(struct ctimer *c, clock_time_t t, void(*f)(void *), void *ptr); // Start the timer void ctimer_reset(struct ctimer *t); // Restart the timer from the previous expiration time void ctimer_restart(struct ctimer *t); // Restart the timer from current time void ctimer_stop(struct ctimer *t); // Stop the timer int ctimer_expired(struct ctimer *t); // Check if the timer has expired Ctimer API tương tự module etimer Chỉ có khác biệt hàm ctimer_set(), ta phải khai báo thêm hai tham số: trỏ hàm callback trỏ tham số hàm callback Khi ctimer kết thúc, hàm callback gọi với tham số trỏ khai báo Module rtimer – real time timer Dùng để lập lịch thực thi tác vụ thời gian thực (có thể định trước thời gian thực thi) Khác với module timer khác, rtimer dùng module clock riêng, có độ phân giải lớn cho phép lập lịch với mức độ chi tiết thời gian lớn nhiều Module rtimer có hàm RTIMER_NOW() số RTIMER_SECOND tương tự hàm clock_time() số CLOCK_SECOND module clock Khi gọi đến, tác vụ thời gian thực chen hàng tác vụ khác để thực thi Module rtimer cho phép hoạt động timer ngừng hỗ trợ từ phiên năm 2007 d Mức ưu tiên Contiki 29 Không định nghĩa mức ưu tiên khơng có chế để gán mức ưu tiên trực tiếp cho tác vụ Một đoạn code ưu tiên thực trước thực ngữ cảnh preemtive ngắt hay event Trong ngữ cảnh hoạt động theo nguyên tắc đến trước phục vụ trước Trong Contiki, ngầm định ba mức ưu tiên: Ngắt hệ thống ( Subroutine Interrrupt) Poll event tạo thực ngắt Process event e Semaphore Contiki hỗ trợ semaphore để quản lý tài nguyên dùng chung Semaphore triển khai thông qua pt-sem.h thư mục core/sys với hàm wait, signal semaphore thông thường Nhưng thư viện sử dụng lập trình mức protothread, khơng dùng cho lập trình mức process Tìm giải pháp cho toán + tác vụ độc lập: process + Các tác vụ có chu kỳ cố định: dùng etimer cho process + Tài nguyên dùng chung: process thực thi hết, trước chuyển sang process tiếp theo, khơng có chen hàng nên khơng có vùng tranh chấp Lập trình a Code #include #include #include #include #include #include "contiki.h" "dev/leds.h" "dev/serial-line.h" "dev/adc.h" "dev/lcd.h" static volatile uint16_t T = 0, Thresh = 30, count; static volatile uint8_t display = 00; //State of LCD //process_event_t exceed_threshold; //event created cross the thresold - Thresh when temperature /* -*/ PROCESS(temp_reading_process, "Temperature reading process"); PROCESS(display_lcd_process, "Display to LCD process"); PROCESS(alarm_process, "Alarm process"); PROCESS(keyboard_process, "Check keyboard process"); PROCESS(communication_process, "Communication process"); AUTOSTART_PROCESSES(&temp_reading_process,&display_lcd_process, &alarm_process, &keyboard_process, &communication_process); /* -*/ 30 /* -5 PROCESSES - */ static struct etimer et1; uint16_t adc; PROCESS_THREAD(temp_reading_process, ev, data) { PROCESS_BEGIN(); /* -Temp Sensor setup -*/ uint16_t temp; printf("System have started \n"); /***************************************/ etimer_set(&et1, CLOCK_SECOND*50/1000); while(1) { adc = adc_get(A7); temp = adc*(3.5*100/1023); if(abs(temp - T) Thresh){ P2OUT |=0x40; //enable alarm bell } PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et3)); P2OUT &=0xbf; //disable alarm bell etimer_reset(&et3); } PROCESS_END(); } /* -*/ static struct etimer et4; PROCESS_THREAD(keyboard_process, ev, data) { PROCESS_BEGIN(); /* -Keyboard setup */ 32 count P2DIR P2REN P2OUT = Thresh; &= 0b11000111; |= 0b00111000; |= 0b00111000; P1DIR &= ~BIT6; P1REN |= BIT6; P1OUT |= BIT6; /***************************************/ etimer_set(&et4, CLOCK_SECOND*30/100); while(1) { if((P2IN & BIT3) != BIT3){ //button OK while((P2IN & BIT3) != BIT3){} if(display != 00) display = 10; Thresh = count; } if((P2IN & BIT4) != BIT4){ //button cancel while((P2IN & BIT4) != BIT4){} if(display != 00) display = 10; count = Thresh; } if((P2IN & BIT5) != BIT5){ //button increase while((P2IN & BIT5) != BIT5){} if(display != 11) display = 01; count++; } if((P1IN & BIT6) != BIT6){ //button decrease while((P1IN & BIT6) != BIT6){} if(display != 11) display = 01; count ; } PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et4)); etimer_reset(&et4); } PROCESS_END(); } /* */ static struct etimer et5; PROCESS_THREAD(communication_process, ev, data) { PROCESS_BEGIN(); etimer_set(&et5, CLOCK_SECOND*50/1000); /*transmit info via serial port*/ while(1) { printf("Temperature: %u - Threshold: %u",T, Thresh); if(T > Thresh){ printf(" -> WARNING !\n"); } else printf(" \n"); PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et5)); etimer_reset(&et5); } PROCESS_END(); } /* THE-END -*/ 33 b Chỉnh thơng số liên quan đến Tần số, Cấu hình thạch anh File platform-conf.h thư mục contiki-launchpad/platform/launchpad: chỉnh tần số hoạt động 4MHz File clock.c thư mục contiki-launchpad/cpu/msp430/g2xxx: chỉnh nguồn tạo dao động cho chip thông qua ghi cấu hình có liên quan hàm clock_init() c Biên dịch nạp code Tạo make file bao gồm thông số quan trọng: TARGET – tên hardware platform PROJET – tên main file Chuyển đến thư mục chứa code: cd DestinationDirectory Biên dịch msp430-gcc: make all Nạp code lên launchpad: make fileName.upload Lưu ý trước nạp phải kết nối đến launchpad cách: chọn Player góc bên trái hình, chọn mục Removable Devices chọn kit launchpad 34 Tài liệu tham khảo: [1] Contiki website: http://www.contiki-os.org/ [2] Open Source Code :https://github.com/contiki-os/contiki/wiki [3] http://www.contiki-os.org/license.html [4] https://en.wikipedia.org/wiki/Software_license [5] Internet of Things (IoT) in days Antonio Liñán Colina, Alvaro Vives, Antoine Bagula, Marco Zennaro Ermanno Pietrosemoli – Version 1.0, 2015 35 ... công cụ hệ điều hành Contiki a Process Các chương trình Contiki process Một process đoạn code thực cách đặn hệ điều hành Process kích hoạt khởi động hệ thống module chức process nạp vào hệ thống... 30KB ROM g) Platform 11 Contiki hỗ trợ platform bảng III Cài đặt Contiki cho phần cứng Các thành phần Contiki 12 Contiki hệ điều hành mã nguồn mở, sử dụng chủ yếu cho hệ thống mạng cảm biến... I Contiki Contiki giấy phép Tìm hiểu giấy phép BSD a Nhà phát hành b Nội dung Kiến trúc hệ điều hành Contiki