The debugger does not support assembly language single stepping over function calls that do not return to the instruction
following the call such as "_switch". Any attempt to do so will result in loss of target communication. Stepping into the
function in assembly is supported, as is stepping over such functions in C.
If an ipset or ipres instruction is followed immediately by an rst 0x28, the debug kernel will not step over the rst 0x28
correctly, but will end up in an unexpected location. When either of these instructions are followed by instructions other
than rst 0x28, the debug kernel behaves correctly.
The Register Contents debug window (F11) doesn’t report the correct LXPC value if it’s >= 0xFF. It reports 0x0FF as “LXPC:
FFF” and leaves the high nibble off of values >= 0x100 (so 0x123 appears as “LXPC: 023”).
2. Software modules.
RabbitWeb gives a cryptic error message for buffer overflow when using the print_select() statement. The workaround is to
make HTTP_MAXBUFFER large enough to hold all of the OPTION statements generated by the print_select() statement.
3. Complex casts
The compiler will not accept multidimensional array types or derivatives thereof as cast expressions, even if the cast expression is
a typedef name. Use a union to work around this problem.
4. Advanced 16-bit memory mode CPU bug
The Rabbit 4000 CPU’s advanced 16-bit memory mode has a defect which affects ioe instructions (auxiliary I/O, external I/O) and
self-timed chip select. The Dynamic C BIOS has been updated to work around this ioe defect on affected boards, all of the
RCM40xx family. If absolute top performance is required and the User is certain their application is unaffected by the ioe bug, the
work around can be disabled by adding the __ALLOW_16BIT_AUXIO_DEFECT macro into Dynamic C’s Project Options Defines Box.
See the Rabbit 4000 Users Manual Appendix B (errata section) or TN255 for complete details.
5. In separate I/D mode, an array declared as
far char bar[] = {0,1,2,3,...};
will not compile correctly when the size of the array exceeds the size of the root constant space and will give an error that the ‘}’
character is missing. The work-around is to specify the size of the array as follows:
far char bar[32000] = {0,1,2,3,...};
6. Highlighting a block of text while in Stop mode
In some cases, depending on the specific text, highlighting a block of text can result in a flyover watch which returns a copy of that
text in the hint window.
7. Using #pragma SIZEOF32 can result in a sizeof problem for a large struct.
Using #pragma SIZEOF32 allows the argument of sizeof to be up to 4GB but will return an incorrect value without warning or
error if the argument involves a struct of size 32K or larger. When using #pragma SIZEOF32, always restore to the default with
#pragma SIZEOF16 following the use of sizeof.
8. Initialized global and static variables and #GLOBAL_INIT expressions run with a limited stack (256 bytes). Deeply nested functions
(including printf()) will cause a loss of target communications.
9. Cast ternary operator(s) if both values do not have the same type and type qualifiers - example: condition ? &aFarChar : (far
char *)NULL. In the example, if condition is true and NULL is not cast, a near address is erroneously returned.
10. As of 10.66, symbols are distinguished using the first 63 characters of the name. Older versions used 31 characters, the minimum
per the ANSI specification. If a long symbol name is used as a library module label (i.e., in a BeginHeader statement), the library’s
.MD1 file will contain the short version of the name, and the module will not be found. For example:
/*** BeginHeader A12345678911234567892123456789312 ***/
extern int A12345678911234567892123456789312;
/*** EndHeader ***/
int A12345678911234567892123456789312;