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 );
|
|||
|
|
|
|||
|
|
}
|