Size: a a a

2020 August 08

VD

Vlad Doc in supapro.cxx
std::slavik
SIGBUS просто скорей всего какой нить вылетает
Кста да. Поставить обработчики сигналов будет полезно.
источник

VD

Vlad Doc in supapro.cxx
Чтобы хотя бы высрать в консольку что сигнал зарейзился.
источник

s

std::slavik in supapro.cxx
ну и с адресами - типа такого облегчает читаемость - магические какие-то сайзофы и си стайл приведения - такое, даже если вроде несложное какое-то вычисление смещения - всегда стоит потратить немного времени и обернуть это в понятные дефайны/константы
#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

Denis Paukaev in supapro.cxx
#define ?
источник

DP

Denis Paukaev in supapro.cxx
И рядом constexpr
источник

s

std::slavik in supapro.cxx
Denis Paukaev
#define ?
ну это разные файлы)
источник

s

std::slavik in supapro.cxx
один сишный
источник

s

std::slavik in supapro.cxx
другой плюсовый
источник

s

std::slavik in supapro.cxx
ну если есть возможность constexpr использовать - лучше его конечно)
источник

s

std::slavik in supapro.cxx
но если нет - макросы наше все
источник

o

osm1um in supapro.cxx
Ребята, я тут нашёл одну +/- no name(по крайней мере мне так показалось) книгу. Есть люди которые прочитали тонны книг и могли бы её оценить?
источник

o

osm1um in supapro.cxx
*на быструю руку, между строк*
источник

o

osm1um in supapro.cxx
Не знаю стоит ли тратить на подобное время 😅
источник

s

std::slavik in supapro.cxx
Denis Paukaev
#define ?
ну и я тут просто изначально статически типа размечал память sdram - потому через дефайны делал, но потом чето с этим проблем больше стало огребаться и написал простенький менеджер-аллокатор
источник

s

std::slavik in supapro.cxx
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

Denis Paukaev in supapro.cxx
Что за инит войд )
источник

s

std::slavik in supapro.cxx
при инициализации просто все кому буфферы нужны статические во внешней памяти - дергают его и получают указатель
источник

DP

Denis Paukaev in supapro.cxx
Архаика какая то
источник

ПК

Побитый Кирпич... in supapro.cxx
std::slavik
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;
};
типа такого
Поздравляю, у тебя UB
источник

s

std::slavik in supapro.cxx
Denis Paukaev
Архаика какая то
менеджер инициализирует FSMC
источник