source: rtems/c/src/lib/libbsp/arm/atsam/utils/utility.h @ 8467c31

5
Last change on this file since 8467c31 was e1eeb883, checked in by Sebastian Huber <sebastian.huber@…>, on Jan 12, 2016 at 2:34:31 PM

bsp/atsam: Import SAM Software Package

Import selected files of the "SAM V71 / V70 / E70 / S70 Software
Package" obtained from the "SAMV71-XULT GNU Software Package 1.5".

Converted files via dos2unix before import.

Update #2529.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/* ----------------------------------------------------------------------------
2 *         SAM Software Package License
3 * ----------------------------------------------------------------------------
4 * Copyright (c) 2014, Atmel Corporation
5 *
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * - Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the disclaimer below.
13 *
14 * Atmel's name may not be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 * ----------------------------------------------------------------------------
28 */
29
30#ifndef UTILITY_H
31#define UTILITY_H
32
33#include "chip.h"
34 
35
36
37#define RESET_CYCLE_COUNTER()  do { \
38        CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_Msk; \
39        __DSB(); DWT->LAR = 0xC5ACCE55; __DSB(); \
40        DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; \
41        DWT->CYCCNT = 0; \
42        DWT->CTRL = DWT_CTRL_CYCCNTENA_Msk; \
43    }while(0)
44
45#define GET_CYCLE_COUNTER(x)                x=DWT->CYCCNT;   
46
47#define LockMutex(mut, timeout)             get_lock(&mut, 1, &timeout)
48   
49#define ReleaseMutex(mut)                   free_lock(&mut)
50
51#define GetResource(mut, max, timeout)      get_lock(&mut, max, &timeout)
52   
53#define FreeResource(mut)                   free_lock(&mut)
54
55
56__STATIC_INLINE uint8_t Is_LockFree(volatile uint8_t *Lock_Variable)
57{
58    /* return Variable value*/
59    return __LDREXB(Lock_Variable); 
60   
61}
62
63__STATIC_INLINE uint8_t get_lock(volatile uint8_t *Lock_Variable, const uint8_t maxValue, volatile uint32_t *pTimeout)
64{
65    while (*pTimeout)
66        {
67        if(__LDREXB(Lock_Variable) < maxValue)
68        {
69          /* Set the Variable */
70          while( __STREXB(((*Lock_Variable) + 1), Lock_Variable) )
71          {           
72            if(!(*pTimeout)--)
73            {
74              return 1;       // quit if timeout
75            }
76          }
77          /* Memory access barrier */
78          __DMB();
79          TRACE_DEBUG("Mutex locked ");
80          return 0;
81        }
82       
83        ((*pTimeout)--);
84        }
85    return 1;
86}
87
88
89
90__STATIC_INLINE uint8_t free_lock(volatile uint8_t *Lock_Variable)
91{
92    /* Memory access barrier Ensure memory operations completed before releasing lock  */
93    __DSB();
94    if(__LDREXB(Lock_Variable))
95    {
96      __STREXB( ((*Lock_Variable) - 1), Lock_Variable);
97      TRACE_DEBUG("Mutex freed ");
98      __DSB();
99      __DMB(); // Ensure memory operations completed before
100      return 0;
101    }
102    else
103    {
104      return 1;
105    }
106   
107   
108}
109
110
111#endif /* UTILITY_H */
Note: See TracBrowser for help on using the repository browser.