diff --git a/applications/debug/direct_draw/direct_draw.c b/applications/debug/direct_draw/direct_draw.c index bc1e5545977..1e45a6d949b 100644 --- a/applications/debug/direct_draw/direct_draw.c +++ b/applications/debug/direct_draw/direct_draw.c @@ -1,6 +1,5 @@ #include #include -#include #include #define BUFFER_SIZE (32U) @@ -42,10 +41,11 @@ static DirectDraw* direct_draw_alloc(void) { static void direct_draw_free(DirectDraw* instance) { furi_pubsub_unsubscribe(instance->input, instance->input_subscription); - instance->canvas = NULL; gui_direct_draw_release(instance->gui); furi_record_close(RECORD_GUI); furi_record_close(RECORD_INPUT_EVENTS); + + free(instance); } static void direct_draw_block(Canvas* canvas, uint32_t size, uint32_t counter) { diff --git a/furi/core/thread.c b/furi/core/thread.c index 60cc628acb3..65787c0e0f7 100644 --- a/furi/core/thread.c +++ b/furi/core/thread.c @@ -1,5 +1,5 @@ #include "thread.h" -#include "thread_list.h" +#include "thread_list_i.h" #include "kernel.h" #include "memmgr.h" #include "memmgr_heap.h" @@ -65,6 +65,9 @@ struct FuriThread { // IMPORTANT: container MUST be the FIRST struct member static_assert(offsetof(FuriThread, container) == 0); +// Our idle priority should be equal to the one from FreeRTOS +static_assert(FuriThreadPriorityIdle == tskIDLE_PRIORITY); + static size_t __furi_thread_stdout_write(FuriThread* thread, const char* data, size_t size); static int32_t __furi_thread_stdout_flush(FuriThread* thread); @@ -145,6 +148,8 @@ static void furi_thread_init_common(FuriThread* thread) { furi_thread_set_appid(thread, "driver"); } + thread->priority = FuriThreadPriorityNormal; + FuriHalRtcHeapTrackMode mode = furi_hal_rtc_get_heap_track_mode(); if(mode == FuriHalRtcHeapTrackModeAll) { thread->heap_trace_enabled = true; @@ -269,7 +274,7 @@ void furi_thread_set_context(FuriThread* thread, void* context) { void furi_thread_set_priority(FuriThread* thread, FuriThreadPriority priority) { furi_check(thread); furi_check(thread->state == FuriThreadStateStopped); - furi_check(priority >= FuriThreadPriorityIdle && priority <= FuriThreadPriorityIsr); + furi_check(priority <= FuriThreadPriorityIsr); thread->priority = priority; } @@ -281,9 +286,7 @@ FuriThreadPriority furi_thread_get_priority(FuriThread* thread) { void furi_thread_set_current_priority(FuriThreadPriority priority) { furi_check(priority <= FuriThreadPriorityIsr); - - UBaseType_t new_priority = priority ? priority : FuriThreadPriorityNormal; - vTaskPrioritySet(NULL, new_priority); + vTaskPrioritySet(NULL, priority); } FuriThreadPriority furi_thread_get_current_priority(void) { @@ -345,7 +348,6 @@ void furi_thread_start(FuriThread* thread) { furi_thread_set_state(thread, FuriThreadStateStarting); uint32_t stack_depth = thread->stack_size / sizeof(StackType_t); - UBaseType_t priority = thread->priority ? thread->priority : FuriThreadPriorityNormal; thread->is_active = true; @@ -355,7 +357,7 @@ void furi_thread_start(FuriThread* thread) { thread->name, stack_depth, thread, - priority, + thread->priority, thread->stack_buffer, &thread->container) == (TaskHandle_t)thread); } diff --git a/furi/core/thread.h b/furi/core/thread.h index e8cdeaeafb6..d90ece85d6e 100644 --- a/furi/core/thread.h +++ b/furi/core/thread.h @@ -30,11 +30,10 @@ typedef enum { * @brief Enumeration of possible FuriThread priorities. */ typedef enum { - FuriThreadPriorityNone = 0, /**< Uninitialized, choose system default */ - FuriThreadPriorityIdle = 1, /**< Idle priority */ + FuriThreadPriorityIdle = 0, /**< Idle priority */ FuriThreadPriorityLowest = 14, /**< Lowest */ FuriThreadPriorityLow = 15, /**< Low */ - FuriThreadPriorityNormal = 16, /**< Normal */ + FuriThreadPriorityNormal = 16, /**< Normal, system default */ FuriThreadPriorityHigh = 17, /**< High */ FuriThreadPriorityHighest = 18, /**< Highest */ FuriThreadPriorityIsr = diff --git a/furi/core/thread_list.c b/furi/core/thread_list.c index 5355a896caf..e542c192b0f 100644 --- a/furi/core/thread_list.c +++ b/furi/core/thread_list.c @@ -84,7 +84,7 @@ FuriThreadListItem* furi_thread_list_get_or_insert(FuriThreadList* instance, Fur } void furi_thread_list_process(FuriThreadList* instance, uint32_t runtime, uint32_t tick) { - furi_check(instance); + furi_assert(instance); instance->runtime_previous = instance->runtime_current; instance->runtime_current = runtime; diff --git a/furi/core/thread_list.h b/furi/core/thread_list.h index d01aa24a04e..f51aae8cd46 100644 --- a/furi/core/thread_list.h +++ b/furi/core/thread_list.h @@ -68,14 +68,6 @@ FuriThreadListItem* furi_thread_list_get_at(FuriThreadList* instance, size_t pos */ FuriThreadListItem* furi_thread_list_get_or_insert(FuriThreadList* instance, FuriThread* thread); -/** Process items in the FuriThreadList instance - * - * @param instance The instance - * @param[in] runtime The runtime of the system since start - * @param[in] tick The tick when processing happened - */ -void furi_thread_list_process(FuriThreadList* instance, uint32_t runtime, uint32_t tick); - /** Get percent of time spent in ISR * * @param instance The instance diff --git a/furi/core/thread_list_i.h b/furi/core/thread_list_i.h new file mode 100644 index 00000000000..44fe0a9cbcf --- /dev/null +++ b/furi/core/thread_list_i.h @@ -0,0 +1,19 @@ +#pragma once + +#include "thread_list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Process items in the FuriThreadList instance + * + * @param instance The instance + * @param[in] runtime The runtime of the system since start + * @param[in] tick The tick when processing happened + */ +void furi_thread_list_process(FuriThreadList* instance, uint32_t runtime, uint32_t tick); + +#ifdef __cplusplus +} +#endif diff --git a/targets/f18/api_symbols.csv b/targets/f18/api_symbols.csv index 1d9ac28698b..e808f0748d5 100644 --- a/targets/f18/api_symbols.csv +++ b/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,74.0,, +Version,+,75.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, Header,+,applications/services/cli/cli.h,, @@ -1652,7 +1652,6 @@ Function,+,furi_thread_list_free,void,FuriThreadList* Function,+,furi_thread_list_get_at,FuriThreadListItem*,"FuriThreadList*, size_t" Function,+,furi_thread_list_get_isr_time,float,FuriThreadList* Function,+,furi_thread_list_get_or_insert,FuriThreadListItem*,"FuriThreadList*, FuriThread*" -Function,+,furi_thread_list_process,void,"FuriThreadList*, uint32_t, uint32_t" Function,+,furi_thread_list_size,size_t,FuriThreadList* Function,+,furi_thread_resume,void,FuriThreadId Function,+,furi_thread_set_appid,void,"FuriThread*, const char*" diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index cb3037e48f9..7317f7f0471 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,74.0,, +Version,+,75.0,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/bt/bt_service/bt_keys_storage.h,, @@ -1866,7 +1866,6 @@ Function,+,furi_thread_list_free,void,FuriThreadList* Function,+,furi_thread_list_get_at,FuriThreadListItem*,"FuriThreadList*, size_t" Function,+,furi_thread_list_get_isr_time,float,FuriThreadList* Function,+,furi_thread_list_get_or_insert,FuriThreadListItem*,"FuriThreadList*, FuriThread*" -Function,+,furi_thread_list_process,void,"FuriThreadList*, uint32_t, uint32_t" Function,+,furi_thread_list_size,size_t,FuriThreadList* Function,+,furi_thread_resume,void,FuriThreadId Function,+,furi_thread_set_appid,void,"FuriThread*, const char*"