1. Trang chủ
  2. » Luận Văn - Báo Cáo

Làm quen với hệ điều hành contiki trên KIT MSP430G2553

29 1,5K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 1,39 MB

Nội dung

Làm quen với hệ điều hành contiki trên KIT MSP430G2553

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ - VIỄN THÔNG ĐỒ ÁN I THIẾT KẾ PHẦM MỀM Đề tài: LÀM QUEN VỚI HỆ ĐIỀU HÀNH CONTIKI TRÊN KIT MSP430G2553 Giảng viên hướng dẫn: THS NGUYỄN NAM PHONG Hà Nội, 6-2015 MỤC LỤC MỤC LỤC .2 Mở Đầu Phần Giới thiệu hệ điều hành Contiki kit lunchpad MSP430 1.1 Hệ điều hành Contiki 1.1.1 Tổng quan lịch sử phát triển .3 1.1.2 Đặc điểm hệ điều hành Contiki 1.2 Kit MSP430G2553 1.2.1 Tổng quan .4 1.2.2 Cấu trúc 1.2.3 Kết nối UART 1.3 Cài đặt nạp code lên Kit 1.3.1 Cài đặt Contiki 1.3.2Cài đặt eclip .9 1.3.3 Cài contiki launchpad trình biên dịch Phần Tổ chức hệ thống Contiki .11 2.1 Process Contiki .11 2.1.1 The Structure of a Process 11 2.1.1.1 The Process Control Block 12 2.1.1.2 The Process Thread .12 2.1.2 Protothreads 13 2.1.3 Protothreads in Processes 13 2.1.4 Events 14 2.1.4.1 Asynchronous Events 15 2.1.4.2 Synchronous Events 15 2.1.4.3 Polling 15 2.1.5 The Process Scheduler 15 2.1.5.1 Starting Processes 16 2.1.5.2 Exiting and Killing Processes .16 2.1.5.3 Autostarting Processes 16 2.2.1 The Contiki Timer Modules 16 2.2.2 The Clock Module 17 2.2.3 The Timer Library 17 2.3.1 Serial Communication 18 2.1.2 LEDs .19 Phần Giải thích code mẫu tập 21 3.1.1 Blink example .21 3.1.2 Button example .23 3.2.1 Sử dụng cấu trúc tuần tự, lặp, rẽ nhánh 24 3.2.2 Điều khiển leds tập lệnh thông qua uart .26 Mở Đầu Đối với ngành Điện tử truyền thông nói chung Điện tử nói riêng việc lập trình cho vi xử lý vô quan trọng Các phong cách lập trình cũ bị hạn chế nhiều tính song song chương trình Do đó, đồ án nghiên cứu cách lập trình cho vi xử lý sử dụng hệ điều hành contiki Để đơn giản thuận lợi cho trình làm việc liền mạch cho đồ án sau này, sử dụng mạch mô kit MSP430G2533 TI Do thời gian thực kiến thức hạn chế nên nhiều sai sót trình thực đề tài, mong bổ sung đóng góp thầy cô bạn Chúng em xin chân trọng cảm ơn thầy Nguyễn Nam Phong anh Nguyễn Văn Giang nhiệt tình hướng dẫn chúng em suốt trình học tập Phần Giới thiệu hệ điều hành Contiki kit lunchpad MSP430 1.1 Hệ điều hành Contiki 1.1.1 Tổng quan lịch sử phát triển 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 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 1.1.2 Đặc điểm hệ điều hành Contiki Contiki OS lập trình ngôn ngữ C, hoạt động dựa chế event – driven 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 modul hoạt động độc lập Nhờ ứng dụng sử dụng modul cách lih động load modul cần thiết • Cơ chế hoạt động điều khiển kiện 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ó modul 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 khia giao thức 1.2 Kit MSP430G2553 1.2.1 Tổng quan Các dòng vi điều khiển msp430 hãng TI ( Texas Instruments) sản xuất, TI sản xuất cung cấp nhiều linh kiện điện tử module khác, để tìm hiểu bạn tham khảo địa : www.ti.com để biết rõ Vi điều khiển( Micro controller unit – MCU ) đơn vị xử lý nhỏ, tích hợp toàn nhớ ROM , RAM , port truy xuất , giao tiếp ngoại vi trực tiếp chip nhỏ gọn Được thiết kế dựa cấu trúc VONNEUMAN , đặc điểm cấu trúc có bus CPU nhớ (data chương trình) , mà chúng phải có độ rộng bit tương tự MSP430 có số phiênbản như: MSP430x1xx, MSP430x2xx, MSP430x3xx, MSP430x4xx, MSP430x5xx Dưới đặc điểm tổng quát họ vi điều khiển MSP430: + Cấu trúc sử dụng nguồn thấp giúp kéo dài tuổi thọ Pin • Duy trì 0.1µA dòng nuôi RAM • Chỉ 0.8µA real-time clock • 250 µA/ MIPS + Bộ tương tự hiệu suất cao cho phép đo xác • 12 bit 10 bit ADC-200 kskp, cảm biến nhiệt độ, Vref • 12 bit DAC +Bộ giám sát điện áp nguồn 16 bit RISC CPU cho phép nhiều ứng dụng, thể phần kích thước Code lập trình - Thanh ghi lớn nên loại trừ trường hợp tắt nghẽn tập tin làm việc - Thiết kế nhỏ gọn làm giảm lượng tiêu thụ điện giảm giá thành - Tối ưu hóa cho chương trình ngôn ngữ bậc cao C, C++ - Có chế độ định địa - Khả ngắt theo véc tơ lớn + Trong lập trình cho nhớ Flash cho phép thay đổi Code cách linh hoạt, phạm vi rộng, nhớ Flash lưu lại nhật ký liệu 1.2.2 Cấu trúc Hình 1.1 Hình minh họa kit LaunchPad Rev.1.1 (bản ổn định Rev.1.5) Một kit LaunchPad gồm hai thành phần, với GND phủ chung: - Nửa trên: Là phần mạch nạp theo chuẩn spy-bi-wire Jtag (2 dây), kết hợp với chuyển đổi giao tiếp UART với máy tính Trên đầu USBmini để nối với máy tính, phía hàng Header để nối đối tượng cần giao tiếp, bao gồm chân: TXD, RXD: phục vụ giao tiếp UART với máy tính RST, TEST: phục vụ nạp debug (sửa lỗi) theo chuẩn spy-bi-wire Jtag VCC: cấp nguồn 3V3 cho đối tượng (thường nửa LaunchPad) Hình1.2 Các chân - Nửa dưới: mạch phát triển MSP430 đơn giản, bao gồm: Socket cắm MSP430 (thường gắn sẵn chip MSP430G2553), Pad hàn thạch anh, Nút nhấn Reset chip Nút nhấn gắn vào P1.3, hai Led hiển thị có jumper để gắn vào P1.0 P1.6 Hai hàng header để kết nối hai hàng chân chip ngoài, hàng header nguồn GND-GND-VCC để lấy nguồn 3V3 LaunchPad 1.2.3 Kết nối UART UART (Universal Asynchronous Receive/Transmit) – Truyền nhận liệu không đồng Đây giao thức truyền thong phổ biến dòng vi điều khiển Kết nối phần cứng : Hình 1.3 Cấu trúc khung truyền/nhận Hình 1.4 Khung truyền nhận liệu Để sử dụng chế độ này, ta phải thay đổi chân cắm jump hình sau: Hình 1.5 Tinh chỉnh jump chế độ UART 1.3 Cài đặt nạp code lên Kit 1.3.1 Cài đặt Contiki • Step 1: Install Ubuntu - Nên cài Ubuntu Ubuntu 14.04 64bit - Link hướng dẫn: http://topthuthuat.com/thu-thuat-ubuntu/cach-cai-dat-dual-songsong-ubuntu-va-window-7-8 - Lưu ý: Làm theo bước Nếu làm sai dẫn tới tình trạng Ubuntu cài đè lên Windows • Step 2: Install GIT: GIT phần mềm quản lý mã nguồn Mở Terminal lên: Ctrl+Alt+T sudo apt-get update sudo install git • Step 3: Install CONTIKI từ Git Clone git clone https://github.com/contiki-os/contiki.git 1.3.2 Cài đặt eclip • Step 1: Install Java on Ubuntu sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer • Step 2: Download Eclipse Lunar http://www.eclipse.org/downloads/download.php? file=/technology/epp/downloads/release/luna/SR1a/eclipse-cpp-luna-SR1a-linuxgtk.tar.gz • Step 3: Giải nén sử dụng - Khởi động Eclipse - Để Import Contiki vào Eclipse: Chọn Project/Import Chọn Browse chọn thư mục contiki Nhấn Finish 1.3.3 Cài contiki launchpad trình biên dịch • Step 1: Install Build Dependencies sudo apt-get install subversion gcc-4.4 texinfo patch \ libncurses5-dev zlibc zlib1gdev libx11-dev libusb-dev \ libreadline6-dev • Step 2: Install Compiler MSPDebug tar xvfz mspdebug-0.9.tar.gz cd mspdebug-0.9 make sudo make install • Step 3: Install MSP-GCC sudo apt-get install gcc-msp430 • Step 4: Download Contiki for Launchpad git clone git://github.com/msloth/contiki-launchpad.git • Step 5: Make a example cd contiki-launchpad/example/blink make clean make make blink.upload 10 2.1.4.1 Asynchronous Events Asynchronous events chuyển tiếp đến process sau gửi Giữa khoảng thời gian gửi chuyển tiếp, nằm hàng đợi kiện Contiki kernel Process nhận event process cụ thể, tất process chạy Nếu process cụ thể, kernel gọi lên đển cung cấp kiện Nếu nhiều process, kernel cung cấp kiện giống cho tất processs, đến khác Asynchronous events gửi hàm process_post() Đầu tiên hàm kiểm tra kích cỡ hàng đợi lệnh Nếu trống đưa vào, hết chỗ báo lỗi 2.1.4.2 Synchronous Events Khác với Asynchronous events, synchronous events gửi trực tiếp đến process cụ thể Do đó, process gọi trực tiếp không nhận event xử lý xong event 2.1.4.3 Polling Một yêu cầu poll thực hàm process_poll() Khi thực yêu cầu này, process ưu tiên thực nhanh Polling cách để process chạy từ ngắt Hàm process_poll() sử dụng thân protothread, an toàn để dùng preemptive mode 2.1.5 The Process Scheduler Mục tiêu process scheduler để gọi process lên chạy phép Quá trình thực cách gọi hàm thực Process Thread Process scheduler gọi để đáp ứng với kiện gửi tới nó, yêu cầu poll Trong trình gọi, trỏ chưa xác định duyệt Con trỏ cung cấp lệnh gọi lấy giá trị NULL ứng với việc liệu duyệt Khi dùng poll, mặc định liệu duyệt 15 2.1.5.1 Starting Processes Hàm process_start() Mục tiêu hàm thiết lập cấu trúc điều khiển process, thêm process vào danh sách thực thi kernel, gọi code cài đặt process lên Khi hàm process_start() gọi, process bắt đầu Đầu tiên, hàm kiểm tra xem process bắt đầu chưa, chạy hoàn thành Nếu process chưa bắt đầu, process đặt vào danh sách khởi động, trạng thái process thiết lập PROCESS_STATE_RUNNING protothread cài đặt PT_INIT() Cuối cùng, process gửi synchronous event, PROCESS_EVENT_INIT Đồng thời trỏ tới process cần khởi động kèm theo liệu Tuy nhiên, thông thường liệu gửi kèm theo NULL Process cần khởi động kernel gọi lên để nhận synchronous event 2.1.5.2 Exiting and Killing Processes Thoát khỏi process có hai cách: • Tự thoát ra: chương trình tìm đến dòng PROCESS_END() • Thoát chương trình khác PROCESS_EXIT() Khi chương trình thoát, kernel gửi thông báo thoát process cần thoát cho tất process khác sử dụng 2.1.5.3 Autostarting Processes Contiki cung cấp chế giúp tự động bắt đầu process định trước hệ thống khởi động 2.2 Timer 2.2.1 The Contiki Timer Modules Contiki có mô-đun clock nhiều mô-đun timer: timer, stimer, ctimer, etimer, and rtimer Các mô-đun khác thực công việc khác Mô-đun clock cung cấp hàm để điều khiển thời gian hệ thống chặn CPU khoảng thời gian ngắn 16 Timer stimer cung cấp cấu trúc đơn giản thời gian sử dụng kiểm tra khoảng thời gian qua Các ứng dụng cần timer kết thúc Sự khác biệt chúng đơn vị thời gian: timer sử dụng clock hệ thống, stimer sử dụng giây Không giống với timer khác, timer stimer sử dụng an toàn từ ngắt Thư viện etimer cung cấp event timers sử dụng để lên lịch chạy cho process contiki sau khoảng thời gian 2.2.2 The Clock Module Clock module cung cấp hàm để điều khiển thời gian hệ thống The API for the Contiki clock module gồm hàm sau: Hàm clock_time() trả thời gian clock Số clock giây phụ thuộc vào tảng phần cứng xác định số CLOCK_SECOND Clock module có hàm chặn CPU: clock_delay(), clock_wait() Hàm clock_init() gọi suốt trình hệ thống cài clock module The 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 2.2.3 The Timer Library Thư viện Contiki timer cung cấp hàm để tinh chỉnh, khởi động lại timer, kiểm tra timer kết thúc chưa Một ứng dụng phải kiểm tra timers kết thúc chưa tay, không làm tự động Các thư viện timer sử dụng clock_time() để có thời gian hệ thống Một timer khái báo struc timer truy cập thông qua địa trỏ The TimerLibraryAPI: void timer_set(struct timer *t, clock_time_t interval); // Khởi tạo timer void timer_reset(struct timer *t); // khởi động lại timer expired void timer_restart(struct timer *t); // khoi động lại timer int timer_expired(struct timer *t); // kiểm tra timer expired 17 clock_time_t timer_remaining(struct timer *t); // trả giá trị lại tính đến timer expired The EtimerLibraryAPI: 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 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 2.3 Input and output Các loại thiết bị I/O có sẵn để người lập trình phụ thuộc nhiều vào tảng phần cứng sử dụng Contiki cung cấp giao diện bản: serial I/O LEDs Serial output hỗ trợ API C để print, serial input phụ thuộc vào chế riêng Contiki LEDs API, cung cấp lệnh để sử dụng thuộc tính LEDs 2.3.1 Serial Communication The serial I/O API int printf(const char *format, ); // in chuỗi *format int putchar(int c); // in kí tự đơn Printing Sử dụng printf() giống C Receiving Contiki có giao tiếp xác định core/dev/serial-line.h Hàm serial_line_init() phải gọi lên trước gọi serial_line_process để serial_line_process thêm vào process_list 18 Hình 2.4 Quá trình nhận liệu qua uart Một ngắt phát có kí tự đọc từ serial port Quá trình điều khiển ngắt gọi serial_line_input_byte, chiếm nhớ đệm dòng kí tự nhận Sau nhận xâu kí tự hoàn chỉnh, phát event cho tất process Serial_line_input_byte() hàm callback, nhận bytes đầu vào Hàm ghi vào nhớ đệm dòng ngắt nhận, sau gọi hàm serial_line_process Kích thước nhớ đệm cho serial lines điều thông qua tham số SERIAL_LINE_CONF_BUFSIZE, mặc định 80bytes Nếu dòng lớn nhận, (chỉ có SERIAL_LINE_CONF_BUFSIZE-1) bytes nil byte cho qua để vào serial_line_process serial_line_process truy ền mộ serial_line_event_message() t ới t ất c ả process h ệ th ống Serial line driver có hàm để điều khiển đầu vào: IGNORE_CHAR(c) có chức lọc đơn giản, trả giá trị kí tự c Còn không chuyển mã ascii kí tự đến nhớ đệm gọi seral_line_process lên 2.1.2 LEDs LEDs đơn giản công cụ quan trọng để giao ti ếp với ng ười dùng debug chương trình LEDs API thể The LEDsAPI void leds_init(void); // Khởi tạo sử dụng LEDs unsigned char leds_get(void); // Lấy trạng thái leds 19 void leds_on(unsigned char ledv); // bật LEDs void leds_off(unsigned char ledv); // tắt LEDs void leds_toggle(unsigned char ledv); // đổi trạng thái LEDs void leds_invert(unsigned char ledv); // đổi trạng thái LEDs Các led đượ c l b ằng hàm leds_get() Hàm tr ả v ề LED vector ki ểu unsigned char, bit đại di ện cho màu c LED LEDidentifiersfor use in LEDvectors #define LEDS_GREEN #define LEDS_YELLOW #define LEDS_RED #define LEDS_ALL 20 Phần Giải thích code mẫu tập 3.1 Code mẫu 3.1.1 Blink example #include #include "contiki.h" // thu vien contiki #include "dev/leds.h" // thu vien leds /* Khoi tao process control block */ PROCESS(red_process, "Red light process"); PROCESS(blink_process, "Blink"); AUTOSTART_PROCESSES(&blink_process); /* */ /* This process is started from the other process and blinks an LED fast 10 */ 11 static struct etimer etr; 12 PROCESS_THREAD(red_process, ev, data) 13 { 14 PROCESS_POLLHANDLER(); 15 PROCESS_EXITHANDLER(); 16 PROCESS_BEGIN(); 17 while(1) { 18 leds_toggle(LEDS_RED); 19 etimer_set(&etr, CLOCK_SECOND/8); 20 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&etr)); 21 } 22 PROCESS_END(); 23 } 24 /* */ 25 /* this process starts another process and then periodically blinks an LED */ 26 static struct etimer et; 27 PROCESS_THREAD(blink_process, ev, data) 28 { 29 PROCESS_BEGIN(); 30 etimer_set(&et, CLOCK_SECOND); 31 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 32 process_start(&red_process, NULL); 33 while(1) { 34 /* unnecessary, messy but wanted sth else than what the red process a is doing so instead of just toggling, turn on when even seconds and b turn off on uneven seconds 35 */ 36 if(clock_seconds() & 1) { 37 leds_on(LEDS_GREEN); 38 } else { 21 39 leds_off(LEDS_GREEN); 40 } 41 etimer_set(&et, CLOCK_SECOND); 42 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 43 } 44 PROCESS_END(); 45 } 46 /* -*/ Mở đầu chương trình, dòng đầu tiên, khai báo thư viện sử dụng Ở dòng 5, 6, ta khởi tạo process control block Mỗi process có biến tên process phần mô tả Ở ví dụ này, tên red_process mô tả Red light process Sau khởi tạo, biến tên process dược sử dụng cho hàm khác Ở dòng 7, ta bắt gặp cấu trúc AUTOSTART_PROCESSES(), lên danh sách chương trình phép tự động khởi chạy hệ thống bật sau code nạp, ví dụ blink_process Dòng 12 khai báo process thread, bao gồm biến tên(đã khởi tạo dòng 5), tên cảu event biến ev, data Dòng 16 22 thành phần process thread, cặp hàm PROCESS_BEGIN() PROCESS_END() Ở cặp hàm chương trình Dòng 17 bắt đầu vòng lặp vô hạn, nhiên thực tế, Contiki không chạy vòng lặp vô hạn, mà dừng để đợi event Trong vòng lặp gặp hàm đảo trạng thái led, leds_toggle() set etimer, etimer_set() Khi gặp lệnh lật trạng thái, led đỏ tắt sáng Nó sáng đến bao giờ? Vấn đề giải việc kiểm soát thống qua trình chặn CPU biến etimer khai báo dòng 11 etr set với giá trị CLOCK_SECOND/8, sau lệnh đợi có điều kiện PROCESS_WAIT_EVENT_UNTIL() Chỉ cần hết thời gian set, etimer_expired(&etr)=1, điều kiện đúng, chương trình quay đầu vòng lặp, led sáng tắt Quá trình lặp lại liên tục làm led đỏ nháy với chu kì 1/8s Từ dòng 26 đến 45 tương tự chương trình nháy led xanh Trong dòng 30 đến 32, đợi 1s gọi chương trình nháy led đỏ lên Ở dòng 36 đến 40 chế nháy khác, ta kiểm tra clock_seconds(), số giây hàm đếm lẻ sáng led xanh, chẵn tắt 22 Thực chương trình: Ban đầu chương trình tự chạy vào blink_process Đến dòng 32 led đỏ gọi nháy với chu kì 1/8s Led xanh nháy với chu kì 1s 3.1.2 Button example #include #include #include #include "contiki.h" "dev/leds.h" "dev/button.h" /* - */ PROCESS(button_process, "Button process"); PROCESS(blink_process, "Blink process"); AUTOSTART_PROCESSES(&blink_process, &button_process); /* */ 10 static struct etimer etr; 11 PROCESS_THREAD(button_process, ev, data) 12 { 13 PROCESS_POLLHANDLER(); 14 PROCESS_EXITHANDLER(); 15 PROCESS_BEGIN(); 16 static uint8_t btnpresses = 0; 17 while(1) { 18 PROCESS_WAIT_EVENT_UNTIL(ev == button_event); 19 leds_toggle(LEDS_RED); 20 btnpresses++; 21 if(btnpresses == 5) { 22 process_exit(&blink_process); 23 } 24 } 25 PROCESS_END(); 26 } 27 /* -*/ 28 /* this process periodically blinks an LED */ 29 static struct etimer et; 30 PROCESS_THREAD(blink_process, ev, data) 31 { 32 PROCESS_BEGIN(); 33 while(1) { 34 leds_toggle(LEDS_GREEN); 35 etimer_set(&et, CLOCK_SECOND/8); 36 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 37 } 38 PROCESS_END(); 39 } 40 /* */ Chương trình minh hoạ cho việc điều khiển phím bấm, bấm led đỏ sáng tắt theo lần bấm, đến lần thứ thoát blink_process phím bấm lại 23 Process blink phân tích ví dụ phía trên, ta xem xét đến process button Dòng 18, cho ta thấy lần nút bấm, điều kiện đúng, chương trình chuyển đến dòng 19, led đỏ lật trạng thái Dòng 16, biến btnpresses khai báo với giá trị mặc định 0, biến lưu trữ số lần bấm phím, dòng 20 ta thấy lần bấm phím btnpresses tăng lên đơn vị Trong vòng lặp, chương trình đợi đến phím bấm bắt đầu thực Đầu tiên led đỏ lật sáng thái(đang tắt sáng lên) Nếu bấm đến lần thứ thoát chương trình nháy led xanh 3.2 Bài tập 3.2.1 Sử dụng cấu trúc tuần tự, lặp, rẽ nhánh Cấu trúc đươc thể ví dụ phần trên, chí button example ta bắt gặp cấu trúc lặp Tuy nhiên để hiểu rõ lặp ta thực toán sau: Ban đầu led tắt, nhấn nút đèn nháy với chu kì khác nhau, bấm thêm lần đèn đỏ tắt, bấm tiếp thêm lần đèn xanh tắt /*Code minh hoa re nhanh thong qua nut bam*/ #include #include "contiki.h" #include "dev/leds.h" #include "dev/button.h" //khai bao ca thu vien PROCESS(button_process, "Button process"); PROCESS(red_process, "Red light process"); PROCESS(green_process, "Green process"); 10 AUTOSTART_PROCESSES(&button_process); 11 // khoi tao cac process va chon process bat dau 12 static struct etimer etr; 13 PROCESS_THREAD(button_process, ev, data) 14 { 15 PROCESS_POLLHANDLER(); 16 PROCESS_EXITHANDLER(); 17 PROCESS_BEGIN(); 18 static uint8_t btnpresses = 0; // khoi tao bien dem so lan bam 19 while(1) { 20 PROCESS_WAIT_EVENT_UNTIL(ev == button_event); 21 btnpresses++; // moi nut dc bam btnpresses tang them 22 // neu bam nut lan thu nhât thi se khoi dong chuong trinh nhay led 23 if(btnpresses == 1) { 24 24 process_start(&red_process, NULL); 25 process_start(&green_process, NULL); 26 } 27 // nut dc bam them lan thi thoat va tat led 28 if(btnpresses == 6) { 29 process_exit(&red_process); 30 leds_off(LEDS_RED); 31 } //nut duoc bam them lan nua thi thoat va tat led xanh 32 if(btnpresses == 11) { 33 process_exit(&green_process); 34 leds_off(LEDS_GREEN); 35 } 36 } 37 PROCESS_END(); 38 } 39 /********Process nhay led =*********/ 40 static struct etimer etr; 41 PROCESS_THREAD(red_process, ev, data) / 42 { 43 PROCESS_BEGIN(); 44 while(1) { 45 leds_toggle(LEDS_RED); 46 etimer_set(&etr, CLOCK_SECOND/2); 47 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&etr)); 48 } 49 PROCESS_END(); 50 } 51 /* -Process nhay led xanh -*/ 52 static struct etimer et; 53 PROCESS_THREAD(green_process, ev, data) 54 { 55 PROCESS_BEGIN(); 56 while(1) { 57 leds_toggle(LEDS_GREEN); 58 etimer_set(&et, CLOCK_SECOND/4); 59 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 60 } 61 PROCESS_END(); 62 } Để minh hoạ cho cấu trúc lặp, ta xét toán sau: Khi code nạp vào, led đỏ sáng 3s đến led xanh sáng 1s Quá trình lặp lặp lại /* *Chuong trinh chay led sang 3s sau led xanh sang s *Qua trinh duoc lap lai tuan hoan */ #include #include "contiki.h" #include "dev/leds.h" /* - */ PROCESS(red_process, "Red light process"); 10 PROCESS(green_process, "Green light process"); 11 AUTOSTART_PROCESSES(&green_process); 12 /* */ 25 13 /* Chuong trinh chay vao red_process truoc*/ 14 static struct etimer etr; // khai bao etr la bien etimer 15 PROCESS_THREAD(red_process, ev, data) { 16 17 18 19 20 21 PROCESS_BEGIN(); leds_on(LEDS_RED); // sang led etimer_set(&etr, CLOCK_SECOND*3); // cho sang 3s PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&etr)); leds_off(LEDS_RED); // tat led process_start(&green_process, NULL); // chay green_process 22 PROCESS_END(); 23 } 24 /* -Chuong trinh nhay led xanh -*/ 25 static struct etimer et; 26 PROCESS_THREAD(green_process, ev, data) 27 { 28 29 30 31 32 33 PROCESS_BEGIN(); leds_on(LEDS_GREEN); // sang led xanh etimer_set(&et, CLOCK_SECOND); // cho sang 1s PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); leds_off(LEDS_GREEN); // tat led xanh process_start(&red_process, NULL); // chay ctrinh led 34 PROCESS_END(); 35 } 3.2.2 Điều khiển leds tập lệnh thông qua uart Sử dụng HĐH contiki, viết code cho kit launchpad thực nhiệm vụ Kit launchpad kết nối với PC thông qua cổng UART nhận lệnh điều khiển từ PC qua terminal Tập lệnh quy định: redx (trong x số nguyên bất kì) : led đỏ nháy với chu kì x(ms) offred: led đỏ tắt greenon: led xanh sáng grennoff: led xanh tắt Khi truyền xong lệnh kit báo về: Đã truyền xong lệnh: Phân tích toán: Chúng ta biết chuỗi kí tự truyền thành công vào kit, giá trị lưu lại xâu kí tự Ở toán cần lấy giá trị x nhập lệnh redx nên cần đoạn chương trình thực việc tách giá trị nguyên x 26 từ xâu “redx” Ý tưởng thực ta tạo mang lưu trữ chữ số redx, sau chuyển mảng số nguyên hàm atoi() Vấn đề lại nháy led truyền thông tin phản hồi từ kit phân tích ví dụ trước Ta thực hoá ý tưởng Code: /* Giao tiep uart: pc vs kip msp430 redx: nhay led voi chu ki x greenon: sang led xanh greenoff: tat led xanh offred: tat led Kit sau nhan duoc tin hieu tra ve: Da truyen xong lenh: */ #include "contiki.h" #include // thu vien dung cho serial output: printf() #include // thu vien su dung ham cua xau ki tu #include "dev/leds.h" // thu vien su dung led #include "dev/serial-line.h" // thu vien quan ly dong lenh nhan: serial input #include // thu vien chua ham tinh toan gia tri cho x #include // thu vien chua ham chuyen doi xau #include /* Khoi tao process control block -*/ PROCESS(serial_read_process, "Serial Reader"); // process doc lenh input PROCESS(red_process, "Red blink");// // process nhay led AUTOSTART_PROCESSES(&serial_read_process); // thiet lap process khoi dong /* */ /* process doi den nhan duoc du lieu input va tra ve ket qua thong bao * neu go cac tap lenh quy uoc, chuong trinh se chay theo yeu cau */ int a; // khai bao bien a, su dung de luu gtri x lenh redx static struct etimer etr; // khai bao bien etr kieu etimer kiem soat thoi gian chay /* khoi tao process thread chua code chinh */ PROCESS_THREAD(serial_read_process, ev, data) { PROCESS_BEGIN(); //cau lenh bat dau process printf("Xin moi ban nhap lenh\n"); // dong lenh duoc in khoi dong while (1) { char* buf; // khai bao bo dem, luu tru du lieu input char b[10]; // mang b la mang chua chu so tach tu input int i, j; // bien chay i,j de quet phan tu PROCESS_WAIT_EVENT_UNTIL(ev == serial_line_event_message); // chuong trinh doi cho den co du lieu dc truyen vao buf = data; // luu tru data vao mang buf if(!strncmp(buf, "red", 3)) { /*neu lenh go vao co dang redx se thuc hien chuyen doi*/ char cpy [100]; // khai bao mang cpy strcpy(cpy, data); // copy du lieu tu data vao mang cpy i=0; j=0; // khoi tao bien dem 27 for (i = 0; i < strlen(cpy); i++) { //thuc hien quet ki tu if (isdigit(cpy[i])) { // neu gap phai ki tu chu so b[j] = cpy[i]; // copy sang mang b j++; } b[j]=NULL;// xoa mang b de chuan bi cho lenh tiep theo } a= atoi(b); // chuyen mang b tu ki tu sang so nguyen process_start(&red_process,NULL); // chay chuong trinh nhay led } else if (!strncmp(buf, "greenon", 7)) { leds_on(LEDS_GREEN); // bat led xanh } else if (!strncmp(buf, "greenoff", 8)) { leds_off(LEDS_GREEN); // tat led xanh } else if (!strncmp(buf, "offred", 6)) { process_exit(&red_process); // thoai khoi process nhay led leds_off(LEDS_RED); // tat led } printf("\n Da truyen xong lenh: %s\n", buf); // Truyen ve pc thong bao } PROCESS_END(); // ket thuc hoat dong cua process } /* */ /* led nhay voi chu ki phu thuoc vao x redx */ static struct etimer etr; PROCESS_THREAD(red_process, ev, data) { PROCESS_POLLHANDLER(); PROCESS_EXITHANDLER(); PROCESS_BEGIN(); while(1) { leds_toggle(LEDS_RED); // doi trang thai led etimer_set(&etr, (CLOCK_SECOND*a)/1000); // thiet lap chu ki nhay= ams PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&etr)); // doi den etr expired thi lap } PROCESS_END(); } Sau nạp code vào kit, sử dụng lệnh make login để đăng nhập vào kit Tuy nhiên lệnh gặp lỗi ubuntu Do đó, ta kiểm tra kết phần mềm hercules môi trường windown Hướng dẫn sử dụng phần mềm tham khảo địa chỉ: http://smart-techvn.com/6724-hoc-msp430-voi-kit-msp430launchpad-bai-5-uart.html Kết thu hình hiển thị 28 Hình 3.1 Kết giao diện 29 [...]... code cho phép hệ thống chạy các hoạt động khác khi đợi một điều gì đó xảy ra Protothreads ở đây khai thác trực tiếp trong hệ điều hành contiki, ngoài ra nó được sử dụng tốt trong các lĩnh vực khác Protothread cho phép sử dụng các hàm có trong C giống như trong threads mà không bị tràn bộ nhớ Nó giảm dung lượng bộ nhớ và là điều rất quan trọng trong các hệ thống có bộ nhớ khiêm tốn sử dụng Contiki Protothread... 3.2.2 Điều khiển leds bằng tập lệnh thông qua uart Sử dụng HĐH contiki, viết code cho kit launchpad thực hiện nhiệm vụ Kit launchpad kết nối với PC thông qua cổng UART nhận lệnh điều khiển từ PC qua terminal Tập lệnh được quy định: redx (trong đó x là 1 số nguyên bất kì) : led đỏ sẽ nháy với chu kì x(ms) offred: led đỏ tắt greenon: led xanh sáng grennoff: led xanh tắt Khi đã truyền xong lệnh thì kit. ..Phần 2 Tổ chức và hệ thống Contiki 2.1 Process Contiki Code trong Contiki được chia làm một trong hai loại: • Cooperative code: Đoạn code này sẽ chạy tuần tự, code trước hoàn thành thì nó mới thực hiện • Preemptive code: Đoạn mã này được dùng để ngắt hoặc khi sử dụng realtime timers Hình 2.1 Các loại code processes Tất cả các chương trình trong contiki được gọi là processes Mỗi processes... nạp code vào kit, chúng ta sử dụng lệnh make login để đăng nhập vào kit Tuy nhiên lệnh này gặp lỗi trên ubuntu Do đó, ta sẽ kiểm tra kết quả bằng phần mềm hercules trên môi trường windown Hướng dẫn sử dụng phần mềm này có thể tham khảo ở địa chỉ: http://smart-techvn.com/6724-hoc-msp430-voi -kit- msp430launchpad-bai-5-uart.html Kết quả thu được trên màn hình hiển thị 28 Hình 3.1 Kết quả trên giao diện... 2.1.5.3 Autostarting Processes Contiki cung cấp một cơ chế giúp tự động bắt đầu một process chỉ định trước khi hệ thống khởi động 2.2 Timer 2.2.1 The Contiki Timer Modules Contiki có một mô-đun clock và nhiều mô-đun timer: timer, stimer, ctimer, etimer, and rtimer Các mô-đun khác nhau thực hiện các công việc khác nhau Mô-đun clock cung cấp các hàm để điều khiển thời gian của hệ thống cũng như chặn CPU... đơn vị thời gian: timer sử dụng clock hệ thống, stimer sử dụng giây Không giống với các timer khác, timer và stimer có thể sử dụng an toàn từ ngắt Thư viện etimer cung cấp event timers và sử dụng để lên lịch chạy cho các process contiki sau một khoảng thời gian 2.2.2 The Clock Module Clock module cung cấp hàm để điều khiển thời gian của hệ thống The API for the Contiki clock module gồm những hàm sau:... cho việc điều khiển phím bấm, khi bấm thì led đỏ sáng tắt theo các lần bấm, đến lần thứ 5 thì thoát blink_process nếu phím được bấm lại 23 Process blink này đã được phân tích ở ví dụ phía trên, ở đây ta chỉ xem xét đến process button Dòng 18, cho ta thấy mỗi lần nút được bấm, điều kiện đúng, chương trình chuyển đến dòng 19, led đỏ sẽ được lật trạng thái Dòng 16, biến btnpresses được khai báo với giá... lc_t; LC_INIT(c) c = 0 LC_RESUME(c) switch(c) { case 0: LC_SET(c) c = LINE ; case LINE : LC_END(c) } 2.1.3 Protothreads in Processes Trong Contiki, protothread được sử dụng dưới những câu lệnh riêng, có phần khác biệt so với nguyên bản ở trên Các hàm trong Contiki processes: PROCESS_BEGIN(); // Khai báo bắt đầu process' protothread PROCESS_END(); // Khai báo kết thức process' protothread PROCESS_EXIT();... etimer đã được khai báo ở dòng 11 etr được set với giá trị CLOCK_SECOND/8, sau đó là lệnh đợi có điều kiện PROCESS_WAIT_EVENT_UNTIL() Chỉ cần hết thời gian được set, etimer_expired(&etr)=1, điều kiện đúng, chương trình sẽ quay về đầu vòng lặp, và led đang sáng sẽ tắt Quá trình này lặp lại liên tục làm led đỏ nháy với chu kì 1/8s Từ dòng 26 đến 45 tương tự là chương trình nháy led xanh Trong dòng 30 đến 32,... khi hệ thống được bật hoặc ngay sau khi code được nạp, trong ví dụ này là blink_process Dòng 12 khai báo process thread, nó bao gồm biến tên(đã được khởi tạo ở dòng 5), ngoài ra tên cảu event là biến ev, và data Dòng 16 và 22 là thành phần cơ bản của process thread, cặp hàm PROCESS_BEGIN() và PROCESS_END() Ở giữa cặp hàm này là chương trình chính Dòng 17 bắt đầu một vòng lặp vô hạn, tuy nhiên trên

Ngày đăng: 26/05/2016, 15:41

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w