# Copyright 2024 The Pigweed Authors # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # This is a BUILD.bazel file template for FreeRTOS. # # TODO(b/326625641): Contribute this to upstream FreeRTOS. # buildifier: disable=module-docstring package(default_visibility = ["//visibility:public"]) # Label flag that points to the cc_library target providing freertos_config.h. label_flag( name = "freertos_config", build_setting_default = ":default_freertos_config", ) cc_library( name = "default_freertos_config", # The "default" config is not compatible with any configuration: you can't # build FreeRTOS without choosing a config. target_compatible_with = ["@platforms//:incompatible"], ) # Constraint setting used to select the FreeRTOSConfig version. constraint_setting( name = "freertos_config_setting", ) constraint_setting( name = "port", ) # Cortex-M33 with No TrustZone constraint_value( name = "port_ARM_CM33_NTZ", constraint_setting = ":port", ) constraint_value( name = "port_ARM_CM4F", constraint_setting = ":port", ) constraint_value( name = "port_ARM_CM0", constraint_setting = ":port", ) constraint_value( name = "port_ARM_CM3", constraint_setting = ":port", ) constraint_value( name = "port_ARM_CM7", constraint_setting = ":port", ) constraint_value( name = "port_Xtensa", constraint_setting = ":port", ) cc_library( name = "freertos", srcs = [ "croutine.c", "event_groups.c", "list.c", "queue.c", "stream_buffer.c", "timers.c", ] + select({ ":port_ARM_CM0": ["portable/GCC/ARM_CM0/port.c"], ":port_ARM_CM3": ["portable/GCC/ARM_CM3/port.c"], ":port_ARM_CM33_NTZ": [ "portable/GCC/ARM_CM33_NTZ/non_secure/port.c", "portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c", ], ":port_ARM_CM4F": ["portable/GCC/ARM_CM4F/port.c"], ":port_ARM_CM7": ["portable/GCC/ARM_CM7/r0p1/port.c"], ":port_Xtensa": [ "portable/ThirdParty/XCC/Xtensa/mpu.S", "portable/ThirdParty/XCC/Xtensa/port.c", "portable/ThirdParty/XCC/Xtensa/portasm.S", "portable/ThirdParty/XCC/Xtensa/portclib.c", "portable/ThirdParty/XCC/Xtensa/portmpu.c", "portable/ThirdParty/XCC/Xtensa/xtensa_context.S", "portable/ThirdParty/XCC/Xtensa/xtensa_coproc_handler.S", "portable/ThirdParty/XCC/Xtensa/xtensa_intr.c", "portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S", "portable/ThirdParty/XCC/Xtensa/xtensa_intr_wrapper.c", "portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c", "portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S", ], "//conditions:default": [], }), includes = ["include/"], textual_hdrs = [ "include/FreeRTOS.h", "include/StackMacros.h", "include/croutine.h", "include/deprecated_definitions.h", "include/event_groups.h", "include/list.h", "include/message_buffer.h", "include/mpu_wrappers.h", "include/portable.h", "include/projdefs.h", "include/queue.h", "include/semphr.h", "include/stack_macros.h", "include/stream_buffer.h", "include/task.h", "include/timers.h", ], deps = [ ":freertos_config", ":freertos_malloc", ":freertos_port_headers", ":tasks_c", ], # Required because breaking out tasks_c results in the dependencies between # the libraries not being quite correct: to link tasks_c you actually need # a bunch of the source files from here (e.g., list.c). alwayslink = 1, ) cc_library( name = "freertos_port_headers", hdrs = select({ ":port_ARM_CM0": ["portable/GCC/ARM_CM0/portmacro.h"], ":port_ARM_CM3": ["portable/GCC/ARM_CM3/portmacro.h"], ":port_ARM_CM33_NTZ": [ "portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h", "portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h", ], ":port_ARM_CM4F": ["portable/GCC/ARM_CM4F/portmacro.h"], ":port_ARM_CM7": ["portable/GCC/ARM_CM7/r0p1/portmacro.h"], ":port_Xtensa": [ "portable/ThirdParty/XCC/Xtensa/portbenchmark.h", "portable/ThirdParty/XCC/Xtensa/portmacro.h", "portable/ThirdParty/XCC/Xtensa/porttrace.h", "portable/ThirdParty/XCC/Xtensa/xtensa_api.h", "portable/ThirdParty/XCC/Xtensa/xtensa_config.h", "portable/ThirdParty/XCC/Xtensa/xtensa_context.h", "portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h", "portable/ThirdParty/XCC/Xtensa/xtensa_timer.h", ], "//conditions:default": [], }), includes = select({ ":port_ARM_CM0": ["portable/GCC/ARM_CM0/"], ":port_ARM_CM3": ["portable/GCC/ARM_CM3/"], ":port_ARM_CM33_NTZ": ["portable/GCC/ARM_CM33_NTZ/non_secure"], ":port_ARM_CM4F": ["portable/GCC/ARM_CM4F/"], ":port_ARM_CM7": ["portable/GCC/ARM_CM7/r0p1/"], ":port_Xtensa": ["portable/ThirdParty/XCC/Xtensa"], "//conditions:default": [], }), ) # Headers transitively included by using "FreeRTOS.h" cc_library( name = "freertos_headers", hdrs = [ "include/FreeRTOS.h", "include/deprecated_definitions.h", "include/list.h", "include/mpu_wrappers.h", "include/portable.h", "include/projdefs.h", "include/stack_macros.h", "include/task.h", "include/timers.h", ], includes = [ "include/", ], visibility = ["//visibility:private"], deps = [ ":freertos_config", ":freertos_port_headers", ], ) # Constraint setting used to determine if task statics should be disabled. constraint_setting( name = "disable_tasks_statics_setting", default_constraint_value = ":no_disable_task_statics", ) constraint_value( name = "disable_task_statics", constraint_setting = ":disable_tasks_statics_setting", ) constraint_value( name = "no_disable_task_statics", constraint_setting = ":disable_tasks_statics_setting", ) cc_library( name = "tasks_c", srcs = ["tasks.c"], local_defines = select({ ":disable_task_statics": [ "static=", ], "//conditions:default": [], }), deps = [":freertos_headers"], ) # Constraint setting for malloc implementation. constraint_setting( name = "malloc", default_constraint_value = ":no_malloc", ) constraint_value( name = "no_malloc", constraint_setting = ":malloc", ) constraint_value( name = "malloc_heap_1", constraint_setting = ":malloc", ) constraint_value( name = "malloc_heap_2", constraint_setting = ":malloc", ) constraint_value( name = "malloc_heap_3", constraint_setting = ":malloc", ) constraint_value( name = "malloc_heap_4", constraint_setting = ":malloc", ) cc_library( name = "freertos_malloc", srcs = select({ ":malloc_heap_1": ["portable/MemMang/heap_1.c"], ":malloc_heap_2": ["portable/MemMang/heap_2.c"], ":malloc_heap_3": ["portable/MemMang/heap_3.c"], ":malloc_heap_4": ["portable/MemMang/heap_4.c"], ":no_malloc": [], }), visibility = ["//visibility:private"], deps = [":freertos_headers"], ) # Exported for # pw_thread_freertos/py/pw_thread_freertos/generate_freertos_tsktcb.py exports_files( ["tasks.c"], )