[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,,
|
||||
@@ -892,6 +892,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,
|
||||
@@ -1278,7 +1280,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"
|
||||
@@ -1287,6 +1289,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,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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +56,53 @@ bool furi_hal_cortex_timer_is_expired(FuriHalCortexTimer cortex_timer);
|
||||
*/
|
||||
void furi_hal_cortex_timer_wait(FuriHalCortexTimer cortex_timer);
|
||||
|
||||
typedef enum {
|
||||
FuriHalCortexComp0,
|
||||
FuriHalCortexComp1,
|
||||
FuriHalCortexComp2,
|
||||
FuriHalCortexComp3,
|
||||
} FuriHalCortexComp;
|
||||
|
||||
typedef enum {
|
||||
FuriHalCortexCompSizeWord = 0b10,
|
||||
FuriHalCortexCompSizeHalfWord = 0b01,
|
||||
FuriHalCortexCompSizeByte = 0b00,
|
||||
} FuriHalCortexCompSize;
|
||||
|
||||
typedef enum {
|
||||
FuriHalCortexCompFunctionPC = 0b100,
|
||||
FuriHalCortexCompFunctionRead = 0b101,
|
||||
FuriHalCortexCompFunctionWrite = 0b110,
|
||||
FuriHalCortexCompFunctionReadWrite = 0b110,
|
||||
} FuriHalCortexCompFunction;
|
||||
|
||||
/** Enable DWT comparator
|
||||
*
|
||||
* Allows to programmatically set instruction/data breakpoints.
|
||||
*
|
||||
* More details on how it works can be found in armv7m official documentation:
|
||||
* https://developer.arm.com/documentation/ddi0403/d/Debug-Architecture/ARMv7-M-Debug/The-Data-Watchpoint-and-Trace-unit/The-DWT-comparators
|
||||
* https://developer.arm.com/documentation/ddi0403/d/Debug-Architecture/ARMv7-M-Debug/The-Data-Watchpoint-and-Trace-unit/Comparator-Function-registers--DWT-FUNCTIONn
|
||||
*
|
||||
* @param[in] comp The Comparator
|
||||
* @param[in] function The Comparator Function to use
|
||||
* @param[in] value The value
|
||||
* @param[in] mask The mask
|
||||
* @param[in] size The size
|
||||
*/
|
||||
void furi_hal_cortex_comp_enable(
|
||||
FuriHalCortexComp comp,
|
||||
FuriHalCortexCompFunction function,
|
||||
uint32_t value,
|
||||
uint32_t mask,
|
||||
FuriHalCortexCompSize size);
|
||||
|
||||
/** Reset DWT comparator
|
||||
*
|
||||
* @param[in] comp The Comparator
|
||||
*/
|
||||
void furi_hal_cortex_comp_reset(FuriHalCortexComp comp);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user