Tìm hiểu hệ điều hành contiki
Trang 1TRƯỜ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:
Hà Nội - 2016
Trang 2Mục lục
Mục lục 0
Danh mục hình vẽ 3
I Contiki 5
1 Contiki và giấy phép 5
2 Tìm hiểu giấy phép BSD 6
a Nhà phát hành 6
b Nội dung 6
II Kiến trúc hệ điều hành Contiki 8
1 Giới thiệu contiki 8
2 Kiến trúc Contiki 8
a Nhân Kernel 8
b Process 9
c Preemptive Multi-threading 10
3 Đặc điểm hệ điều hành Contiki 10
III Cài đặt Contiki cho một phần cứng 12
1 Các thành phần của Contiki 12
2 Build System của Contiki 15
3 Các bước port Contiki lên một phần cứng 16
4 Cài đặt Contiki lên Kit MSP430 17
IV Lập trình ứng dụng trên hệ điều hành Contiki 22
1 Yêu cầu của bài toán 22
2 Các công cụ của 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 trong Contiki 29
e Semaphore 30
3 Tìm giải pháp cho bài toán 30
4 Lập trình 30
a Code 30
Trang 3b Chỉnh các thông số liên quan đến Tần số, Cấu hình thạch anh 34
c Biên dịch và nạp code 34
Trang 4Danh mục hình vẽ
Hình 1 Giấy phép BSD 6
Hình 2: Danh sách phần cứng được 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 ra sau khi chạy câu lệnh make TARGET=Launchpad 18
Hình 8: File hex tạo ra sau lệnh make blink.upload 19
Hình 9: Giao diện Terminal khi upload thành công 19
Trang 5LỜI NÓI ĐẦU
Hệ điều hành contiki là hệ điều hành mã nguồn mở, được nghiên cứu, thiết kế và phát triển bởi một nhóm các nhà phát triển từ viện khoa học máy tính Thụy Điển, người đứng đầu là Adam Dunkels Nhóm phát triển Contiki gồm nhiều thành viên đến từ SICS, CISCO, cùng nhiều tổ chức và các trường đại học khác trên thế giới Hệ điều hành Contiki được thiết kế cho các vi điều khiển có bộ nhớ nhỏ, với thông số 2KB RAM và 40KB ROM Nhờ đó, Contiki được sử dụng cho các hệ thống nhúng và các ứng dụng trong mạng cảm biến không dây Contiki bắt đầu được nghiên cứu từ năm
2001 và phát hành phiên bản đầu tiên Contiki 1.0 năm 2003 Hình 3.1 cho thấy lịch sử phát triển của Contiki trong những năm qua Phiên bản hiện nay của Contiki là 2.4, với nhiều thay đổi, bổ sung và phát triển vượt bậc Trong thực tế, Contiki đã được ứng dụng trong nhiều dự án như giám sát đường hầm xe lửa, theo dõi nước trong biển Baltic,… Nhiều cơ chế, ý tưởng trong Contiki đã được ứng dụng rộng rãi trong công nghiệp Điển hình như mô hình uIP được phát hành năm 2001 đã được sử dụng trong
hệ thống ứng dụng của hàng trăm công ty trong các lĩnh vực hàng hải, thông tin vệ tinh, khai thác dầu mỏ,…; mô hình Protothreads được công bố lần đầu tiên năm 2005, đến nay đã được sử dụng trong nhiều ứng dụng như bộ giải mã kỹ thuật số và thiết bị cảm biến rung không dây
Trang 6I Contiki
Contiki và giấy phép
Các mã nguồn Contiki được phát hành theo giấy phép BSD 3 khoản Theo giấy phép này, Contiki có thể được sử dụng một cách tự do trong cả hai hệ thống thương mại và phi thương mại miễn là tiêu đề bản quyền trong các tập tin mã nguồn được giữ lại Bản quyền đối với mã nguồn Contiki được sở hữu bởi cá nhân hoặc tổ chức có đóng góp cho Contiki, nhưng tất cả mọi người đã góp phần nó theo cùng các điều kiện giấy phép BSD 3 khoản
Mã của bạn là của riêng bạn
Các Contiki giấy phép mã nguồn mở không đòi hỏi bất kỳ mã để được chia sẻ với những người khác Nếu bạn sử dụng Contiki để phát triển mã, mã của bạn là của riêng bạn và bạn không cần phải chia sẻ nó với bất cứ ai
Điều đó nói rằng, họ thực sự đánh giá cao những đóng góp mã cho Contiki Nếu bạn muốn đóng góp mã nguồn cho dự án Contiki, tuy nhiên, họ yêu cầu mã này được kèm theo bởi giấy phép tương tự như phần còn lại của Contiki
Tái phân phối và sử dụng trong mã nguồn và các dạng nhị phân, có hoặc không có sửa đổi, được cho phép cung cấp các điều kiện sau được đáp ứng:
1 Việc phân phối lại mã nguồn phải giữ lại bản quyền trên thông báo, danh sách điều
kiện và khuyến cáo kèm theo
2 Việc phân phối lại dưới dạng nhị phân phải tạo lại được bản quyền trên thông báo,
danh sách điều kiện và khuyến cáo kèm theo trong tài liệu và / hoặc các tài liệu khác được cung cấp với sự phân bố
3 Tên của các tác giả có thể không được sử dụng để nhận hoặc quảng bá các sản
phẩm có nguồn gốc từ phần mềm này mà không có trước sự cho phép khi cụ thể nào bằng văn bản
Phần mềm này được cung cấp của tác giả `` as is '' và bất cứ sự trình bày hoặc sự đảm bảo, sự kèm theo nhưng không giới hạn hay các đảm bảo đảm thương mại và phù hợp cho một mục đích cụ thể thể đều bị bác bỏ Trong bất cứ trường hợp tác giả sẽ không chịu trách nhiệm cho bất cứ hành vi trực tiếp, gián tiếp, đặc biệt, hay quả tổn hại (các khoản kèm theo nhưng không giới hạn, sử dụng sản phẩm thay thế hoặc dịch vụ; mất mát về sử dụng, dữ liệu hay lợi nhuận; hoặc kinh doanh gián đoạn) gây ra và về trách nhiệm pháp lý, dù trong hợp đồng, trách nhiệm pháp lý nghiêm ngặt hoặc lỗi (bao gồm cẩn hoặc khác) phát sinh trong bất cứ cách nào ngoài việc sử dụng này phần mềm, ngay cả khi được khuyến cáo về khả năng thiệt hại
Trang 7Tìm hiểu giấy phép BSD
Hình 1 Giấy phép BSD
a Nhà phát hành
Giấy phép BSD (Berkeley Software Distribution License) là một giấy phép phần mềm
tự do với các điều kiện rất đơn giản được sử dụng rộng rãi cho phần mềm máy tính Ban đầu giấy phép BSD được thiết kế bởi Đại học California tại Berkeley năm 1980 cho dự án BSD (Berkeley Source Distribution)
Phải kèm theo 2 thông báo: Danh sách các điều kiện và từ chối trách nhiệm
Không được sử dụng tên dự án hay tên nhà phân phối vào mục đích quảng bá bản thân nếu không được cho phép
Trang 8Như vậy, có thể thấy đặc điểm lớn nhất của BSD là nó cho phép các nhà phát triển phần mềm có thể thương mại hóa một cách thực sự cá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 trên mã nguồn của chương trình (chủ yếu là mã nguồn do họ viết thêm và giữ lại mã nguồn đã được sửa đổi đó cho bản thân mà không công bố) thay vì chỉ có thể kiếm tiền từ các hoạt động không trực tiếp gắn với phần mềm như bảo hành, phát hành, đào tạo hướng dẫn sử dụng … Ngoài ra, giấy phép BSD còn cho phép các nhà phát triển thay thế, bổ sung thêm các điều khoản vào trong giấy phép cho phù hợp với mình, hoặc thậm chí sử
dụng một giấy phép khác
Trang 9II Kiến trúc hệ điều hành Contiki
Giới thiệu contiki
Contiki OS được lập trình bằng ngôn ngữ C, hoạt động dựa trên cơ chế event-driven ( hướng sự kiện) và có những đặc điểm phù hợp với các hệ thống nhúng và mạng cảm biến không dây:
+ Contiki được chia thành nhiều module hoạt động độc lập Nhờ đó các ứng dụng có thể sử dụng các module một cách linh động và chỉ load những module cần thiết
+ Cơ chế hoạt động điều khiển event-driven làm giảm năng lượng tiêu hao và hạn chế dung lượng bộ nhớ cần sử dụng
+ Có thể sử dụng IP trong mạng cảm biến thông qua uIP stack được xây dựng dựa trên nền TCP/IP
+ Có những module cho phép ước lượng và quản lý năng lượng một cách hiệu quả
+ Các giao thức tương tác giữa các lớp và các node trong mạng dễ dàng hơn + Sử dụng RIME stack phục vụ các giao thức dành cho mạng năng lượng thấp một cách hiệu quả
Bên cạnh đó, Contiki còn cung cấp những công cụ hỗ trợ mô phỏng với giao diện đơn giản, dễ sử dụng và hỗ trợ tốt những thiết bị trong thực tế, phục vụ những mục đích nghiên cứu, mô phỏng và triển khai những giao thức mới
Kiến trúc Contiki
Hệ điều hành Contiki được xây dựng theo kiểu kiến trúc module Tức là chia nhỏ các yêu cầu của phần mềm thành các phần hầu như không trùng lặp, và do đó hỗ trợ làm việc song song trên các module và dễ bảo trì hơn Kiến trúc module giúp cho việc tái
sử dụng các thành phần của hệ thống và khả năng mở rộng tốt hơn
Hệ điều hành Contiki được chia thành 2 phần :
Loaded Program: Chứa các chương trình đã được nạp
Core: bao gồm
+ Nhân kernel
+ Tập các process
+ Các thư viện : Chứa các hàm C cho việc thực thi hệ thống
+ Program loader : Nạp các 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 được thực thi như các xử lý event, chạy đến khi hoàn thành event đó Trong mô hình Event-driven, các process thay vì mỗi process một stack như một số mô hình khác thì các process sử dụng cùng
Trang 10một stack, giúp cho hiệu quả chia sẻ của bộ nhớ hạn chế giữa tất cả các process Hai
xử lý sự kiện sẽ không bao giờ chạy đồng thời với nhau
Nhân Contiki bao gồm một bộ lập lịch event làm nhiệm vụ gửi đi các event tới các process đang chạy, và định kì gọi các xử lý polling của process
i Event được chia thành 2 loại:
Event đồng bộ : được gửi ngay lập tức đến target process để lập lịch
Event không đồng bộ : được xếp hàng bởi nhân và được gửi đến các target process sau đó
Process chỉ chạy event tiếp theo khi event trước đó được hoàn thành
ii Lập lịch event
Các event được gửi đến các process
Việc lập lịch event được hoàn thành trong 1 level duy nhất
Các event không chen hàng lẫn nhau Chỉ bị chen hàng bởi ngắt
Không cho phép vô hiệu hóa ngắt
Do đó, không cho phép các event được gửi bởi các xử lý ngắt
iii Cơ chế polling
Contiki cung cấp 1 cờ polling, sử dụng để yêu cầu 1 event poll
Là các event ưu tiên cao, được lập lịch giữa các event không đồng bộ
Khi có yêu cầu polling, cờ cung cấp xử lý ngắt để thực thi event poll đó
Một process được yêu cầu poll bởi hàm process_poll()
Khi được gọi process sẽ được lập lịch nhanh nhất có thể
Khi một event poll được lập lịch, các process mà thực thi xử lý poll, sẽ được gọi, theo thứ tự ưu tiên của chúng
Polling là cách để process chạy từ một ngắt
b Process
Process có thể là một service hoặc 1 chương trình ứng dụng
Các đặc điểm của process:
Thường bắt đầu khi khởi động hệ thống
Được định nghĩa bởi 1 hàm xử lý event và một tùy chọn hàm xử lý poll
Process chạy khi có các event được gửi tới
Tất cả các process chia sẻ cùng không gian địa chỉ
Truyền thông interprocess thông qua Nhân, bởi việc gửi các event
Gồm 2 phần :
Process control block : lưu trong RAM, chứa thông tin như: tên, trạng thái, con trỏ…
Process thread : là code của process, lưu trong ROM
Trạng thái của process được chứa trong bộ nhớ riêng biệt
Trạng thái process chiếm khoảng 23 bytes ( trên ESB platform)
Trang 11 Mỗi process có thể chỉ có 1 thread thực thi
Thread trong Contiki được gọi là protothread
Các đặc điểm của protothreads :
Thread trong Contiki được gọi là Protothreads
Là stackness threads tối ưu hóa cho hệ điều hành event-driven
Prototheads hoạt động ít bộ nhớ ( khoảng 2 byte RAM)
Không yêu cầu stack riêng Tất cả các protothreads chạy trên cùng stack
c Preemptive Multi-threading
Có thể được áp dụng trên nền tảng mỗi process
Thực hiện như một thư viện
Tùy chọn liên kết với các ứng dụng yêu cầu mô hình hoạt động đa luồng một cách rõ rang
Sử dụng Protothreads
Đặc điểm hệ điều hành Contiki
a) Quản lý tác vụ
Hoạt động trong Contiki dựa trên thực thi các process
Các process có thể sử dụng cùng một stack Do đó giúp cho hiệu quả sử dụng
bộ nhớ tốt hơn, tiết kiệm tài nguyên bộ nhớ hơn
Mỗi process có thể chỉ chứa 1 protothread( 2 byte RAM)
Đo đó với 2KB RAM bộ nhớ có thể chạy cùng lúc tối đa tới 1000 process ( thực tế thì rất ít các process chỉ chứa 1 protothread)
b) Cơ chế ngắt
Event chỉ bị chen hàng bởi ngắt Contiki không bao giờ vô hiệu hóa ngắt
Ngắt có thể được thực thi khi sử dụng ngắt phần cứng hoặc điều hành quá trình real-time
Thư viện rtime cung cấp lập lịch các tác vụ real-time, ưu tiên các tác vụ thực thi đúng thời gian đã lập lịch bất kể khi các process đang chạy
c) Cơ chế ưu tiên
Sử dụng cơ chế polling
Ưu tiên thực thi các tác vụ thời gian thực đã được lập lịch
d) Quản lý bộ nhớ
Nhân Contiki không tham gia quản lý bộ nhớ
Contiki hỗ trợ quản lý bộ nhớ đông
Trang 12uIP stack : uIP được thiết kế dựa trên ngôn ngữ C với mục tiêu tối ưu hóa tuyệt đối các đặc tính cần thiết của một stack TCP/IP đầy đủ uIP chỉ có thể hoạt động với một giao diện mạng duy nhất và bao gồm các giao thức: IP, ICMP, UDP, TCP
Một số hàm trong API - uIP:
Khởi tạo kết nối: tcp_connect(), tcp_listen(0, udp_new()
Ngắt một kết nối: uip_close(), uip_abort()
Gửi một gói kiểu TCP: uip_send()
Gửi một gói kiểu UDP: uip_udp_packet_send()
Nhận một gói từ mạng: uip_newdata(), uip_datalen()
Gửi lại một gói dữ liệu: uip_rexmit()
Mở một cổng kết nối: uip_listen()
Kiểm tra kết nối: uip_connected()
Rime stack : Rime stack cung cấp một cấu trúc phân tầng của giao thức mạng cảm biến không dây, từ một bộ phát quảng bá đơn giản tới việc định tuyến rắc rối trong toàn mạng Rime triển khai một giao thức phức tạp, với nhiều phần, mỗi phần lại gồm những module phức tạp được tạo nên từ những module nhỏ lẻ đơn giản hơnSử dụng tài nguyên
Một số module trong Rime stack:
• Một cấu hình Contiki điển hình : 2KB RAM và 40KB ROM
• Một hệ thống cơ bản, cung cấp đa tác vụ và giao thức TCP/IP, có thể được biên dịch trong khoảng 32KB
• 1 hệ thống với đầy đủ IPv6, sleepy router, RPL cần không quá 10KB RAM
và 30KB ROM
g) Platform
Trang 13Contiki hỗ trợ các platform như trong bảng dưới đây
III Cài đặt Contiki cho một phần cứng
Các thành phần của Contiki
Trang 14 Contiki là hệ điều hành mã nguồn mở, được sử dụng chủ yếu cho các hệ thống
mạng cảm biến (Wireless Sensor Networks)
Contiki luôn bao gồm 7 forder:
Trong 7 forder này, các forder chính là: Core, CPU, Platform
a) Core:
Chứa các thành phần chính của hệ điều hành
Contiki
Chứa khoảng 300 file, trong đó:
o Tập tin tiêu đề chứa các khai báo
o Tập tin nguồn chứa cài đặt
Trang 15b) CPU:
Chứa các bộ xử lý cụ thể cho việc
thực hiện các chức năng khác nhau
được sử dụng trong hệ điều hành
Trang 16 Chứa các công cụ phần mềm đặc biệt
Vd: Công cụ mô phỏng Cooja
Build System của Contiki
Contiki có cách thức xây dựng hệ thống (build system) được thiết kế để người dùng dễ dàng chạy Contiki trực tiếp trên phần cứng
Việc xây dựng hệ thống được thiết kế giống nhau trên các nền tảng phần cứng khác nhau, do đó khi chuyển đổi phần cứng các lệnh sẽ giống nhau
Các file của Contiki được viết bằng ngôn ngữ C
Có thể lựa chọn nhiều trình biên dịch khác nhau để viết chương trình như:
Đối với Contiki, việc xây dựng hệ thống bao gồm một tập hợp các Makefile
a Makefile: makefile của project
b Makefile.include: makefile tổng thể của toàn bộ hệ thống Contiki
c Makefile.$(TARGET) (trong đó $(TARGET) là tên của nền tảng hiện đang được xây dựng): các quy tắc cho các nền tảng cụ thể, nằm trong thư mục platform/ Khi cài đặt cho 1 platform cụ thể, ta cần gán tên của platform đó vào biến TARGET
d Makefile.$(CPU) (trong đó $(CPU) là tên của CPU hoặc vi điều khiển được sử dụng trong nền tảng mà Contiki được xây dựng): các quy tắc cho kiến trúc CPU, nằm trong thư mục cpu/
e Makefile.$(APP) (trong đó $(APP) là tên của một ứng dụng trong thư mục app/ ): Quy tắc cho các ứng dụng trong các app/ Mỗi app có makefile riêng của mình
Trang 17 Một số phần cứng được hỗ trợ:
Hình 2: Danh sách phần cứng được Contiki hỗ trợ
Các bước port Contiki lên một phần cứng
a Để port Contiki lên một phần cứng, chúng ta quan tâm đến 2 thư mục:
o CPU
o Platform
b Để cấu hình cho một CPU, chúng ta có thể chỉnh sửa những file đã có sẵn trong
thư mục cpu/native cho phù hợp với phần cứng hiện có:
Trang 18o Các trình biên dịch có thể sử dụng
g Để cấu hình cho platform cụ thể, chúng ta cần chỉnh sửa các file trong thư mục platform/native
h Chỉnh sửa file platform-conf.h để cấu hình tần số của CPU, baudrate cho UART,
xác định platform có nút bấm, pin, radio… hay không
i Chỉnh sửa file contiki-conf.h để cấu hình cho Contiki như: µIP…
j Chỉnh sửa file contiki-platform name-main.c để khởi tạo phần cứng, lập lịch và
chạy các process
k Có thể viết thêm các thư viện cho platform như thư viện mạng …
Cài đặt Contiki lên Kit MSP430
a Giới thiệu Kit MSP430
Sử dụng MSP430G2553 16-bit MCU
16KB bộ nhớ
512B RAM
Tốc độ CPU có thể lên đến 16-MHz
Hỗ trợ ADC 10 bit, UART
b Cài đặt lên Kit MSP430
trang chủ của Contiki cung cấp sẵn phần mềm Instant Contiki Phần mềm này
sẽ tạo ra một hệ điều hành ubuntu ảo và có sẵn các thư mục của Contiki Từ bây giờ, ta sẽ chạy contiki theo các câu lệnh
Giao diện phần mềm Íntant Contiki