CPM command processing
Till Straumann
strauman at slac.stanford.edu
Mon Jan 14 07:58:02 UTC 2008
Leon Pollak wrote:
> On Monday, 14 בJanuary 2008, Till Straumann wrote:
>
>> My usual 2-cents:
>>
>> Busy-waiting with interrupts disabled is evil.
>> Such a loop *must* IMHO implement a timeout
>> so that the worst-case impact on latency other
>> tasks have to suffer from is guaranteed.
>>
> Well, if everything works,
The problem is that if for some reason it doesn't and
it takes longer then there is no safeguard.
> there should be not more then 20 cycles, thus any
> timeout technique will take more time.
>
I disagree. Since you're busy-waiting you can
as well read e.g. some hardware timer
(or at least a loop count).
then = read_hw_timer();
while (m8260.cpcr & M8260_CR_FLG) {
if ( read_hw_timer() - then > timeout ) {
rtems_interrupt_enable(lvl);
/* TIMEOUT; deal with it here */
}
}
> If there is the problem I mentioned, then I do not know what to do, actually.
> And we do HW reset, which always helps...
> May be there is some method to overcome/recover from the situation...
>
>
>> -- Till
>>
>> Leon Pollak wrote:
>>
>>> Hello, all.
>>>
>>> Both files
>>> ..lib/libcpu/powerpc/mpc8260/cp.c
>>> ..lib/libcpu/powerpc/mpc860/cp.c
>>> contain the same code:
>>>
>>> void m8xx_cp_execute_cmd( uint32_t command )
>>> {
>>> uint16_t lvl;
>>>
>>> rtems_interrupt_disable(lvl);
>>> while (m8260.cpcr & M8260_CR_FLG) {
>>> continue;
>>> }
>>>
>>> m8260.cpcr = command | M8260_CR_FLG;
>>> rtems_interrupt_enable (lvl);
>>> }
>>>
>>> The problem with this code is (based on my experience with both CPU's)
>>> that it does not check the result of a command execution. Although
>>> Motorola's specification states that CPM should finish the command
>>> processing in about 20 cycles, my 13 years experience shows that there
>>> are cases when the command is not executed and the flag bit remains "1".
>>>
>>> Therefore, I swap the operators in my code:
>>>
>>> m8260.cpcr = command | M8260_CR_FLG;
>>>
>>> while (m8260.cpcr & M8260_CR_FLG) {
>>> continue;
>>> }
>>>
>>> and cause system reset if it remains "1" for too long.
>>>
>>> I have no explanation to this, because after reset the system returns to
>>> the same exactly sequence and now it passes. We have such problem once on
>>> each 20-25 units based on MPC8260, but I remember this to occur on MPC860
>>> units too.
>>>
>>> Hope this will be useful...
>>>
>
>
>
>
More information about the users
mailing list