62 lines
1.1 KiB
C++
62 lines
1.1 KiB
C++
/*
|
||
* \file Atomic.cpp
|
||
* \project EFC_PlatformC28x
|
||
* \date 23 мая 2024 г.
|
||
* \author leonidTitov
|
||
*
|
||
* \brief Создание флага atomic из одной ассемблерной операции (ну ладно, из трёх)
|
||
*/
|
||
|
||
#include "Atomic.hpp"
|
||
|
||
#ifndef ATOMIC_FLAGS_COUNT
|
||
#define ATOMIC_FLAGS_COUNT 32
|
||
#endif
|
||
|
||
extern "C" {
|
||
|
||
extern uint16_t _test_and_set_bit_1( volatile uint16_t * p );
|
||
extern void _clear_bit_1( volatile uint16_t * p );
|
||
|
||
}
|
||
|
||
namespace {
|
||
|
||
volatile uint16_t atomic_flags[ATOMIC_FLAGS_COUNT] = {};
|
||
|
||
volatile uint16_t * create_flag() {
|
||
|
||
for( int i = 0; i < ATOMIC_FLAGS_COUNT; i++ )
|
||
if( not( _test_and_set_bit_1( atomic_flags + i ) ) )
|
||
return &atomic_flags[i];
|
||
|
||
while(true);
|
||
|
||
}
|
||
|
||
void delete_flag( volatile uint16_t * atomic_flag ) {
|
||
|
||
_clear_bit_1( atomic_flag );
|
||
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* Create Flag
|
||
*/
|
||
umlib::imp::AtomicFlag::AtomicFlag() : flag( create_flag() ) {
|
||
|
||
clear();
|
||
|
||
}
|
||
|
||
/**
|
||
* Delete Flag
|
||
*/
|
||
umlib::imp::AtomicFlag::~AtomicFlag() {
|
||
|
||
delete_flag( flag );
|
||
|
||
}
|