ColdFire RTEMS Port

Work is in progress on a port of RTEMS an Open Source Real-Time OS to the ColdFire processor. For more background information about RTEMS visit OARCorp the people who developed it.

Processor Support

The basic kernel support for the ColdFire has been merged into RTEMS-4.0.0 which can now be downloaded from OARCorp. The ColdFire support is fairly well tested and is being used by a number of core RTEMS developers for their projects. RTEMS treats the ColdFire as a derivative of the Motorola 68k series processors which means that the basic operation is extremely well tested.

Board Support Packages

In addition to the basic processor support a Board Support Package(BSP) is needed for each board/card/system with a ColdFire that you want to run RTEMS on. I am currently working on BSPs for the Arnewsh/Motorola SBC5206 and SBC5307 evaluation boards. The basic features are:

The board support packages are still very much work in progress but you can pick up a recent snapshot (rtems-coldfire-bsp-981206.tar.gz). The BSP is quite stable and should be useful for normal use as well as a basis for new custom BSPs. The network driver is currently disabled in the SBC5206 BSP as it is undergoing a complete rewrite. I hope to have an initial SBC5206e BSP in development soon.

Building & Contributing

Here is a short guide on how to build RTEMS for the ColdFire using Windows NT. Linux users should see the Getting Started Guide at OARCorp.

If you make any changes please send me the patches. To do this use the diff program for example: diff -N -P -c -r sbc5206.orig sbc5206 > sbc5206-bsp-xyzname-98xxxx.diff. This would compare the contents of the sbc5206.orig directory to sbc5206 directory with your changes in them. Just drop the .diff file in an email ;)


If you are impatient to see how RTEMS runs then you can download some mini demos(190kB) which give a flavour of what's to come(SBC5206 users only). Have fun!

As no internet project is complete these days without a screen shot have a look at this!

ColdFire Performance

The table below illustrates the "time test" results from the RTEMS testsuite. This was carried out along with all the single processor validation tests(all passed) on a standard 25MHz SBC5206 board with a 4MB 60ns SIMM. The board support package used was a pre-release one for the SBC5206 and the RTEMS-980724 development snapshot. All results are in Ásec with a 1Ásec accurate timer.

Feature/Directive Time
Context Switch
context switch: self8
context switch: to another task 9
context switch: no floating point contexts 28
fp context switch: restore 1st FP task 28
fp context switch: save initialized, restore initialized 12
fp context switch: save idle, restore initialized12
fp context switch: save idle, restore idle29
Task Manager
rtems_task_create 173
rtems_task_ident 234
rtems_task_start 66
rtems_task_restart: calling task 87
rtems_task_restart: suspended task -- returns to caller 82
rtems_task_restart: blocked task -- returns to caller 111
rtems_task_restart: ready task -- returns to caller 84
rtems_task_restart: suspended task -- preempts caller 109
rtems_task_restart: blocked task -- preempts caller 132
rtems_task_restart: ready task -- preempts caller 126
rtems_task_delete: calling task 137
rtems_task_delete: suspended task 110
rtems_task_delete: blocked task 116
rtems_task_delete: ready task 119
rtems_task_suspend: calling task 57
rtems_task_suspend: returns to caller 35
rtems_task_resume: task readied -- returns to caller 36
rtems_task_resume: task readied -- preempts caller 51
rtems_task_set_priority: obtain current priority 25
rtems_task_set_priority: returns to caller 54
rtems_task_set_priority: preempts caller 89
rtems_task_mode: obtain current mode 11
rtems_task_mode: no reschedule 13
rtems_task_mode: reschedule -- returns to caller 22
rtems_task_mode: reschedule -- preempts caller 51
rtems_task_get_note 26
rtems_task_set_note 27
rtems_task_wake_after: yield -- returns to caller 12
rtems_task_wake_after: yields -- preempts caller 43
rtems_task_wake_when 96
Interrupt Manager
interrupt entry overhead: returns to nested interrupt 8
interrupt entry overhead: returns to interrupted task 10
interrupt entry overhead: returns to preempting task 10
interrupt exit overhead: returns to nested interrupt 7
interrupt exit overhead: returns to interrupted task 9
interrupt exit overhead: returns to preempting task 42
Clock Manager
rtems_clock_set 70
rtems_clock_get 5
rtems_clock_tick 20
Timer Manager
rtems_timer_create 22
rtems_timer_ident 225
rtems_timer_delete: inactive 36
rtems_timer_delete: active 41
rtems_timer_fire_after: inactive 49
rtems_timer_fire_after: active 51
rtems_timer_fire_when: inactive 72
rtems_timer_fire_when: active 72
rtems_timer_reset: inactive 41
rtems_timer_reset: active 45
rtems_timer_cancel: inactive 23
rtems_timer_cancel: active 26
Semaphore Manager
rtems_semaphore_create 55
rtems_semaphore_ident 262
rtems_semaphore_delete 54
rtems_semaphore_obtain: available 32
rtems_semaphore_obtain: not available -- NO_WAIT 32
rtems_semaphore_obtain: not available -- caller blocks 95
rtems_semaphore_release: no waiting tasks 36
rtems_semaphore_release: task readied -- returns to caller 55
rtems_semaphore_release: task readied -- preempts caller 71
Message Queue Manager
rtems_message_queue_create 180
rtems_message_queue_ident 229
rtems_message_queue_delete 67
rtems_message_queue_send: no waiting tasks 69
rtems_message_queue_send: task readied -- returns to caller 76
rtems_message_queue_send: task readied -- preempts caller 92
rtems_message_queue_urgent: no waiting tasks 68
rtems_message_queue_urgent: task readied -- returns to caller 76
rtems_message_queue_urgent: task readied -- preempts caller 92
rtems_message_queue_broadcast: no waiting tasks 43
rtems_message_queue_broadcast: task readied -- returns to caller 85
rtems_message_queue_broadcast: task readied -- preempts caller 102
rtems_message_queue_receive: available 53
rtems_message_queue_receive: not available -- NO_WAIT 39
rtems_message_queue_receive: not available -- caller blocks 101
rtems_message_queue_flush: no messages flushed 27
rtems_message_queue_flush: messages flushed 37
Event Manager
rtems_event_send: no task readied 21
rtems_event_send: task readied -- returns to caller 53
rtems_event_send: task readied -- preempts caller 70
rtems_event_receive: obtain current events 3
rtems_event_receive: available 29
rtems_event_receive: not available -- NO_WAIT 20
rtems_event_receive: not available -- caller blocks 70
Signal Manager
rtems_signal_catch 15
rtems_signal_send: returns to caller 35
rtems_signal_send: signal to self 48
exit ASR overhead: returns to calling task 31
exit ASR overhead: returns to preempting task 43
Partition Manager
rtems_partition_create 76
rtems_partition_ident 226
rtems_partition_delete 37
rtems_partition_get_buffer: available 34
rtems_partition_get_buffer: not available 30
rtems_partition_return_buffer 57
Region Manager
rtems_region_create 59
rtems_region_ident 229
rtems_region_delete 38
rtems_region_get_segment: available 64
rtems_region_get_segment: not available -- NO_WAIT 63
rtems_region_get_segment: not available -- caller blocks 123
rtems_region_return_segment: no waiting tasks 44
rtems_region_return_segment: task readied -- returns to caller 117
rtems_region_return_segment: task readied -- preempts caller 132
Dual-Ported Memory Manager
rtems_port_create 34
rtems_port_ident 226
rtems_port_delete 35
rtems_port_internal_to_external 20
rtems_port_external_to_internal 22
IO Manager
rtems_io_initialize 5
rtems_io_open 2
rtems_io_close 2
rtems_io_read 2
rtems_io_write 2
rtems_io_control 2
Rate Monotonic Manager
rtems_rate_monotonic_create 31
rtems_rate_monotonic_ident 228
rtems_rate_monotonic_cancel 36
rtems_rate_monotonic_delete: active 47
rtems_rate_monotonic_delete: inactive 44
rtems_rate_monotonic_period: obtain status 30
rtems_rate_monotonic_period: initiate period -- returns to caller 52
rtems_rate_monotonic_period: conclude periods -- caller blocks 59


Copyright (c) 1997-98 David J. Fiddes.