Well, we could still use the patch you sent with the protection in is pending, but I think this will break the BSPs I mentioned, since you changed timecounter functions signatures. Am I right?
On Mon, Jan 11, 2016 at 4:18 PM, Sebastian Huber < sebastian.hu...@embedded-brains.de> wrote: > Hello, > > I already created a ticket which blocks the 4.11 release for this bug: > > https://devel.rtems.org/ticket/2502 > > I sent a new version of the patch to one of your previous threads some > days ago: > > https://lists.rtems.org/pipermail/devel/2016-January/013289.html > > There is still a bug in it, since we must disable interrupts in the is > pending function, but the general approach should work. > > ----- Am 11. Jan 2016 um 20:05 schrieb Marcos Díaz > marcos.d...@tallertechnologies.com: > > > I made a fast search: > > These BSPs use *rtems_timecounter_simple_downcounter*: > > arm/shared/armv7m > > m68k/mcf52235 > > m68k/mcf5225x > > m68k/mcf5329 > > m68k/uC5282 > > powerpc/mpc55xxevb > > sparc/erc32 > > sparc/leon2 > > sparc/leon3 > > sparc/shared > > > > These use *rtems_timecounter_simple_upcounter*: > > powerpc/mpc55xxevb > > arm/lpc22xx > > > > We should search a little more for the other changes but at least these > > BSPs will be affected. Maybe we should wait Sebastian's opinion, since he > > suggested the change in timecounter's signatures. > > > > On Mon, Jan 11, 2016 at 3:44 PM, Joel Sherrill <j...@rtems.org> wrote: > > > >> > >> > >> On Mon, Jan 11, 2016 at 12:28 PM, Marcos Díaz < > >> marcos.d...@tallertechnologies.com> wrote: > >> > >>> I will issue a ticket. But I noticed that in my patch I include changes > >>> to common code that Sebastian suggested, and this will break any other > BSP > >>> that uses rtems timecounter simple downcounter or upcounter, since > these > >>> function's signatures changed. Should we update all BSPs? Or make > changes > >>> more locally to our BSP? Meanwhile please do not apply the patch I > sent. > >>> > >>> > >> I would prefer not to ship BSPs with bugs but fixing them comes with > risks. > >> So I would lean to the same fix on the master and 4.11 branch fixing it > >> where it needs to be fixed. > >> > >> What BSPs does this change impact? > >> > >> --joel > >> > >> > >>> > >>> On Mon, Jan 11, 2016 at 3:16 PM, Joel Sherrill <j...@rtems.org> wrote: > >>> > >>>> At this point, a ticket is needed for anything applied to 4.11 that is > >>>> not release > >>>> mechanics related. > >>>> > >>>> --joel > >>>> > >>>> On Mon, Jan 11, 2016 at 11:47 AM, Marcos Diaz < > >>>> marcos.d...@tallertechnologies.com> wrote: > >>>> > >>>>> Hi Sebastian, > >>>>> > >>>>> we did some more testing and found out what's causing the problem. > >>>>> Based on what > >>>>> I posted at > >>>>> https://lists.rtems.org/pipermail/devel/2015-December/013235.html, > >>>>> the problem arises when the ticker interrupt occurs while a task is > >>>>> executing > >>>>> one of the instructions that make up the following line: > >>>>> > >>>>> is_count_pending = (systick->csr & ARMV7M_SYSTICK_CSR_COUNTFLAG) != > 0; > >>>>> > >>>>> which compiling with -O3 are: > >>>>> > >>>>> ldr.w r3, [r9] > >>>>> ubfx r5, r3, #16, #1 > >>>>> strb.w r5, [r8, #64] > >>>>> > >>>>> If the SysTick counts to 0 and the ldr executes before the interrupt > >>>>> occurs, > >>>>> R3 will have the CSR.COUNTFLAG bit set. Even though > _ARMV7M_TC_at_tick > >>>>> will > >>>>> clear the is_count_pending boolean, the task will still see it as > true. > >>>>> > >>>>> The solution we found is to simply disable interrupts while reading > >>>>> that flag. > >>>>> We also use a local variable inside _ARMV7M_TC_is_pending instead of > >>>>> directly > >>>>> returning the current value of the is_count_pending global, just in > >>>>> case. > >>>>> > >>>>> Here's the patch that fixes it; this applies to the 4.11 branch. > >>>>> Do we have to open a new thread for it to be applied to the mainline, > >>>>> or will > >>>>> this suffice? Should we open a ticket for 4.11? > >>>>> > >>>>> --- > >>>>> .../arm/shared/armv7m/clock/armv7m-clock-config.c | 38 > >>>>> +++++++++++++++------- > >>>>> c/src/lib/libbsp/shared/clockdrv_shell.h | 16 ++++++++- > >>>>> cpukit/rtems/src/clocktick.c | 6 +++- > >>>>> cpukit/sapi/include/rtems/timecounter.h | 35 > >>>>> ++++++++++++++++---- > >>>>> cpukit/score/include/rtems/score/timecounter.h | 37 > >>>>> +++++++++++++++++++-- > >>>>> cpukit/score/src/kern_tc.c | 16 ++++----- > >>>>> doc/bsp_howto/clock.t | 13 +++++++- > >>>>> 7 files changed, 130 insertions(+), 31 deletions(-) > >>>>> > >>>>> diff --git > >>>>> a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c > >>>>> b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c > >>>>> index e78684c..53bd7cf 100644 > >>>>> --- a/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c > >>>>> +++ b/c/src/lib/libbsp/arm/shared/armv7m/clock/armv7m-clock-config.c > >>>>> @@ -25,6 +25,8 @@ static void Clock_isr(void *arg); > >>>>> > >>>>> static rtems_timecounter_simple _ARMV7M_TC; > >>>>> > >>>>> +static bool is_count_pending = false; > >>>>> + > >>>>> static uint32_t _ARMV7M_TC_get(rtems_timecounter_simple *tc) > >>>>> { > >>>>> volatile ARMV7M_Systick *systick = _ARMV7M_Systick; > >>>>> @@ -34,9 +36,20 @@ static uint32_t > >>>>> _ARMV7M_TC_get(rtems_timecounter_simple *tc) > >>>>> > >>>>> static bool _ARMV7M_TC_is_pending(rtems_timecounter_simple *tc) > >>>>> { > >>>>> - volatile ARMV7M_SCB *scb = _ARMV7M_SCB; > >>>>> + volatile ARMV7M_Systick *systick = _ARMV7M_Systick; > >>>>> + ISR_lock_Context lock_context; > >>>>> + > >>>>> + _Timecounter_Acquire( &lock_context ); > >>>>> + /* We use this bool since the hardware flag is reset each time it > is > >>>>> read. */ > >>>>> + if (!is_count_pending) > >>>>> + { > >>>>> + is_count_pending = ((systick->csr & > ARMV7M_SYSTICK_CSR_COUNTFLAG) > >>>>> != 0 ); > >>>>> + } > >>>>> > >>>>> - return ((scb->icsr & ARMV7M_SCB_ICSR_PENDSTSET) != 0); > >>>>> + const bool is_pending_local = is_count_pending; > >>>>> + > >>>>> + _Timecounter_Release( &lock_context ); > >>>>> + return is_pending_local; > >>>>> } > >>>>> > >>>>> static uint32_t _ARMV7M_TC_get_timecount(struct timecounter *tc) > >>>>> @@ -48,19 +61,23 @@ static uint32_t _ARMV7M_TC_get_timecount(struct > >>>>> timecounter *tc) > >>>>> ); > >>>>> } > >>>>> > >>>>> -static void _ARMV7M_TC_tick(void) > >>>>> -{ > >>>>> - rtems_timecounter_simple_downcounter_tick(&_ARMV7M_TC, > >>>>> _ARMV7M_TC_get); > >>>>> -} > >>>>> - > >>>>> -static void _ARMV7M_Systick_at_tick(void) > >>>>> +static void _ARMV7M_TC_at_tick(rtems_timecounter_simple *tc) > >>>>> { > >>>>> volatile ARMV7M_Systick *systick = _ARMV7M_Systick; > >>>>> - > >>>>> + is_count_pending = false; > >>>>> /* Clear COUNTFLAG */ > >>>>> systick->csr; > >>>>> } > >>>>> > >>>>> +static void _ARMV7M_TC_tick(void) > >>>>> +{ > >>>>> + rtems_timecounter_simple_downcounter_tick( > >>>>> + &_ARMV7M_TC, > >>>>> + _ARMV7M_TC_get, > >>>>> + _ARMV7M_TC_at_tick > >>>>> + ); > >>>>> +} > >>>>> + > >>>>> static void _ARMV7M_Systick_handler(void) > >>>>> { > >>>>> _ARMV7M_Interrupt_service_enter(); > >>>>> @@ -111,9 +128,6 @@ static void _ARMV7M_Systick_cleanup(void) > >>>>> > >>>>> #define Clock_driver_timecounter_tick() _ARMV7M_TC_tick() > >>>>> > >>>>> -#define Clock_driver_support_at_tick() \ > >>>>> - _ARMV7M_Systick_at_tick() > >>>>> - > >>>>> #define Clock_driver_support_initialize_hardware() \ > >>>>> _ARMV7M_Systick_initialize() > >>>>> > >>>>> diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h > >>>>> b/c/src/lib/libbsp/shared/clockdrv_shell.h > >>>>> index d546fb8..96b962f 100644 > >>>>> --- a/c/src/lib/libbsp/shared/clockdrv_shell.h > >>>>> +++ b/c/src/lib/libbsp/shared/clockdrv_shell.h > >>>>> @@ -44,6 +44,13 @@ > >>>>> #define Clock_driver_support_find_timer() > >>>>> #endif > >>>>> > >>>>> +/** > >>>>> + * @brief Do nothing by default. > >>>>> + */ > >>>>> +#ifndef Clock_driver_support_at_tick > >>>>> + #define Clock_driver_support_at_tick() > >>>>> +#endif > >>>>> + > >>>>> /* > >>>>> * A specialized clock driver may use for example > >>>>> rtems_timecounter_tick_simple() > >>>>> * instead of the default. > >>>>> @@ -108,7 +115,14 @@ rtems_isr Clock_isr( > >>>>> && _Thread_Executing->Start.entry_point > >>>>> == (Thread_Entry) rtems_configuration_get_idle_task() > >>>>> ) { > >>>>> - _Timecounter_Tick_simple(interval, > >>>>> (*tc->tc_get_timecount)(tc)); > >>>>> + ISR_lock_Context lock_context; > >>>>> + > >>>>> + _Timecounter_Acquire(&lock_context); > >>>>> + _Timecounter_Tick_simple( > >>>>> + interval, > >>>>> + (*tc->tc_get_timecount)(tc), > >>>>> + &lock_context > >>>>> + ); > >>>>> } > >>>>> > >>>>> Clock_driver_support_at_tick(); > >>>>> diff --git a/cpukit/rtems/src/clocktick.c > b/cpukit/rtems/src/clocktick.c > >>>>> index e2cd35f..a6bf26d 100644 > >>>>> --- a/cpukit/rtems/src/clocktick.c > >>>>> +++ b/cpukit/rtems/src/clocktick.c > >>>>> @@ -23,9 +23,13 @@ > >>>>> > >>>>> rtems_status_code rtems_clock_tick( void ) > >>>>> { > >>>>> + ISR_lock_Context lock_context; > >>>>> + > >>>>> + _Timecounter_Acquire( &lock_context ); > >>>>> _Timecounter_Tick_simple( > >>>>> rtems_configuration_get_microseconds_per_tick(), > >>>>> - 0 > >>>>> + 0, > >>>>> + &lock_context > >>>>> ); > >>>>> > >>>>> return RTEMS_SUCCESSFUL; > >>>>> diff --git a/cpukit/sapi/include/rtems/timecounter.h > >>>>> b/cpukit/sapi/include/rtems/timecounter.h > >>>>> index 04bc534..06b3973 100644 > >>>>> --- a/cpukit/sapi/include/rtems/timecounter.h > >>>>> +++ b/cpukit/sapi/include/rtems/timecounter.h > >>>>> @@ -94,6 +94,13 @@ typedef struct { > >>>>> } rtems_timecounter_simple; > >>>>> > >>>>> /** > >>>>> + * @brief At tick handling done under protection of the timecounter > >>>>> lock. > >>>>> + */ > >>>>> +typedef uint32_t rtems_timecounter_simple_at_tick( > >>>>> + rtems_timecounter_simple *tc > >>>>> +); > >>>>> + > >>>>> +/** > >>>>> * @brief Returns the current value of a simple timecounter. > >>>>> */ > >>>>> typedef uint32_t rtems_timecounter_simple_get( > >>>>> @@ -199,20 +206,28 @@ RTEMS_INLINE_ROUTINE uint32_t > >>>>> rtems_timecounter_simple_scale( > >>>>> * > >>>>> * @param[in] tc The simple timecounter. > >>>>> * @param[in] get The method to get the value of the simple > >>>>> timecounter. > >>>>> + * @param[in] at_tick The method to perform work under timecounter > lock > >>>>> + * protection at this tick, e.g. clear a pending flag. > >>>>> */ > >>>>> RTEMS_INLINE_ROUTINE void rtems_timecounter_simple_downcounter_tick( > >>>>> - rtems_timecounter_simple *tc, > >>>>> - rtems_timecounter_simple_get get > >>>>> + rtems_timecounter_simple *tc, > >>>>> + rtems_timecounter_simple_get get, > >>>>> + rtems_timecounter_simple_at_tick at_tick > >>>>> ) > >>>>> { > >>>>> + ISR_lock_Context lock_context; > >>>>> uint32_t current; > >>>>> > >>>>> + _Timecounter_Acquire( &lock_context ); > >>>>> + > >>>>> + ( *at_tick )( tc ); > >>>>> + > >>>>> current = rtems_timecounter_simple_scale( > >>>>> tc, > >>>>> tc->real_interval - ( *get )( tc ) > >>>>> ); > >>>>> > >>>>> - _Timecounter_Tick_simple( tc->binary_interval, current ); > >>>>> + _Timecounter_Tick_simple( tc->binary_interval, current, > >>>>> &lock_context ); > >>>>> } > >>>>> > >>>>> /** > >>>>> @@ -220,17 +235,25 @@ RTEMS_INLINE_ROUTINE void > >>>>> rtems_timecounter_simple_downcounter_tick( > >>>>> * > >>>>> * @param[in] tc The simple timecounter. > >>>>> * @param[in] get The method to get the value of the simple > >>>>> timecounter. > >>>>> + * @param[in] at_tick The method to perform work under timecounter > lock > >>>>> + * protection at this tick, e.g. clear a pending flag. > >>>>> */ > >>>>> RTEMS_INLINE_ROUTINE void rtems_timecounter_simple_upcounter_tick( > >>>>> - rtems_timecounter_simple *tc, > >>>>> - rtems_timecounter_simple_get get > >>>>> + rtems_timecounter_simple *tc, > >>>>> + rtems_timecounter_simple_get get, > >>>>> + rtems_timecounter_simple_at_tick at_tick > >>>>> ) > >>>>> { > >>>>> + ISR_lock_Context lock_context; > >>>>> uint32_t current; > >>>>> > >>>>> + _Timecounter_Acquire( &lock_context ); > >>>>> + > >>>>> + ( *at_tick )( tc ); > >>>>> + > >>>>> current = rtems_timecounter_simple_scale( tc, ( *get )( tc ) ); > >>>>> > >>>>> - _Timecounter_Tick_simple( tc->binary_interval, current ); > >>>>> + _Timecounter_Tick_simple( tc->binary_interval, current, > >>>>> &lock_context ); > >>>>> } > >>>>> > >>>>> /** > >>>>> diff --git a/cpukit/score/include/rtems/score/timecounter.h > >>>>> b/cpukit/score/include/rtems/score/timecounter.h > >>>>> index 0d17cc7..0e611b5 100644 > >>>>> --- a/cpukit/score/include/rtems/score/timecounter.h > >>>>> +++ b/cpukit/score/include/rtems/score/timecounter.h > >>>>> @@ -26,6 +26,8 @@ > >>>>> #include <sys/time.h> > >>>>> #include <sys/timetc.h> > >>>>> > >>>>> +#include <rtems/score/isrlock.h> > >>>>> + > >>>>> #ifdef __cplusplus > >>>>> extern "C" { > >>>>> #endif /* __cplusplus */ > >>>>> @@ -161,6 +163,31 @@ void _Timecounter_Install( struct timecounter > *tc > >>>>> ); > >>>>> void _Timecounter_Tick( void ); > >>>>> > >>>>> /** > >>>>> + * @brief Lock to protect the timecounter mechanic. > >>>>> + */ > >>>>> +ISR_LOCK_DECLARE( extern, _Timecounter_Lock ) > >>>>> + > >>>>> +/** > >>>>> + * @brief Acquires the timecounter lock. > >>>>> + * > >>>>> + * @param[in] lock_context The lock context. > >>>>> + * > >>>>> + * See _Timecounter_Tick_simple(). > >>>>> + */ > >>>>> +#define _Timecounter_Acquire( lock_context ) \ > >>>>> + _ISR_lock_ISR_disable_and_acquire( &_Timecounter_Lock, > lock_context ) > >>>>> + > >>>>> +/** > >>>>> + * @brief Releases the timecounter lock. > >>>>> + * > >>>>> + * @param[in] lock_context The lock context. > >>>>> + * > >>>>> + * See _Timecounter_Tick_simple(). > >>>>> + */ > >>>>> +#define _Timecounter_Release(lock_context) \ > >>>>> + _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, lock_context) > >>>>> + > >>>>> +/** > >>>>> * @brief Performs a simple timecounter tick. > >>>>> * > >>>>> * This is a special purpose tick function for simple timecounter to > >>>>> support > >>>>> @@ -169,8 +196,14 @@ void _Timecounter_Tick( void ); > >>>>> * @param[in] delta The time in timecounter ticks elapsed since the > >>>>> last call > >>>>> * to _Timecounter_Tick_simple(). > >>>>> * @param[in] offset The current value of the timecounter. > >>>>> - */ > >>>>> -void _Timecounter_Tick_simple( uint32_t delta, uint32_t offset ); > >>>>> + * @param[in] lock_context The lock context of the corresponding > >>>>> + * _Timecounter_Acquire(). > >>>>> + */ > >>>>> +void _Timecounter_Tick_simple( > >>>>> + uint32_t delta, > >>>>> + uint32_t offset, > >>>>> + ISR_lock_Context *lock_context > >>>>> +); > >>>>> > >>>>> /** > >>>>> * @brief The wall clock time in seconds. > >>>>> diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c > >>>>> index f6a1136..4257533 100644 > >>>>> --- a/cpukit/score/src/kern_tc.c > >>>>> +++ b/cpukit/score/src/kern_tc.c > >>>>> @@ -64,7 +64,9 @@ __FBSDID("$FreeBSD r284178 2015-06-09T11:49:56Z$"); > >>>>> #ifdef __rtems__ > >>>>> #include <limits.h> > >>>>> #include <rtems.h> > >>>>> -ISR_LOCK_DEFINE(static, _Timecounter_Lock, "Timecounter"); > >>>>> +ISR_LOCK_DEFINE(, _Timecounter_Lock, "Timecounter") > >>>>> +#define _Timecounter_Release(lock_context) \ > >>>>> + _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, lock_context) > >>>>> #define hz rtems_clock_get_ticks_per_second() > >>>>> #define printf(...) > >>>>> #define log(...) > >>>>> @@ -1383,7 +1385,7 @@ tc_windup(void) > >>>>> #ifdef __rtems__ > >>>>> ISR_lock_Context lock_context; > >>>>> > >>>>> - _ISR_lock_ISR_disable_and_acquire(&_Timecounter_Lock, > >>>>> &lock_context); > >>>>> + _Timecounter_Acquire(&lock_context); > >>>>> #endif /* __rtems__ */ > >>>>> > >>>>> /* > >>>>> @@ -1538,7 +1540,7 @@ tc_windup(void) > >>>>> timekeep_push_vdso(); > >>>>> #endif /* __rtems__ */ > >>>>> #ifdef __rtems__ > >>>>> - _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, > >>>>> &lock_context); > >>>>> + _Timecounter_Release(&lock_context); > >>>>> #endif /* __rtems__ */ > >>>>> } > >>>>> > >>>>> @@ -1963,14 +1965,12 @@ _Timecounter_Tick(void) > >>>>> } > >>>>> #ifdef __rtems__ > >>>>> void > >>>>> -_Timecounter_Tick_simple(uint32_t delta, uint32_t offset) > >>>>> +_Timecounter_Tick_simple(uint32_t delta, uint32_t offset, > >>>>> + ISR_lock_Context *lock_context) > >>>>> { > >>>>> struct bintime bt; > >>>>> struct timehands *th; > >>>>> uint32_t ogen; > >>>>> - ISR_lock_Context lock_context; > >>>>> - > >>>>> - _ISR_lock_ISR_disable_and_acquire(&_Timecounter_Lock, > >>>>> &lock_context); > >>>>> > >>>>> th = timehands; > >>>>> ogen = th->th_generation; > >>>>> @@ -1997,7 +1997,7 @@ _Timecounter_Tick_simple(uint32_t delta, > uint32_t > >>>>> offset) > >>>>> time_second = th->th_microtime.tv_sec; > >>>>> time_uptime = th->th_offset.sec; > >>>>> > >>>>> - _ISR_lock_Release_and_ISR_enable(&_Timecounter_Lock, > >>>>> &lock_context); > >>>>> + _Timecounter_Release(lock_context); > >>>>> > >>>>> _Watchdog_Tick(); > >>>>> } > >>>>> diff --git a/doc/bsp_howto/clock.t b/doc/bsp_howto/clock.t > >>>>> index f58b898..2891bb2 100644 > >>>>> --- a/doc/bsp_howto/clock.t > >>>>> +++ b/doc/bsp_howto/clock.t > >>>>> @@ -89,6 +89,13 @@ static uint32_t some_tc_get( > >>>>> rtems_timecounter_simple *tc ) > >>>>> return some.counter; > >>>>> @} > >>>>> > >>>>> +static void some_tc_at_tick( rtems_timecounter_simple *tc ) > >>>>> +@{ > >>>>> + /* > >>>>> + * Do work necessary at the clock tick interrupt, e.g. clear a > >>>>> pending flag. > >>>>> + */ > >>>>> +@} > >>>>> + > >>>>> static bool some_tc_is_pending( rtems_timecounter_simple *tc ) > >>>>> @{ > >>>>> return some.is_pending; > >>>>> @@ -105,7 +112,11 @@ static uint32_t some_tc_get_timecount( struct > >>>>> timecounter *tc ) > >>>>> > >>>>> static void some_tc_tick( void ) > >>>>> @{ > >>>>> - rtems_timecounter_simple_downcounter_tick( &some_tc, some_tc_get > ); > >>>>> + rtems_timecounter_simple_downcounter_tick( > >>>>> + &some_tc, > >>>>> + some_tc_get, > >>>>> + some_tc_at_tick > >>>>> + ); > >>>>> @} > >>>>> > >>>>> static void some_support_initialize_hardware( void ) > >>>>> -- > >>>>> 2.7.0 > >>>>> > >>>>> _______________________________________________ > >>>>> devel mailing list > >>>>> devel@rtems.org > >>>>> http://lists.rtems.org/mailman/listinfo/devel > >>>>> > >>>> > >>>> > >>> > >>> > >>> -- > >>> > >>> ______________________________ > >>> > >>> <http://www.tallertechnologies.com> > >>> > >>> > >>> Marcos Díaz > >>> > >>> Software Engineer > >>> > >>> > >>> San Lorenzo 47, 3rd Floor, Office 5 > >>> > >>> Córdoba, Argentina > >>> > >>> > >>> Phone: +54 351 4217888 / +54 351 4218211/ +54 351 7617452 > >>> > >>> Skype: markdiaz22 > >>> > >>> > >> > > > > > > -- > > > > ______________________________ > > > > <http://www.tallertechnologies.com> > > > > > > Marcos Díaz > > > > Software Engineer > > > > > > San Lorenzo 47, 3rd Floor, Office 5 > > > > Córdoba, Argentina > > > > > > Phone: +54 351 4217888 / +54 351 4218211/ +54 351 7617452 > > > > Skype: markdiaz22 > -- ______________________________ <http://www.tallertechnologies.com> Marcos Díaz Software Engineer San Lorenzo 47, 3rd Floor, Office 5 Córdoba, Argentina Phone: +54 351 4217888 / +54 351 4218211/ +54 351 7617452 Skype: markdiaz22
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel