Skip to content

Commit 213f979

Browse files
committed
Support static allocation in Freertos example
1 parent f9ef15b commit 213f979

File tree

3 files changed

+55
-6
lines changed

3 files changed

+55
-6
lines changed

freertos/FreeRTOSConfig_examples_common.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,12 @@
7070
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
7171

7272
/* Memory allocation related definitions. */
73+
#ifndef configSUPPORT_STATIC_ALLOCATION
7374
#define configSUPPORT_STATIC_ALLOCATION 0
75+
#endif
76+
#ifndef configSUPPORT_DYNAMIC_ALLOCATION
7477
#define configSUPPORT_DYNAMIC_ALLOCATION 1
78+
#endif
7579
#define configTOTAL_HEAP_SIZE (128*1024)
7680
#define configAPPLICATION_ALLOCATED_HEAP 0
7781

freertos/hello_freertos/CMakeLists.txt

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
set(USE_STATIC_ALLOC ON)
2+
13
set(TARGET_NAME hello_freertos1)
24
add_executable(${TARGET_NAME}
35
hello_freertos.c
@@ -7,14 +9,26 @@ target_include_directories(${TARGET_NAME} PRIVATE
79
)
810
target_link_libraries(${TARGET_NAME} PRIVATE
911
pico_async_context_freertos
10-
FreeRTOS-Kernel-Heap4
1112
pico_stdlib
1213
)
14+
if(USE_STATIC_ALLOC)
15+
target_compile_definitions(${TARGET_NAME} PRIVATE
16+
configSUPPORT_STATIC_ALLOCATION=1
17+
configSUPPORT_DYNAMIC_ALLOCATION=0
18+
)
19+
target_link_libraries(${TARGET_NAME} PRIVATE
20+
FreeRTOS-Kernel-Static
21+
)
22+
else()
23+
target_link_libraries(${TARGET_NAME} PRIVATE
24+
FreeRTOS-Kernel-Heap4
25+
)
26+
endif()
1327
if(PICO_CYW43_SUPPORTED)
1428
# For led support on pico_w
1529
target_link_libraries(${TARGET_NAME} PRIVATE
1630
pico_cyw43_arch_none
17-
)
31+
)
1832
endif()
1933
target_compile_definitions(${TARGET_NAME} PRIVATE
2034
configNUMBER_OF_CORES=1
@@ -30,13 +44,25 @@ target_include_directories(${TARGET_NAME} PRIVATE
3044
)
3145
target_link_libraries(${TARGET_NAME} PRIVATE
3246
pico_async_context_freertos
33-
FreeRTOS-Kernel-Heap4
3447
pico_stdlib
3548
)
49+
if(USE_STATIC_ALLOC)
50+
target_compile_definitions(${TARGET_NAME} PRIVATE
51+
configSUPPORT_STATIC_ALLOCATION=1
52+
configSUPPORT_DYNAMIC_ALLOCATION=0
53+
)
54+
target_link_libraries(${TARGET_NAME} PRIVATE
55+
FreeRTOS-Kernel-Static
56+
)
57+
else()
58+
target_link_libraries(${TARGET_NAME} PRIVATE
59+
FreeRTOS-Kernel-Heap4
60+
)
61+
endif()
3662
if(PICO_CYW43_SUPPORTED)
3763
# For led support on pico_w
3864
target_link_libraries(${TARGET_NAME} PRIVATE
3965
pico_cyw43_arch_none
40-
)
66+
)
4167
endif()
4268
pico_add_extra_outputs(${TARGET_NAME})

freertos/hello_freertos/hello_freertos.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ static async_context_t *example_async_context(void) {
5252
async_context_freertos_config_t config = async_context_freertos_default_config();
5353
config.task_priority = WORKER_TASK_PRIORITY; // defaults to ASYNC_CONTEXT_DEFAULT_FREERTOS_TASK_PRIORITY
5454
config.task_stack_size = WORKER_TASK_STACK_SIZE; // defaults to ASYNC_CONTEXT_DEFAULT_FREERTOS_TASK_STACK_SIZE
55+
#if configSUPPORT_STATIC_ALLOCATION
56+
static StackType_t async_context_freertos_task_stack[WORKER_TASK_STACK_SIZE];
57+
config.task_stack = async_context_freertos_task_stack;
58+
#endif
5559
if (!async_context_freertos_init(&async_context_instance, &config))
5660
return NULL;
5761
return &async_context_instance.core;
@@ -127,8 +131,15 @@ void main_task(__unused void *params) {
127131
async_context_add_at_time_worker_in_ms(context, &worker_timeout, 0);
128132
#if USE_LED
129133
// start the led blinking
134+
#if configSUPPORT_STATIC_ALLOCATION
135+
static StackType_t blink_stack[BLINK_TASK_STACK_SIZE];
136+
static StaticTask_t blink_buf;
137+
xTaskCreateStatic(blink_task, "BlinkThread", BLINK_TASK_STACK_SIZE, NULL, BLINK_TASK_PRIORITY, blink_stack, &blink_buf);
138+
#else
139+
static_assert(configSUPPORT_DYNAMIC_ALLOCATION, "");
130140
xTaskCreate(blink_task, "BlinkThread", BLINK_TASK_STACK_SIZE, NULL, BLINK_TASK_PRIORITY, NULL);
131-
#endif
141+
#endif // configSUPPORT_STATIC_ALLOCATION
142+
#endif // USE_LED
132143
int count = 0;
133144
while(true) {
134145
#if configNUMBER_OF_CORES > 1
@@ -146,11 +157,19 @@ void main_task(__unused void *params) {
146157

147158
void vLaunch( void) {
148159
TaskHandle_t task;
160+
#if configSUPPORT_STATIC_ALLOCATION
161+
static StackType_t main_stack[MAIN_TASK_STACK_SIZE];
162+
static StaticTask_t main_buf;
163+
task = xTaskCreateStatic(main_task, "MainThread", MAIN_TASK_STACK_SIZE, NULL, MAIN_TASK_PRIORITY, main_stack, &main_buf);
164+
#else
165+
static_assert(configSUPPORT_DYNAMIC_ALLOCATION, "");
149166
xTaskCreate(main_task, "MainThread", MAIN_TASK_STACK_SIZE, NULL, MAIN_TASK_PRIORITY, &task);
150-
167+
#endif // configSUPPORT_STATIC_ALLOCATION
151168
#if configUSE_CORE_AFFINITY && configNUMBER_OF_CORES > 1
152169
// we must bind the main task to one core (well at least while the init is called)
153170
vTaskCoreAffinitySet(task, 1);
171+
#else
172+
(void)task;
154173
#endif
155174

156175
/* Start the tasks and timer running. */

0 commit comments

Comments
 (0)