Post on 19-Oct-2019
transcript
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