[elektro] PIC32 FreeRtos IT semafor probléma.

F-I flaist at gmail.com
Mon Jun 18 01:34:02 CEST 2012


Sziasztok!

Na, meg van, a megoldás:

A "configMAX_SYSCALL_INTERRUPT_PRIORITY" alapból 3.
Ami azt jelenti, hogy RTOS API hivást ennél nagyobb prioritású IT rutinból 
nem szabad hivni!

Az, hogy miért működött "_attribute__ ((interrupt(IPL6SOFT)) " módban, csak 
véletlet lehetett.

 Üdv.  István





----- Original Message ----- 
From: "Huszti András" <kyrk.5.dpg.hu at freemail.hu>
To: <elektro at tesla.hu>
Sent: Saturday, June 16, 2012 4:54 PM
Subject: Re: [elektro] PIC32 FreeRtos IT semafor probléma.


> Helló! Próbáld ki saját implementálásu szemaforral, hogy azzal mukodik-e. 
> A hibát szerintem jelentsed le a FreeRTOS-nek, hátha tudnak valamit 
> kezdeni vele. Köszönöm
> F-I <flaist at gmail.com> írta:
>>Sziasztok!
>>
>>Használom a PIC32 FREERTOS összeállítás.
>>
>>IT rutinból hivok szmafor eseményt a minta példák alapján.
>>
>>                 xSemaphoreGiveFromISR( xSemaphore, 
>> &xHigherPriorityTaskWoken );  //indítja a jelfeldolgozó taszkot
>>
>>
>>
>>A bajom az, hogy ez az IT rutin sürün jön, ezért használná a HW SHADOW 
>>regiszter mentést.
>>
>>__attribute__ ((interrupt(IPL6SRS)))            //ez használja a HW shadow 
>>reg. mentést
>>
>>
>>Ha viszont ezt beállitom, akkor 7-es "general_exception"-t dob a PIC32 a 
>>FREERTOS ora IT rutinjában.
>>
>>
>>Ha tiltom, akkor nincs hiba:
>>
>>__attribute__ ((interrupt(IPL6SOFT)))       //Ne haználja a HW shadow reg. 
>>mentést.
>>
>>
>>
>>
>>
>>A program ez után a szemafor hivás után száll el.
>>
>>
>>                 xSemaphoreGiveFromISR( xSemaphore, 
>> &xHigherPriorityTaskWoken );  //indítja a jelfeldolgozó taszkot
>>
>>
>>Ez hívja a lenti PIC32 spec.függvény, ami után jön az elszállás!
>>
>>"port.c"
>>---------------------------------------------------------------------------------------------------
>>unsigned portBASE_TYPE uxPortSetInterruptMaskFromISR( void )
>>{
>>unsigned portBASE_TYPE uxSavedStatusRegister;
>>
>> asm volatile ( "di" );
>> uxSavedStatusRegister = _CP0_GET_STATUS() | 0x01;
>> /* This clears the IPL bits, then sets them to
>> configMAX_SYSCALL_INTERRUPT_PRIORITY.  This function should not be called
>> from an interrupt that has a priority above
>> configMAX_SYSCALL_INTERRUPT_PRIORITY so, when used correctly, the action
>> can only result in the IPL being unchanged or raised, and therefore never
>> lowered. */
>> _CP0_SET_STATUS( ( ( uxSavedStatusRegister & ( ~portALL_IPL_BITS ) ) ) | 
>> ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) );
>>
>> return uxSavedStatusRegister;
>>}
>>---------------------------------------------------------------------------------------------------
>>
>>Olyan a jelenség, mintha felengedné az IT-t, és a FREERTOS ora IT 
>>ráindulna  !!??
>>
>>Azon kívül, hogy ne használjam a SHADOW-t van valami ötlet?
>>
>>Köszi, üdv István
>>-----------------------------------------
>>          elektro[-flame|-etc]
>
> -----------------------------------------
>          elektro[-flame|-etc] 



More information about the Elektro mailing list