[En-Nut-Discussion] arm port (RFC: Changing ARM mode)
Alain M.
alainm at pobox.com
Tue Jan 13 23:54:23 CET 2009
Rocendo Bracamontes del toro escreveu:
> On Tue, Jan 13, 2009 at 2:26 PM, Adam Dybkowski <adybkows at wp.pl> wrote:
>
>> Alain M. wrote:
>>
>>>> void NutSleep (uint32_t ms)
>>>> {
>>>> ENTRY_KERNEL_MODE(); // change mode to supervisor when applicable
>>>>
>>>> ..... code execute at kernel level here ....
>>>>
>>>> EXIT_KERNEL_MODE(); exit supervisor mode, enter user mode when
>>>> applicable
>>>> }
>>> I am no expert in the matter, but in my undertanding this is not very
>>> good. The problem is that SWI is a CALL, not a command has one parameter
>>> for the function and parametters have to be fetch from the user stack.
>>> This calls for an entire different achitecture.
>> I think this is not a real problem because SWI call works similar to
>> interrupt - CPU suddenly jumps to address 0x08, switches to Supervisor
>> and ARM mode (if it was in Thumb). The SWI handler could extract the
>> return address and jump there in priviledged Supervisor mode (extra
>> bonus: own system stack) or switch into System mode (the same as User
>> mode but priviledged). EXIT_KERNEL_MODE will be much easier because we
>> have only to switch to User mode (restore CPSR as it was before
>> ENTRY_KERNEL_MODE), without using SWI to do it.
>
> Agree ...
It will probably work with ARM7, but it looks more like a hack...
But it will not work anymore on Cortex...
Alain
More information about the En-Nut-Discussion
mailing list