Enhancing Embedded Development with Ruby RubyConf 2007 · Enhancing Embedded Development with Ruby...

Preview:

Citation preview

Enhancing Embedded Development with Ruby

RubyConf 2007Bill BerezaAtomic Objectatomicobject.com

Sunday, November 4, 2007

What?

Sunday, November 4, 2007

Embedded C

Sunday, November 4, 2007

8-bit PIC micro

Sunday, November 4, 2007

How?

Sunday, November 4, 2007

rake

Sunday, November 4, 2007

argent

Sunday, November 4, 2007

C unit tests

Sunday, November 4, 2007

C mocks generated by Ruby

Sunday, November 4, 2007

system testing in Ruby

Sunday, November 4, 2007

continuous integration

Sunday, November 4, 2007

Why?

Sunday, November 4, 2007

In the beginning...

Sunday, November 4, 2007

programming required intense knowledge of the

machine

Sunday, November 4, 2007

computers

Sunday, November 4, 2007

not powerful

Sunday, November 4, 2007

and tools were primitive

Sunday, November 4, 2007

and there was much pain

Sunday, November 4, 2007

Sunday, November 4, 2007

along came

Sunday, November 4, 2007

compilers

Sunday, November 4, 2007

languages

Sunday, November 4, 2007

libraries

Sunday, November 4, 2007

which helped some

Sunday, November 4, 2007

Today

Sunday, November 4, 2007

automated tests

Sunday, November 4, 2007

code generation

Sunday, November 4, 2007

domain specific languages.

Sunday, November 4, 2007

but

Sunday, November 4, 2007

there's a problem.

Sunday, November 4, 2007

embedded devices

Sunday, November 4, 2007

are small

Sunday, November 4, 2007

cheap

Sunday, November 4, 2007

and they're everywhere.

Sunday, November 4, 2007

The problem is

Sunday, November 4, 2007

they are everywhere

Sunday, November 4, 2007

they all have software

Sunday, November 4, 2007

software contains bugs.

Sunday, November 4, 2007

How it's usually done

Sunday, November 4, 2007

write

Sunday, November 4, 2007

flash

Sunday, November 4, 2007

fiddle

Sunday, November 4, 2007

debug

Sunday, November 4, 2007

scope

Sunday, November 4, 2007

try again.

Sunday, November 4, 2007

Unrepeatable

Sunday, November 4, 2007

This leads to

Sunday, November 4, 2007

hope

Sunday, November 4, 2007

anger

Sunday, November 4, 2007

fear.

Sunday, November 4, 2007

The Goal

Sunday, November 4, 2007

Apply good practices

Sunday, November 4, 2007

automation

Sunday, November 4, 2007

unit tests

Sunday, November 4, 2007

system tests

Sunday, November 4, 2007

user stories

Sunday, November 4, 2007

behavior driven

Sunday, November 4, 2007

mocking

Sunday, November 4, 2007

continuous integration.

Sunday, November 4, 2007

Vendor tools suck.

Sunday, November 4, 2007

Sunday, November 4, 2007

IDEs oversimplify

Sunday, November 4, 2007

and

Sunday, November 4, 2007

also fail to do

Sunday, November 4, 2007

what is needed,

Sunday, November 4, 2007

like test

Sunday, November 4, 2007

and automate.

Sunday, November 4, 2007

Debugging tools

Sunday, November 4, 2007

are plentiful,

Sunday, November 4, 2007

testing support is rare.

Sunday, November 4, 2007

Solution.

Sunday, November 4, 2007

Ruby

Sunday, November 4, 2007

& tools written in

Sunday, November 4, 2007

ruby

Sunday, November 4, 2007

provide glue

Sunday, November 4, 2007

for

Sunday, November 4, 2007

all good practices.

Sunday, November 4, 2007

The Project

Sunday, November 4, 2007

Automated guided vehicles

Sunday, November 4, 2007

which are

Sunday, November 4, 2007

self propelled

Sunday, November 4, 2007

semi-autonomous

Sunday, November 4, 2007

factory vehicles.

Sunday, November 4, 2007

Sunday, November 4, 2007

4 basic types

Sunday, November 4, 2007

forklifts

Sunday, November 4, 2007

tow vehicles

Sunday, November 4, 2007

unit load carriers (lift material on back)

Sunday, November 4, 2007

carts (items are placed on the back)

Sunday, November 4, 2007

Shared hardware architecture

Sunday, November 4, 2007

configurable boards

Sunday, November 4, 2007

for

Sunday, November 4, 2007

steering

Sunday, November 4, 2007

speed

Sunday, November 4, 2007

battery

Sunday, November 4, 2007

navigation.

Sunday, November 4, 2007

Our first project

Sunday, November 4, 2007

speed control

Sunday, November 4, 2007

Our second project

Sunday, November 4, 2007

battery monitor

Sunday, November 4, 2007

Sunday, November 4, 2007

Embedded C

Sunday, November 4, 2007

Microchip PIC18F2480

Sunday, November 4, 2007

16 kilobytes

Sunday, November 4, 2007

FLASH

Sunday, November 4, 2007

768 bytes

Sunday, November 4, 2007

RAM

Sunday, November 4, 2007

How Ruby helped

Sunday, November 4, 2007

rake

Sunday, November 4, 2007

rake test:system

Sunday, November 4, 2007

Written in

Sunday, November 4, 2007

Ruby.

Sunday, November 4, 2007

Uses systir

Sunday, November 4, 2007

system testing framework

Sunday, November 4, 2007

An example:

Sunday, November 4, 2007

proves "the instantaneous battery level reported via CAN is correct."

set_battery_level_display_instantaneousset_can_status_mode_to CAN_STATUS_NORMAL

set_battery_data 700, 24, FLOODEDset_battery_current_for_vehicle_consuming_charge_with_amps 40set_battery_voltage 24 wait_for_battery_level_output 4

set_battery_voltage 25.80verify_battery_level_output_is 9

set_battery_voltage 22.8verify_battery_level_output_is 0

Sunday, November 4, 2007

System tests

Sunday, November 4, 2007

are function calls

Sunday, November 4, 2007

in bm_driver.rb

Sunday, November 4, 2007

def set_battery_voltage(voltage) @minilab.write_analog( VOLTAGE_OUTPUT_PIN, voltage / BATTERY_VOLTAGE_DIVIDER) end

Sunday, November 4, 2007

Ruby C extensions

Sunday, November 4, 2007

minilab

Sunday, November 4, 2007

Hardware

Sunday, November 4, 2007

digital & analog I/O

Sunday, November 4, 2007

Ruby class

Sunday, November 4, 2007

provides

Sunday, November 4, 2007

read_analog(channel)

Sunday, November 4, 2007

write_analog(channel, volts)

Sunday, November 4, 2007

read_digital(pin)

Sunday, November 4, 2007

write_digital(pin)

Sunday, November 4, 2007

The box

Sunday, November 4, 2007

is wired

Sunday, November 4, 2007

to the board.

Sunday, November 4, 2007

pcan

Sunday, November 4, 2007

Hardware

Sunday, November 4, 2007

CAN bus

Sunday, November 4, 2007

to USB

Sunday, November 4, 2007

The vehicles

Sunday, November 4, 2007

use CAN

Sunday, November 4, 2007

internally

Sunday, November 4, 2007

between each board.

Sunday, November 4, 2007

We use CAN

Sunday, November 4, 2007

in system tests

Sunday, November 4, 2007

to

Sunday, November 4, 2007

simulate the system.

Sunday, November 4, 2007

Ruby class

Sunday, November 4, 2007

provides

Sunday, November 4, 2007

message methods.

Sunday, November 4, 2007

receive_message(timeout)

Sunday, November 4, 2007

transmit_message message

Sunday, November 4, 2007

The Build Server

Sunday, November 4, 2007

connected via

Sunday, November 4, 2007

pcan and minilab

Sunday, November 4, 2007

to the board.

Sunday, November 4, 2007

Sunday, November 4, 2007

rake test:units

Sunday, November 4, 2007

written in C

Sunday, November 4, 2007

unity

Sunday, November 4, 2007

C unit test library

Sunday, November 4, 2007

small enough

Sunday, November 4, 2007

argent

Sunday, November 4, 2007

per unit test file

Sunday, November 4, 2007

//[[$argent require 'generate_unity.rb'; generate_unity();$]]//[[$end$]]

Sunday, November 4, 2007

parses test.c

Sunday, November 4, 2007

generates and inserts

Sunday, November 4, 2007

C code

Sunday, November 4, 2007

main()

Sunday, November 4, 2007

calls to unit tests

Sunday, November 4, 2007

//[[$argent require 'generate_unity.rb'; generate_supermock("Model,Utilities");$]]//[[$end$]]

Sunday, November 4, 2007

initializes mocks

Sunday, November 4, 2007

for _all_ C files

Sunday, November 4, 2007

except the ones passed in

Sunday, November 4, 2007

Model,Utilities

Sunday, November 4, 2007

CMock

Sunday, November 4, 2007

quick Ruby script

Sunday, November 4, 2007

FUNC_MAGIC = /(\w*\s+)*(\w+)\s+(\w+)

\s*\(([^\)]*)\)/

Sunday, November 4, 2007

Parses .h

Sunday, November 4, 2007

for each function

Sunday, November 4, 2007

generates

Sunday, November 4, 2007

function_ExpectAndReturn(args)

Sunday, November 4, 2007

and writes

Sunday, November 4, 2007

Mock_file.c.

Sunday, November 4, 2007

A unit test:

Sunday, November 4, 2007

static void testCANConductorHandlesNewMessage_WhenNewMessageAvailable(void){ CANMessage message = {0};

HardwareEvents_GetDoCANOutput_Return(FALSE); CAN_IsNewMessageAvailable_Return(TRUE); CAN_GetNewMessage_Return(message); Model_ProcessCANMessage_Expect(message);

CANConductor_Run();}

Sunday, November 4, 2007

For unit tests

Sunday, November 4, 2007

we link

Sunday, November 4, 2007

the file under test

Sunday, November 4, 2007

to the mocked files.

Sunday, November 4, 2007

Built binary

Sunday, November 4, 2007

run in a simulator.

Sunday, November 4, 2007

One binary per

Sunday, November 4, 2007

test file.

Sunday, November 4, 2007

Continuous integration

Sunday, November 4, 2007

written in Ruby

Sunday, November 4, 2007

monitors subversion

Sunday, November 4, 2007

gets each checkin

Sunday, November 4, 2007

runs rake.

Sunday, November 4, 2007

Unit tests run

Sunday, November 4, 2007

in a simulator.

Sunday, November 4, 2007

System tests run

Sunday, November 4, 2007

on the build server.

Sunday, November 4, 2007

Actual production build

Sunday, November 4, 2007

runs on the board.

Sunday, November 4, 2007

Benefits

Sunday, November 4, 2007

C code is clean

Sunday, November 4, 2007

DRY

Sunday, November 4, 2007

and readable.

Sunday, November 4, 2007

void CANConductor_Run(void){ if(HardwareEvents_GetDoCANOutput()) { CAN_SendMessage(Model_GetCANStatusMessage()); HardwareEvents_ClearDoCANOutput(); }

if(CAN_IsNewMessageAvailable() == TRUE) { Model_ProcessCANMessage(CAN_GetNewMessage()); }}

Sunday, November 4, 2007

Binary being tested

Sunday, November 4, 2007

is actually

Sunday, November 4, 2007

the binary deployed.

Sunday, November 4, 2007

No magic test build.

Sunday, November 4, 2007

Readable system tests.

Sunday, November 4, 2007

Quick to write.

Sunday, November 4, 2007

Unit tests

Sunday, November 4, 2007

test behavior.

Sunday, November 4, 2007

Unit and System

Sunday, November 4, 2007

tests are easy

Sunday, November 4, 2007

and fun to write.

Sunday, November 4, 2007

Customer is happy.

Sunday, November 4, 2007

Developers are happy.

Sunday, November 4, 2007

Questions?

References:atomicobject.com - papers,

software

Sunday, November 4, 2007

Recommended