Kernel Products
smxPPC™
PowerPC and Power Architecture RTOS Kernel
smxPPC is the smx real-time multitasking RTOS kernel for PowerPC / Power Architecture processors.
This datasheet only lists details for this architecture. For full information see
Processors Supported
- 400, 500, 600, 700, 800, 5200, and 8200 Series
smxPPC uses the PIT interrupt as the time base. smx functions, the smx scheduler, and your application can be optimized for a specific processor by setting one compiler directive.
Development Tools Supported
- Metrowerks CodeWarrior Compiler/BDM Debugger with point and click smx awareness and the smx Graphical Analysis Tool (GAT)
- MetaWare High C/C++ Compiler
- Freescale Graphical Configuration Tool (GCT) for MPC5xx processors
- Diab Data C/C++ Compiler
- SDS SingleStep Simulator/BDM Debugger with point and click smx awareness
- Lauterbach TRACE32 with smx awareness
Development System Requirements
- Windows 95, 98, Millennium, NT, 2000, or XP
smxPPC Development Kit Contents
- Pre-made EABI-compliant ELF/DWARF smxPPC libraries
- Source code platform for easy start
- User's Guide, Reference Manual, and smxPPC Quick Start Manual
- Site development license
- Royalty-free license for one developed product
Easy Upgrade From Other Processors
smxPPC shares the same code base with smxARM and smxCF. Therefore it is easy to migrate between smxPPC and these other processor versions of smx. If you have experience with smx on one processor then you are already down the learning curve for the other processors.
Stack Flexibility
Stack-pool stacks are supported by smxPPC. These are fixed-size stacks that are loaned to tasks, then returned to the stack pool when tasks stop, so other tasks can use them.
smxPPC also permits allocating heap stacks. Stacks may be allocated from the heap for tasks requiring stacks larger or smaller than the fixed-size stack-pool stacks.
Saving Floating Point State
smxPPC makes it easy for tasks using floating point to save and restore the floating point registers when they are suspended and resumed. Also these registers are saved only for tasks that use floating point. This way, tasks not using floating point are not burdened with the extra overhead.
Debugger Support
smxPPC supports symbolic debugging for any debugger or emulator that can read the ELF/DWARF or COFF file format.
smxAware takes symbolic debugging a step further by enabling the CodeWarrior debugger to be smx-aware. When the interface is enabled, smxAware is aware of all tasks and smx objects running in the system.
With smxAware you can:
- Set task-specific breakpoints. The breakpoint will be triggered only if it is hit while the specified task is running.
- Display information about kernel specific objects such as tasks, semaphores, exchanges, events, heaps, stacks etc. with the Kernel Objects dialog box under the Data menu.
- Display task specific variables in the Watch and Read windows.
- Display custom user application objects.
- Display trace strings sent from the user's code
Lauterbach TRACE32 Support
Lauterbach has implemented excellent smx-awareness for their TRACE32 emulator consisting of:
- Display of all smxobjects with attributes
- Analyzer listing showing task switches
- Task profiling and statistics
- Task stack usage
- Task context display
- smx pull-down menu
PowerPC / Power Architecture Specifics
- The PowerPC / Power Architecture is a 32-bit flat mode processor.
- The smxPPC scheduler is written primarily in C.
- smxPPC was designed so applications could be programmed primarily in C. Therefore assembly macros GET_CHAR, LOCKX, PGET_CHAR, PPUT_CHAR, PUT_CHAR, STACK_CHECK and TESTX are not provided.
- All initialized data is in section .data. All uninitialized data is in section .bss and code is in section .text.
- Time base: The PowerPC / Power Architecture has a built in time base. smxPPC uses the Programmable Interval Timer (PIT) to generate a periodic tick interrupt. The tick (interrupt) rate should be in the range of 1 msec to 100 msec. See the smx User's Guide Chapter 13 for more on timing.
Boards Supported
- Freescale MPC860ADS and FADS
- Freescale MBX860
- Embedded Planet RPX-Lite 823/850/860
- Embedded Planet RPX-Classic 860/860T
- Embedded Planet RPX-Classic Low Fat
- Phast 855T
- EST SBC8260
- ESD EPPC/405GP
- IBM 405GP Walnut
- Phytec 565 Core
- Embedded Planet EP852
- Embedded Planet EP866
- EST SBC Basic 860
- ESD CPCI 405
- Espace 850
- TQComponents TQM5200
- Freescale Lite 5200
Boards using any variant of the 555/565/5200/823/850/860/405 processor are very easy to support.
Drivers for the 823/850/860/8260
- Ethernet 10baseT: SCC1, SCC2, SCC3, or SCC4[1]
- Ethernet 100baseT (860T and 855T)
- PPP driver[1]
- PCMCIA driver[1]
- UART: SMC1, SMC2
- UART: SCC1, SCC2, SCC3, SCC4
- 823 LCD Driver[2]
- 823 SPI Touch Screen Driver[2]
- ROM to RAM load and run
- MMU support
- Data Cache
- Instruction Cache
Drivers for the 405GP
- Ethernet 100baseT[1]
- PPP driver[1]
- UART (FIFO mode)
- Compact Flash File drive
Drivers for the 555/565
- SCI1 and SCI2 UARTS
- CANopen
860 UART driver notes:
The SMC and SCC UARTS are designed to be flexible and easy to use. All of the UARTS can be used in character, block or PPP mode, and all can be used simultaneously.
MMU driver notes:
smx implements an easy to use table to set up the memory and cache regions. smx also has a workaround for the Data Cache Corruption bug (MPC860 errata CPU6 and MPC823 errata CPU2). Because of this bug many RTOS companies do not support the data cache on MPC8xx rev A and B parts.
smxPPC™ Sample Execution Times
|
clock cycles microsec |
Function |
Conditions |
V |
N |
V |
N |
bump_task |
No preempt |
264 |
244 |
5.3 |
4.9 |
bump_task |
Preempt |
376 |
352 |
7.5 |
7.0 |
create_rq |
4 levels |
392 |
252 |
7.8 |
5.0 |
create_task |
Unbound |
184 |
180 |
3.7 |
3.6 |
create_xchg |
1 level |
204 |
184 |
4.1 |
3.7 |
create_xchg |
2 level |
268 |
248 |
5.3 |
5.0 |
interrupt latency |
Maximum |
30 |
26 |
0.6 |
0.5 |
interrupt response |
Interrupt->isr->lsr->task |
443 |
383 |
8.8 |
7.7 |
receive |
Message waiting |
136 |
124 |
2.7 |
2.5 |
receive_stop |
Message waiting(task restarts) |
404 |
308 |
8.1 |
6.1 |
send |
No task waiting |
242 |
136 |
4.8 |
2.7 |
send |
Waiting task put into rq |
292 |
252 |
5.8 |
5.0 |
start idle task |
Unbound and not in a queue |
356 |
280 |
7.1 |
5.6 |
stop task |
In rq |
288 |
144 |
5.7 |
2.9 |
task switch |
Due to task suspend and resume |
344 |
284 |
6.9 |
5.7 |
The number of clock cycles are valid for any PowerPC / Power Architecture processor that can execute one instruction per clock (assuming 100% cache hit rate). All times assume an MPC860 with 100% cache hit rate.
V is unoptimized code with extensive stack and parameter checking. Built with the command line mak L V 8.
N is optimized code with basic stack checking. Built with the command line mak L N 8.
smxPPC™ RAM Usage
RAM usage is the sum of: |
Sample Sizes* |
Stack Pool (shared stacks) |
8400 |
Near Heap Space: |
|
Control Blocks |
3200 |
lsr queue |
160 |
Error Buffer (optional) |
800 |
Handle Table (smxDLM, smxProbe) |
800 |
Bound Stacks |
a/r |
Call Trace Buffer (smxProbe) |
a/r |
Task Trace Buffer (smxProbe) |
a/r |
Dynamically Allocated Regions |
|
Block and Message Pools |
3000 |
smx Global Variables |
500 |
|
Total |
16.5K |
Stack Pool: The value shown is for 7 stacks of 1200 bytes. 1200 bytes is larger than most tasks require, but it is a good starting point.
Control Blocks are generally 12 to 28 bytes. One control block is needed for every smx object (i.e. tasks, semaphores, pipes, messages, etc) and for each lower level of the ready queue, semaphore, and exchanges.
Heap space: Add to these the amount of heap required by the application.
DAR's (dynamically allocated regions) are blocks of memory from which pools may be allocated.
smx global variables include the configuration table and handles such as ct (current task) and rq_top (top task in ready queue).
*Sample Sizes: These numbers reflect data usage by a medium-sized application. The stack pool usage reflects 7 medium stacks. It is better to have smaller stack pool stacks and use bound stacks where larger ones are necessary. Control block usage is a total of all control blocks needed by this particular sample application: 15 tasks, 7 stacks, 100 queue levels, 5 timers, 18 messages, 8 pipes, 2 buckets, 6 pools, and 14 blocks. The number of control blocks allocated of each type and the sizes of the heaps, dar, lsr queue, handle table, error buffers are user-tuneable to the requirements of the application.
smxPPC™ Function Sizes
smx function |
cw n |
cw t |
dc n |
dc t |
bump_msg |
360 |
536 |
392 |
556 |
bump_task |
840 |
992 |
900 |
1032 |
clear_q |
2196 |
2244 |
2248 |
2288 |
count |
552 |
748 |
592 |
764 |
count_stop |
704 |
900 |
744 |
916 |
create_cx |
156 |
264 |
160 |
248 |
create_eq |
136 |
184 |
144 |
184 |
create_et |
144 |
144 |
152 |
152 |
create_nbpool |
160 |
208 |
216 |
256 |
create_nmsg |
328 |
436 |
336 |
428 |
create_npool |
496 |
616 |
524 |
624 |
+create_pool |
624 |
1052 |
640 |
1012 |
+create_rq |
216 |
264 |
224 |
264 |
+create_sem |
360 |
488 |
340 |
432 |
+create_task |
432 |
528 |
404 |
484 |
create_xchg |
500 |
720 |
468 |
616 |
delete_cx |
112 |
264 |
116 |
252 |
delete_eq |
88 |
204 |
92 |
204 |
delete_et |
408 |
460 |
452 |
500 |
delete_msg |
120 |
224 |
120 |
224 |
delete_pool |
220 |
372 |
264 |
400 |
delete_sem |
136 |
252 |
176 |
288 |
+delete_task |
824 |
928 |
924 |
1000 |
delete_xchg |
172 |
324 |
224 |
356 |
error |
32 |
932 |
32 |
2982 |
find_next |
208 |
312 |
224 |
320 |
find_pool |
140 |
252 |
132 |
252 |
+get_block |
152 |
312 |
156 |
308 |
get_msg |
112 |
240 |
120 |
240 |
+get_nblocks |
312 |
384 |
336 |
400 |
+go_smx |
2132 |
2172 |
2480 |
2516 |
hook |
124 |
204 |
128 |
204 |
handle table |
1144 |
1168 |
1385 |
1405 |
invoke |
164 |
188 |
184 |
204 |
keep_time |
468 |
504 |
552 |
576 |
locate |
308 |
568 |
300 |
548 |
ncallocx |
76 |
76 |
80 |
80 |
nfreex |
256 |
304 |
248 |
288 |
nheapchkx |
44 |
44 |
44 |
44 |
nheapinix |
320 |
392 |
304 |
364 |
nheapsetx |
344 |
368 |
352 |
372 |
nheapwalkx |
580 |
628 |
584 |
624 |
nmallocx |
480 |
552 |
484 |
544 |
nreallocx |
484 |
556 |
488 |
548 |
pget_char |
896 |
1100 |
968 |
1144 |
pget_char_stop |
1136 |
1340 |
1200 |
1376 |
+pput_char |
920 |
1124 |
980 |
1156 |
pput_char_stop |
1176 |
1380 |
1220 |
1396 |
put_msg |
192 |
368 |
204 |
372 |
qsize |
580 |
908 |
656 |
944 |
read_timer |
192 |
292 |
216 |
316 |
receive |
984 |
1136 |
1064 |
1204 |
+receive_stop |
900 |
1052 |
992 |
1124 |
+rel_all_block |
112 |
192 |
124 |
204 |
+rel_all_msg |
140 |
220 |
184 |
264 |
+rel_block |
68 |
132 |
68 |
136 |
rel_nblock |
100 |
148 |
108 |
152 |
reset_flags |
76 |
128 |
80 |
128 |
+resume |
516 |
596 |
528 |
596 |
resume_to |
600 |
676 |
584 |
672 |
sendx |
680 |
912 |
716 |
932 |
set_flags |
436 |
488 |
456 |
504 |
+signalx |
840 |
952 |
860 |
964 |
sleepx |
332 |
380 |
396 |
436 |
sleep_stop |
328 |
376 |
388 |
428 |
+sort_nblocks |
316 |
340 |
360 |
380 |
+startx |
784 |
968 |
832 |
996 |
start_timer |
352 |
424 |
360 |
420 |
stop |
676 |
756 |
728 |
796 |
stop_timer |
232 |
308 |
256 |
336 |
suspend |
628 |
708 |
688 |
756 |
test |
508 |
648 |
560 |
688 |
test_flags |
632 |
756 |
656 |
764 |
test_flags_stop |
620 |
744 |
644 |
752 |
test_stop |
796 |
936 |
860 |
988 |
unlockx |
100 |
176 |
104 |
180 |
scheduler |
2008 |
3168 |
3305 |
4693 |
+min kernel |
9648 |
11704 |
10432 |
12236 |
max kernel |
37020 |
47340 |
40810 |
52496 |
- Key:
- cw = CodeWarrior C/C++ v8.1
dc = Diab Data C/C++ v5.1
n = Non-Test Mode
t = Test Mode
Conditions: optimization off, event buffer logging off, DEBUGVER off
+ = indicates calls included for a reasonable minimum kernel
Test mode library calls contain additional code for error checking. Hence, the test mode libraries are somewhat larger (roughly 15%).
Notes |
|
|
- Available with smxNet.
- Available with smxPEG.
|
|