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.
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.
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.
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!
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: self | 8 |
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 initialized | 12 |
fp context switch: save idle, restore idle | 29 |
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 |