mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-11-10 06:54:19 +00:00
Core2, SRAM2: provide safety gap (#2754)
* Core2, SRAM2: use ob, provide safety gap * thread: comment about critical section and scheduler state
This commit is contained in:
parent
bff5921266
commit
62939dd28b
2 changed files with 44 additions and 40 deletions
|
@ -4,6 +4,9 @@
|
||||||
|
|
||||||
#define TAG "FuriHalMemory"
|
#define TAG "FuriHalMemory"
|
||||||
|
|
||||||
|
// STM(TM) Copro(TM) bug(TM) workaround size
|
||||||
|
#define RAM2B_COPRO_GAP_SIZE_KB 2
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SRAM_A,
|
SRAM_A,
|
||||||
SRAM_B,
|
SRAM_B,
|
||||||
|
@ -30,19 +33,17 @@ void furi_hal_memory_init() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ble_glue_wait_for_c2_start(FURI_HAL_BT_C2_START_TIMEOUT)) {
|
|
||||||
FURI_LOG_E(TAG, "C2 start timeout");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FuriHalMemory* memory = malloc(sizeof(FuriHalMemory));
|
FuriHalMemory* memory = malloc(sizeof(FuriHalMemory));
|
||||||
|
|
||||||
const BleGlueC2Info* c2_ver = ble_glue_get_c2_info();
|
uint32_t sbrsa = (FLASH->SRRVR & FLASH_SRRVR_SBRSA_Msk) >> FLASH_SRRVR_SBRSA_Pos;
|
||||||
|
uint32_t snbrsa = (FLASH->SRRVR & FLASH_SRRVR_SNBRSA_Msk) >> FLASH_SRRVR_SNBRSA_Pos;
|
||||||
|
|
||||||
if(c2_ver->mode == BleGlueC2ModeStack) {
|
|
||||||
uint32_t sram2a_busy_size = (uint32_t)&__sram2a_free__ - (uint32_t)&__sram2a_start__;
|
uint32_t sram2a_busy_size = (uint32_t)&__sram2a_free__ - (uint32_t)&__sram2a_start__;
|
||||||
uint32_t sram2a_unprotected_size = (32 - c2_ver->MemorySizeSram2A) * 1024;
|
uint32_t sram2a_unprotected_size = (sbrsa)*1024;
|
||||||
uint32_t sram2b_unprotected_size = (32 - c2_ver->MemorySizeSram2B) * 1024;
|
uint32_t sram2b_unprotected_size = (snbrsa)*1024;
|
||||||
|
|
||||||
|
// STM(TM) Copro(TM) bug(TM) workaround
|
||||||
|
sram2b_unprotected_size -= 1024 * RAM2B_COPRO_GAP_SIZE_KB;
|
||||||
|
|
||||||
memory->region[SRAM_A].start = (uint8_t*)&__sram2a_free__;
|
memory->region[SRAM_A].start = (uint8_t*)&__sram2a_free__;
|
||||||
memory->region[SRAM_B].start = (uint8_t*)&__sram2b_start__;
|
memory->region[SRAM_B].start = (uint8_t*)&__sram2b_start__;
|
||||||
|
@ -74,10 +75,6 @@ void furi_hal_memory_init() {
|
||||||
free(memory);
|
free(memory);
|
||||||
FURI_LOG_E(TAG, "No SRAM2 available");
|
FURI_LOG_E(TAG, "No SRAM2 available");
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
free(memory);
|
|
||||||
FURI_LOG_E(TAG, "No Core2 available");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void* furi_hal_memory_alloc(size_t size) {
|
void* furi_hal_memory_alloc(size_t size) {
|
||||||
|
@ -89,15 +86,20 @@ void* furi_hal_memory_alloc(size_t size) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* allocated_memory = NULL;
|
||||||
|
FURI_CRITICAL_ENTER();
|
||||||
for(int i = 0; i < SRAM_MAX; i++) {
|
for(int i = 0; i < SRAM_MAX; i++) {
|
||||||
if(furi_hal_memory->region[i].size >= size) {
|
if(furi_hal_memory->region[i].size >= size) {
|
||||||
void* ptr = furi_hal_memory->region[i].start;
|
void* ptr = furi_hal_memory->region[i].start;
|
||||||
furi_hal_memory->region[i].start += size;
|
furi_hal_memory->region[i].start += size;
|
||||||
furi_hal_memory->region[i].size -= size;
|
furi_hal_memory->region[i].size -= size;
|
||||||
return ptr;
|
allocated_memory = ptr;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
FURI_CRITICAL_EXIT();
|
||||||
|
|
||||||
|
return allocated_memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t furi_hal_memory_get_free() {
|
size_t furi_hal_memory_get_free() {
|
||||||
|
|
|
@ -56,6 +56,8 @@ static int32_t __furi_thread_stdout_flush(FuriThread* thread);
|
||||||
|
|
||||||
/** Catch threads that are trying to exit wrong way */
|
/** Catch threads that are trying to exit wrong way */
|
||||||
__attribute__((__noreturn__)) void furi_thread_catch() { //-V1082
|
__attribute__((__noreturn__)) void furi_thread_catch() { //-V1082
|
||||||
|
// If you're here it means you're probably doing something wrong
|
||||||
|
// with critical sections or with scheduler state
|
||||||
asm volatile("nop"); // extra magic
|
asm volatile("nop"); // extra magic
|
||||||
furi_crash("You are doing it wrong"); //-V779
|
furi_crash("You are doing it wrong"); //-V779
|
||||||
__builtin_unreachable();
|
__builtin_unreachable();
|
||||||
|
|
Loading…
Reference in a new issue