1 / 56

Wireless Embedded Systems (0120442x) Node Programming

Wireless Embedded Systems (0120442x) Node Programming. Chaiporn Jaikaeo chaiporn.j@ku.ac.th Department of Computer Engineering Kasetsart University. Outline. Microcontroller programming Software development cycle Hardware platforms IWING-MRF IWING-JN IWING's MoteLib. IWING-MRF Mote.

twila
Download Presentation

Wireless Embedded Systems (0120442x) Node Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Wireless Embedded Systems(0120442x)Node Programming Chaiporn Jaikaeo chaiporn.j@ku.ac.th Department of Computer EngineeringKasetsart University

  2. Outline • Microcontroller programming • Software development cycle • Hardware platforms • IWING-MRF • IWING-JN • IWING's MoteLib

  3. IWING-MRF Mote Analog/Digital sensor connectors Radio transceiver UART connectors USB Connector(for reprogramming and power) 8-bit AVR Microcontroller External battery connector Morakot Saravanee, Chaiporn Jaikaeo, 2010. Intelligent Wireless Network Group (IWING), KU

  4. IWING-JN Mote Wireless microcontrollermodule with PCB antenna Analog/Digital sensor connectors UART connectors

  5. Microcontroller flash memory BSL Typical Development Process • For microcontrollers with bootstrap loader (BSL) installed Source code (C/Asm) Cross Compiler/Assembler Serial/USB Machine code

  6. Build Simple App • Let's build a simple application • How to know whether our program is running? • Make mote output something • What can be used as output?

  7. IWING-MRF Schematic • Available on course's homepage

  8. IWING-MRF – Blinking LED • Task: turn a LED on and off repeatedly • Idea • Configure Port D's Pin 5 (PD5) for output • Repeatedly set the pin logic level to 0 and 1 • Add some delay before toggling pin level

  9. IWING-MRF C Code – blink.c #include <avr/io.h> main() { DDRD |= (1 << 5); // Make PD5 output while (1) { // Set pin logic to low PORTD &= ~(1 << 5); // Add some delay // Set pin logic to high PORTD |= (1 << 5); } } • How to add delay? • Can the code be made shorter?

  10. Compiling • Make an ELF binary by running cross compiler Note: blink.elf is not a Windows or Linux executable! • Translate the object file into ihex format $ avr-gcc -mmcu=atmega328p –o blink.elf blink.c $ avr-objcopy -j .text -j .data –O ihex blink.elf blink.hex

  11. Flashing Code Into Mote • Plug mote into a USB port • Activate boot-loader • Press and release RESET while holding USER/B.L. • Make sure it is recognized by your PC • Invoke chip programmer $ lsusb Bus 003 Device 049: ID 16c0:05dc Bus 001 Device 003: ID 046d:c03d Logitech, Inc. $ avrdude -p atmega328p -c usbasp -U flash:w:blink.hex

  12. IWING-MRF's Boot Loader

  13. Tab character Creating Makefile • To compile • To download program to flash (will compile if needed) make make flash

  14. Software Hardware IWING's MoteLib Morakot Saravanee, Patra Poome, Chaiporn Jaikaeo, 2009. Intelligent Wireless Network Group (IWING), KU

  15. Hardware Abstraction IWING-MRF API Implementation IWING-MRF Hardware

  16. Hardware Abstraction IWING-JN API Implementation IWING-JN Hardware

  17. Virtual Mote Mote and Network Emulator

  18. Radio event handler Sensor event handler Timer event handler Boot event handler Programming Model • MoteLib provides event-based programming environment Idle loop Handled by MoteLib Handled by developer

  19. Example • Turn red LED on and off repeatedly every 500 ms #include <motelib/system.h> #include <motelib/led.h> #include <motelib/timer.h> Timer t; voidfired(Timer *t) { ledToggle(0); } void boot() { timerCreate(&t); timerStart(&t, TIMER_PERIODIC, 500, fired); }

  20. Example: Creating Makefile # Platform to build the code for PLATFORM = iwing-mrf # Required target without extension TARGET = blink # Include MoteLib's main make rules include $(MOTELIB_DIR)/Makerules

  21. Example: Build and Flash App • Build your application • Program the mote with make make flash

  22. MoteLib API • Residing in $(MOTELIB_DIR)/include • motelib/system.h • motelib/led.h • motelib/timer.h • motelib/button.h • motelib/sensor.h • motelib/actor.h • motelib/radio.h • motelib/uart.h • Complete API documentation can be found here • http://www.cpe.ku.ac.th/~cpj/motelib/

  23. System API (motelib/system.h) • Provides boot() function signature • Provides various function declarations for node ID and network ID inquiry • Should be included in every MoteLib application

  24. LED API (motelib/led.h) • Turn LED#2 on • Turn LED#1 off • Toggle LED#0 • Use LEDs to display binary value ledSet(2,1); ledSet(1,0); ledToggle(0); ledSetValue(5);

  25. Timer API (motelib/timer.h) • Define and initialize a timer • Start the timer with 1-second timeout; trigger only once; call function fired when triggered • Start the timer with 1-second timeout; trigger periodically Timer t; timerCreate(&t); timerStart(&t, TIMER_ONESHOT, 1000, fired); timerStart(&t, TIMER_PERIODIC, 1000, fired);

  26. Timer API (cont'd) • Defining callback void fired(Timer *t) { // do something }

  27. Button API (motelib/button.h) • Set handler to monitor button event • Usually called in boot() • Handler example buttonSetHandler(handler); void handler(ButtonStatus s) { if (s == BUTTON_PRESSED) // do something if (s == BUTTON_RELEASED) // do something }

  28. Programming Practice • button-count.c • Counts how many times the USER button has been pressed • Then shows the number (only 3 LSBs) on the LEDs • Count to 7 and wrap around to 0

  29. Sensor API (motelib/sensor.h) • Read digital input from input#0 • Request analog reading (asynchronous) from input#3 uint16_t x = sensorReadDigital(SENSOR_0); sensorRequestAnalog(SENSOR_3, dataReady); : void dataReady(uint16_t value) { // value stores sensor reading }

  30. Actor API (motelib/actor.h) • Activate output #2 (set logic to High) • Deactivate output #3 (set logic to Low) actorSetState(ACTOR_2,1); actorSetState(ACTOR_3,0);

  31. Sensor Board • Measures light and temperature Sensor Power Supply Light Sensor Temperature Sensor

  32. IWING-MRF Schematic

  33. IWING-JN Schematic

  34. Sensor Reading Procedure • Step 1: Turn on sensor power • Step 2: Request analog reading • Step 3: Wait until value is available • Step 4: Turn off sensor power

  35. Controller Sensor Controller Sensor Request Request Ack Blocking Data Ready Read Data Synchronous Operation Asynchronous Operation Split-Phase Operations

  36. Example: sense-light.c • Every 100 ms, measure light and display the value on LEDs • Light value is in range 0 – 1023 • Need to scale down to 0 – 7

  37. Example #include <motelib/system.h> #include <motelib/led.h> #include <motelib/timer.h> #include <motelib/sensor.h> #include <motelib/actor.h> Timer t; void readDone(uint16_t value); void readLight(Timer *t); void boot() { timerCreate(&t); timerStart(&t, TIMER_PERIODIC, 100, readLight); } void readLight(Timer *t) { actorSetState(ACTOR_0, 1); sensorRequestAnalog(SENSOR_1, readDone); } void readDone(uint16_t value) { ledSetValue(value/128); actorSetState(ACTOR_0, 0); }

  38. Programming Practice • Modify sense-light.c so that light is sampled 4 times in each measurement • Average value is displayed on LEDs

  39. Creating a Reading Task Create timer • Event-based code can be difficult to read and maintain • Idea • Make a reading task that runs forever • Other tasks can also be added to run concurrently Start timer Wait until timer expired Turn on sensors Request reading Wait until data ready Complete 4 samples? Compute and display average Turn off sensors

  40. Synchronous Operations • MoteLib provides various checks to support synchronous operation • E.g., • timerExpired(t) • Determines whether timer t has already expired • Only works for one-shot timer • sensorAnalogWaiting(s) • Returns true if the system still waits for sensor s • sensorAnalogResult(s) • Returns the most recent value of sensor s

  41. First Attempt #include <motelib/system.h> #include <motelib/led.h> #include <motelib/timer.h> #include <motelib/sensor.h> #include <motelib/actor.h> Timer t; void readLightTask(); void boot() { readLightTask(); } void readLightTask() { uint8_t i; uint16_t sum = 0; timerCreate(&t); while (1) { timerStart(&t, TIMER_ONESHOT, 100, NULL); while (!timerExpired(&t)) ; actorSetState(ACTOR_0, 1); for (i = 0; i < 4; i++) { sensorRequestAnalog(SENSOR_1, NULL); while (sensorAnalogWaiting(SENSOR_1)) ; sum += sensorAnalogResult(SENSOR_1); } ledSetValue(sum/4/128); actorSetState(ACTOR_0, 0); } } Will this work?

  42. Problem with Event-based Model Events: unstructured code flow Threads: sequential code flow Very much like programming with GOTOs

  43. Events Require One Stack • Four event handlers, one stack Stack is reused for every event handler Eventhandler 1 Eventhandler 2 Eventhandler 3 Eventhandler 4

  44. Problem with Multithreading • Four threads, each with its own stack Thread 1 Thread 2 Thread 3 Thread 4

  45. Emulating Concurrency • Previous example wouldn't work because of the blocking while-loop • Other parts of the system will be unresponsive • Must return to MoteLib inside of the while-loops • During MoteLib's idle loop, keep jumping into the while-loops

  46. Coroutines • Generalized subroutines • Allow multiple entry points for suspending and resuming execution at certain locations • Can be used to implement: • Cooperative multitasking • Actor model of concurrency

  47. Subroutines vs. Coroutines “Subroutines are a special case of coroutines.” --Donald Knuth Fundamental Algorithms. The Art of Computer Programming Routine 2 Routine 1 Routine 1 Routine 2 yield yield call return yield return yield call Subroutines Coroutines

  48. Event handler2 Event handler1 Programming Model call MoteLib'sIdle loop return call return continue Task 1 yield continue Task 2 yield Handled by MoteLib Handled by developer

  49. Implementation Details • How to ask MoteLib to call our tasks? • MoteLib provides setLoopRoutine(), allowing a function to be called every idle loop • How to have a task yield and correctly come back to where it left? void myroutine() { // something to be executed continuously } void boot() { : setLoopRoutine(myroutine); }

  50. Implementing Continuation • Each coroutine must be able to continue from where it last yielded Routine 1 MainLoop continue yield continue yield

More Related