VD
Size: a a a
VD
VD
s
#define SDRAM_START_ADDRESS 0xC0000000
#define SDRAM_SIZE 0x01000000
#define SDRAM_END_ADDRESS (SDRAM_START_ADDRESS + SDRAM_SIZE)
#define AUDIO_BLOCK_SIZE 0x00000400
#define AUDIO_BUFFER_IN_START_ADDRESS (SDRAM_START_ADDRESS)
#define AUDIO_BUFFER_IN (AUDIO_BUFFER_IN_START_ADDRESS)
#define AUDIO_BUFFER_IN1 (AUDIO_BUFFER_IN)
#define AUDIO_BUFFER_IN2 (AUDIO_BUFFER_IN1 + AUDIO_BLOCK_SIZE)
#define AUDIO_BUFFER_IN_END_ADDRESS (AUDIO_BUFFER_IN2 + AUDIO_BLOCK_SIZE)
...
constexpr uint32_t IS_PLAYING_FLAG = (1UL << 0);
constexpr uint32_t IS_RECORDING_FLAG = (1UL << 1);
constexpr size_t AUDIO_FREQ_BASE = 16000;
constexpr size_t AUDIO_FREQ = 16000;
constexpr size_t MIC_CHANNELS = 2;
constexpr size_t SPEAKER_CHANNELS = 2;
constexpr size_t RECORDING_RMS_WINDOW_SIZE = 128;
constexpr bool IS_USB_RECORD_ENABLED = false;
constexpr bool IS_RECOGNITION_ENABLED = true;
constexpr auto kAmplificationCoefficient = 30;
constexpr uint16_t kVendorID = 0x7bb8;
constexpr uint16_t kProductID = SPEAKER_CHANNELS | (MIC_CHANNELS << 3);
constexpr uint16_t kProductRelease = 0x0100 + (AUDIO_FREQ / 1000);
constexpr uint16_t kRecognitionDecimationFactor = AUDIO_FREQ / AUDIO_FREQ_BASE;
constexpr size_t kAudioWordsPerMs = 2 * (AUDIO_FREQ / 1000);
constexpr size_t kAudioBlockSizeWords = 1 * AUDIO_BLOCK_SIZE;
constexpr size_t kMsPerAudioBlock = 1 + kAudioBlockSizeWords / kAudioWordsPerMs;
constexpr uint32_t kUSBAudioBufferMs = 2 * kMsPerAudioBlock;
constexpr size_t kOutBufHalfSizeBytes = sizeof(int16_t) * kAudioBlockSizeWords;
constexpr size_t kOutBufFullSizeBytes = kOutBufHalfSizeBytes * 2;
static uint32_t pbuf32[2 * kAudioBlockSizeWords];
static uint16_t pbuf16[2 * kAudioBlockSizeWords];
DP
DP
s
s
s
s
s
o
o
o
s
s
class ExternalMemoryManager : public Singleton<ExternalMemoryManager> {
public:
void init(void) {
LOCK_GUARD(this->_mutex);
if (!initialized) {
// SDRAM Init
BSP_SDRAM_Init();
initialized = true;
}
}
uint8_t *allocate(size_t size) {
LOCK_GUARD(this->_mutex);
if (get_free_space() < size) {
return nullptr;
}
uint8_t *buf = _current_free_memory_p;
_current_free_memory_p += size;
return buf;
}
void free(void) {
LOCK_GUARD(this->_mutex);
_current_free_memory_p = reinterpret_cast<uint8_t *>(_MEMORY_START_ADDRESS);
}
size_t get_free_space(void) {
return static_cast<size_t>(
reinterpret_cast<uint8_t *>(_MEMORY_END_ADDRESS) -
_current_free_memory_p);
}
private:
const uint32_t _MEMORY_START_ADDRESS = SDRAM_START_ADDRESS;
const uint32_t _MEMORY_END_ADDRESS = SDRAM_END_ADDRESS;
uint8_t *_current_free_memory_p =
reinterpret_cast<uint8_t *>(_MEMORY_START_ADDRESS);
Mutex _mutex;
bool initialized = false;
};
типа такогоDP
s
DP
ПК
class ExternalMemoryManager : public Singleton<ExternalMemoryManager> {
public:
void init(void) {
LOCK_GUARD(this->_mutex);
if (!initialized) {
// SDRAM Init
BSP_SDRAM_Init();
initialized = true;
}
}
uint8_t *allocate(size_t size) {
LOCK_GUARD(this->_mutex);
if (get_free_space() < size) {
return nullptr;
}
uint8_t *buf = _current_free_memory_p;
_current_free_memory_p += size;
return buf;
}
void free(void) {
LOCK_GUARD(this->_mutex);
_current_free_memory_p = reinterpret_cast<uint8_t *>(_MEMORY_START_ADDRESS);
}
size_t get_free_space(void) {
return static_cast<size_t>(
reinterpret_cast<uint8_t *>(_MEMORY_END_ADDRESS) -
_current_free_memory_p);
}
private:
const uint32_t _MEMORY_START_ADDRESS = SDRAM_START_ADDRESS;
const uint32_t _MEMORY_END_ADDRESS = SDRAM_END_ADDRESS;
uint8_t *_current_free_memory_p =
reinterpret_cast<uint8_t *>(_MEMORY_START_ADDRESS);
Mutex _mutex;
bool initialized = false;
};
типа такогоs