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
|