Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prevent idle priority threads from potentially starving the FreeRTOS idle task #3909

Merged
merged 4 commits into from
Oct 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions applications/debug/direct_draw/direct_draw.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#include <furi.h>
#include <gui/gui.h>
#include <gui/canvas_i.h>
#include <input/input.h>

#define BUFFER_SIZE (32U)
Expand Down Expand Up @@ -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) {
Expand Down
16 changes: 9 additions & 7 deletions furi/core/thread.c
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand All @@ -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) {
Expand Down Expand Up @@ -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;

Expand All @@ -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);
}
Expand Down
5 changes: 2 additions & 3 deletions furi/core/thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
2 changes: 1 addition & 1 deletion furi/core/thread_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 0 additions & 8 deletions furi/core/thread_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 19 additions & 0 deletions furi/core/thread_list_i.h
Original file line number Diff line number Diff line change
@@ -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
3 changes: 1 addition & 2 deletions targets/f18/api_symbols.csv
Original file line number Diff line number Diff line change
@@ -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,,
Expand Down Expand Up @@ -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*"
Expand Down
3 changes: 1 addition & 2 deletions targets/f7/api_symbols.csv
Original file line number Diff line number Diff line change
@@ -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,,
Expand Down Expand Up @@ -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*"
Expand Down