Could it be that the value of the global pointer (gp) is being corrupted? This will cause your code to read from the wrong location, resulting in the symptoms you describe.
There is code within the eCos kernel that updates the value of gp. This is intended to allow execution to switch backwards and forwards between a monitor (i.e. Redboot) and an eCos application. Assuming you are running a monolithic system (i.e. a ROM or ROMRAM configuration) then the value of gp should always be restored to the same value.
This may not be the case if there's a bug in the kernel, or, as is more likely, the stored value of gp is being overwritten due to memory corruption. Look at the value of the global _gp to see if this is the case.