[FL-3289] Various Furi/FuriHal bug fixes and improvements (#2637)
* Furi: properly handle thread free before TCB scrapping, add furi_free - more invasive version of free to memmgr. FuriHal: add DWT comparator api to cortex. Updater, RPC: refactor various thread shanenigans. Code cleanup. * Rollback free macros and related changes
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
entry,status,name,type,params
|
||||
Version,+,24.0,,
|
||||
Version,+,26.0,,
|
||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||
Header,+,applications/services/cli/cli.h,,
|
||||
Header,+,applications/services/cli/cli_vcp.h,,
|
||||
@@ -1073,6 +1073,8 @@ Function,+,furi_hal_console_puts,void,const char*
|
||||
Function,+,furi_hal_console_set_tx_callback,void,"FuriHalConsoleTxCallback, void*"
|
||||
Function,+,furi_hal_console_tx,void,"const uint8_t*, size_t"
|
||||
Function,+,furi_hal_console_tx_with_new_line,void,"const uint8_t*, size_t"
|
||||
Function,+,furi_hal_cortex_comp_enable,void,"FuriHalCortexComp, FuriHalCortexCompFunction, uint32_t, uint32_t, FuriHalCortexCompSize"
|
||||
Function,+,furi_hal_cortex_comp_reset,void,FuriHalCortexComp
|
||||
Function,+,furi_hal_cortex_delay_us,void,uint32_t
|
||||
Function,-,furi_hal_cortex_init_early,void,
|
||||
Function,+,furi_hal_cortex_instructions_per_microsecond,uint32_t,
|
||||
@@ -1562,7 +1564,7 @@ Function,+,furi_thread_set_priority,void,"FuriThread*, FuriThreadPriority"
|
||||
Function,+,furi_thread_set_stack_size,void,"FuriThread*, size_t"
|
||||
Function,+,furi_thread_set_state_callback,void,"FuriThread*, FuriThreadStateCallback"
|
||||
Function,+,furi_thread_set_state_context,void,"FuriThread*, void*"
|
||||
Function,+,furi_thread_set_stdout_callback,_Bool,FuriThreadStdoutWriteCallback
|
||||
Function,+,furi_thread_set_stdout_callback,void,FuriThreadStdoutWriteCallback
|
||||
Function,+,furi_thread_start,void,FuriThread*
|
||||
Function,+,furi_thread_stdout_flush,int32_t,
|
||||
Function,+,furi_thread_stdout_write,size_t,"const char*, size_t"
|
||||
@@ -1571,6 +1573,7 @@ Function,+,furi_thread_yield,void,
|
||||
Function,+,furi_timer_alloc,FuriTimer*,"FuriTimerCallback, FuriTimerType, void*"
|
||||
Function,+,furi_timer_free,void,FuriTimer*
|
||||
Function,+,furi_timer_is_running,uint32_t,FuriTimer*
|
||||
Function,+,furi_timer_pending_callback,void,"FuriTimerPendigCallback, void*, uint32_t"
|
||||
Function,+,furi_timer_start,FuriStatus,"FuriTimer*, uint32_t"
|
||||
Function,+,furi_timer_stop,FuriStatus,FuriTimer*
|
||||
Function,-,fwrite,size_t,"const void*, size_t, size_t, FILE*"
|
||||
|
||||
|
@@ -1,11 +1,12 @@
|
||||
#include <furi_hal_cortex.h>
|
||||
#include <furi.h>
|
||||
|
||||
#include <stm32wbxx.h>
|
||||
|
||||
#define FURI_HAL_CORTEX_INSTRUCTIONS_PER_MICROSECOND (SystemCoreClock / 1000000)
|
||||
|
||||
void furi_hal_cortex_init_early() {
|
||||
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||
CoreDebug->DEMCR |= (CoreDebug_DEMCR_TRCENA_Msk | CoreDebug_DEMCR_MON_EN_Msk);
|
||||
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
|
||||
DWT->CYCCNT = 0U;
|
||||
|
||||
@@ -38,4 +39,71 @@ bool furi_hal_cortex_timer_is_expired(FuriHalCortexTimer cortex_timer) {
|
||||
void furi_hal_cortex_timer_wait(FuriHalCortexTimer cortex_timer) {
|
||||
while(!furi_hal_cortex_timer_is_expired(cortex_timer))
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
// Duck ST
|
||||
#undef COMP0
|
||||
#undef COMP1
|
||||
#undef COMP2
|
||||
#undef COMP3
|
||||
|
||||
void furi_hal_cortex_comp_enable(
|
||||
FuriHalCortexComp comp,
|
||||
FuriHalCortexCompFunction function,
|
||||
uint32_t value,
|
||||
uint32_t mask,
|
||||
FuriHalCortexCompSize size) {
|
||||
uint32_t function_reg = (uint32_t)function | ((uint32_t)size << 10);
|
||||
|
||||
switch(comp) {
|
||||
case FuriHalCortexComp0:
|
||||
(DWT->COMP0) = value;
|
||||
(DWT->MASK0) = mask;
|
||||
(DWT->FUNCTION0) = function_reg;
|
||||
break;
|
||||
case FuriHalCortexComp1:
|
||||
(DWT->COMP1) = value;
|
||||
(DWT->MASK1) = mask;
|
||||
(DWT->FUNCTION1) = function_reg;
|
||||
break;
|
||||
case FuriHalCortexComp2:
|
||||
(DWT->COMP2) = value;
|
||||
(DWT->MASK2) = mask;
|
||||
(DWT->FUNCTION2) = function_reg;
|
||||
break;
|
||||
case FuriHalCortexComp3:
|
||||
(DWT->COMP3) = value;
|
||||
(DWT->MASK3) = mask;
|
||||
(DWT->FUNCTION3) = function_reg;
|
||||
break;
|
||||
default:
|
||||
furi_crash("Invalid parameter");
|
||||
}
|
||||
}
|
||||
|
||||
void furi_hal_cortex_comp_reset(FuriHalCortexComp comp) {
|
||||
switch(comp) {
|
||||
case FuriHalCortexComp0:
|
||||
(DWT->COMP0) = 0;
|
||||
(DWT->MASK0) = 0;
|
||||
(DWT->FUNCTION0) = 0;
|
||||
break;
|
||||
case FuriHalCortexComp1:
|
||||
(DWT->COMP1) = 0;
|
||||
(DWT->MASK1) = 0;
|
||||
(DWT->FUNCTION1) = 0;
|
||||
break;
|
||||
case FuriHalCortexComp2:
|
||||
(DWT->COMP2) = 0;
|
||||
(DWT->MASK2) = 0;
|
||||
(DWT->FUNCTION2) = 0;
|
||||
break;
|
||||
case FuriHalCortexComp3:
|
||||
(DWT->COMP3) = 0;
|
||||
(DWT->MASK3) = 0;
|
||||
(DWT->FUNCTION3) = 0;
|
||||
break;
|
||||
default:
|
||||
furi_crash("Invalid parameter");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user