76 lines
1.2 KiB
C++
76 lines
1.2 KiB
C++
/**
|
||
* \file Atomic.hpp
|
||
* \project EFC_PlatformC28x
|
||
* \date 10 мая 2024 г.
|
||
* \author leonidTitov
|
||
*
|
||
* \brief Проба пера использования ассемблерного кода для atomic
|
||
*/
|
||
|
||
#ifndef ATOMIC_HPP_
|
||
#define ATOMIC_HPP_
|
||
|
||
#include <stdint.h>
|
||
|
||
namespace umlib { namespace imp {
|
||
|
||
class AtomicFlag {
|
||
|
||
volatile uint16_t * flag;
|
||
|
||
public:
|
||
|
||
AtomicFlag();
|
||
AtomicFlag(const AtomicFlag &) = delete;
|
||
|
||
AtomicFlag & operator=(const AtomicFlag &) = delete;
|
||
AtomicFlag & operator=(const AtomicFlag &) volatile = delete;
|
||
|
||
bool test_and_set() volatile;
|
||
bool test_and_set();
|
||
|
||
void clear() volatile;
|
||
void clear();
|
||
|
||
~AtomicFlag();
|
||
|
||
};
|
||
|
||
}}
|
||
|
||
extern "C" {
|
||
|
||
extern uint16_t _test_and_set_bit( volatile uint16_t * p );
|
||
extern void _clear_bit( volatile uint16_t * p );
|
||
|
||
}
|
||
|
||
inline bool umlib::imp::AtomicFlag::test_and_set() volatile {
|
||
|
||
return _test_and_set_bit( flag );
|
||
|
||
}
|
||
|
||
inline bool umlib::imp::AtomicFlag::test_and_set() {
|
||
|
||
return _test_and_set_bit( flag );
|
||
|
||
}
|
||
|
||
inline void umlib::imp::AtomicFlag::clear() volatile {
|
||
|
||
_clear_bit( flag );
|
||
|
||
}
|
||
|
||
inline void umlib::imp::AtomicFlag::clear() {
|
||
|
||
_clear_bit( flag );
|
||
|
||
}
|
||
|
||
#endif /* ATOMIC_HPP_ */
|
||
|
||
|
||
// end file Atomic.hpp
|