diff --git a/.github/scripts/image-builder.mk b/.github/scripts/image-builder.mk
new file mode 100644
index 000000000..9e41ae5f0
--- /dev/null
+++ b/.github/scripts/image-builder.mk
@@ -0,0 +1,41 @@
+#
+# Core Flight Software CMake / GNU make wrapper
+#
+# ABOUT THIS MAKEFILE:
+# This defines the configuration targets for the multi-target build
+# It is moved to a separate file to isolate this from the other logic
+#
+# This should reside in the same top-level directory as the main Makefile
+#
+# This file may define extra logic or dependencies for a given target
+
+
+# This converts the staging directory from "make install" into a virtual
+# filesystem that can be mounted in a VM or container
+IMAGE_TYPE ?= ext4
+IMAGE_LABEL ?= cFS
+TARBALL_DIR ?= .
+DEPLOY_DIR ?= .
+
+IMAGE_NAME = cfs-$(CPUNAME)
+TARFS_FILE = $(IMAGE_NAME).tar.xz
+IMAGE_FILE = $(IMAGE_NAME).$(IMAGE_TYPE)
+IMAGE_SIZE = 128M
+
+IMAGE_SET += $(DEPLOY_DIR)/$(CONFIG)-cfs-cpu1.$(IMAGE_TYPE).xz
+IMAGE_SET += $(DEPLOY_DIR)/$(CONFIG)-cfs-cpu2.$(IMAGE_TYPE).xz
+
+# generic rule for creating an ext4 image from the tarball
+$(DEPLOY_DIR)/$(CONFIG)-cfs-%.$(IMAGE_TYPE): $(TARBALL_DIR)/$(CONFIG)-%-bin.tar.xz
+ rm -f "$(@)"
+ /usr/sbin/mke2fs -t "$(IMAGE_TYPE)" -L "$(IMAGE_LABEL)" -d "$(<)" "$(@)" $(IMAGE_SIZE)
+
+$(DEPLOY_DIR)/%.xz: $(DEPLOY_DIR)/%
+ xz -k "$(<)"
+
+.PHONY: all
+
+all: $(IMAGE_SET)
+
+# do not auto-delete the artifacts
+.PRECIOUS: $(DEPLOY_DIR)/%.xz
diff --git a/.gitignore b/.gitignore
index 88eb1da2d..8b9865bda 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,2 @@
-Makefile
-build
-/sample_defs
-.DS_Store
+build*/
+
diff --git a/.gitmodules b/.gitmodules
index 185834fe2..d8e33a295 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,44 +1,75 @@
[submodule "cfe"]
path = cfe
url = https://github.com/nasa/cFE.git
- branch = main
[submodule "osal"]
path = osal
url = https://github.com/nasa/osal.git
- branch = main
[submodule "psp"]
path = psp
url = https://github.com/nasa/PSP.git
- branch = main
[submodule "apps/ci_lab"]
path = apps/ci_lab
url = https://github.com/nasa/ci_lab.git
- branch = main
+[submodule "apps/to_lab"]
+ path = apps/to_lab
+ url = https://github.com/nasa/to_lab.git
+[submodule "apps/sch_lab"]
+ path = apps/sch_lab
+ url = https://github.com/nasa/sch_lab.git
[submodule "apps/sample_app"]
path = apps/sample_app
url = https://github.com/nasa/sample_app.git
- branch = main
-[submodule "apps/sample_lib"]
+[submodule "libs/sample_lib"]
path = libs/sample_lib
url = https://github.com/nasa/sample_lib.git
- branch = main
-[submodule "apps/sch_lab"]
- path = apps/sch_lab
- url = https://github.com/nasa/sch_lab.git
- branch = main
-[submodule "apps/to_lab"]
- path = apps/to_lab
- url = https://github.com/nasa/to_lab.git
- branch = main
[submodule "tools/cFS-GroundSystem"]
path = tools/cFS-GroundSystem
url = https://github.com/nasa/cFS-GroundSystem.git
- branch = main
[submodule "tools/elf2cfetbl"]
path = tools/elf2cfetbl
url = https://github.com/nasa/elf2cfetbl.git
- branch = main
[submodule "tools/tblCRCTool"]
path = tools/tblCRCTool
url = https://github.com/nasa/tblCRCTool.git
- branch = main
+[submodule "tools/eds"]
+ path = tools/eds
+ url = https://github.com/nasa/EdsLib.git
+[submodule "apps/cf"]
+ path = apps/cf
+ url = https://github.com/nasa/CF.git
+[submodule "apps/cs"]
+ path = apps/cs
+ url = https://github.com/nasa/CS.git
+[submodule "apps/ds"]
+ path = apps/ds
+ url = https://github.com/nasa/DS.git
+[submodule "apps/fm"]
+ path = apps/fm
+ url = https://github.com/nasa/FM.git
+[submodule "apps/hk"]
+ path = apps/hk
+ url = https://github.com/nasa/HK.git
+[submodule "apps/hs"]
+ path = apps/hs
+ url = https://github.com/nasa/HS.git
+[submodule "apps/lc"]
+ path = apps/lc
+ url = https://github.com/nasa/LC.git
+[submodule "apps/md"]
+ path = apps/md
+ url = https://github.com/nasa/MD.git
+[submodule "apps/mm"]
+ path = apps/mm
+ url = https://github.com/nasa/MM.git
+[submodule "apps/sbn"]
+ path = apps/sbn
+ url = https://github.com/nasa/SBN.git
+[submodule "apps/sc"]
+ path = apps/sc
+ url = https://github.com/nasa/SC.git
+[submodule "tools/cfs-cosmos-plugin"]
+ path = tools/cfs-cosmos-plugin
+ url = https://github.com/nasa/cfs-cosmos-plugin.git
+[submodule "tools/commandline-tools"]
+ path = tools/commandline-tools
+ url = https://github.com/nasa/cfs-commandline-tools.git
diff --git a/.lgtm.yml b/.lgtm.yml
index bd7118b2e..f793f536a 100644
--- a/.lgtm.yml
+++ b/.lgtm.yml
@@ -17,8 +17,5 @@ extraction:
cpp:
index:
build_command:
- - "cp cfe/cmake/Makefile.sample Makefile"
- - "cp -r cfe/cmake/sample_defs sample_defs"
- - "make OMIT_DEPRECATED=true prep"
- - "make"
+ - "make native_std.install"
diff --git a/EDS_Integration_Guide.md b/EDS_Integration_Guide.md
new file mode 100644
index 000000000..b8d711e4d
--- /dev/null
+++ b/EDS_Integration_Guide.md
@@ -0,0 +1,2292 @@
+# EDS Integration User Guide
+
+## Table of Contents
+- [Introduction](#introduction)
+- [Prerequisites](#prerequisites)
+- [Formatting Notes](#formatting-notes)
+- [Required Directory Structure](#required-directory-structure)
+- [Required Files by Directory](#required-files-by-directory)
+- [Integration Steps](#integration-steps)
+- [EDS XML Configuration](#eds-xml-configuration)
+- [Build Integration](#build-integration)
+- [Updating System Configuration Files](#updating-system-configuration-files)
+- [Testing and Validation](#testing-and-validation)
+- [Troubleshooting](#troubleshooting)
+
+## Introduction
+
+The Electronic Data Sheet (EDS) is a CCSDS (Consultative Committee for Space Data Systems) standard that provides a structured way to define spacecraft command and telemetry interfaces. This guide walks through the integration process for EDS-enabled modules into flight software modules. When referencing the official CCSDS publication ([Spacecraft Onboard Interface Services - XML Specification for Electronic Data Sheets](https://ccsds.org/Pubs/876x0b1.pdf)), please remember that there are modules that have more detail than what is used in this implementation of EDS.
+
+### Purpose
+This guide helps developers integrate EDS packages into flight software modules, ensuring proper configuration and compatibility with the target system. EDS integration standardizes interface definitions and automates the generation of configuration files.
+
+### Benefits of EDS Integration
+- Standardized interface definitions
+- Automated configuration file generation
+- Reduced manual configuration errors
+- Consistent naming conventions across applications and libraries
+- Improved maintainability
+
+## Prerequisites
+
+Before beginning EDS integration, ensure you have:
+- Basic understanding of CCSDS standards
+- Familiarity with C/C++ development
+- Access to the target flight software environment
+- EDS toolchain installed and configured
+- Understanding of your module's interface requirements (command/telemetry for applications, API functions for libraries)
+
+## Formatting Notes
+
+Throughout this user guide naming conventions for the module you're implementing EDS in varies to reflect the intent. Do not leave "Your Module", "ym", or "YM" in the final code. Replace it with whatever your module's name is
+| Name | Usage | Example |
+|-------------|-------------------------------------------------------------------------------------------------------------|---------------|
+| Your Module | The full title-case name of the EDS module, typically used when referring to the EDS module in explanations | Limit Checker |
+| ym | Lower-case abbreviation of the EDS module, typically used in file names | lc |
+| YM | Upper-case abbreaviation of the EDS module, typically used in source code | LC |
+
+Additionally, any comment in the form of `/* === C code in xyz file for module YM === */` or `` are no be ignored. So are any comments on or about the example variables or values. These comments are here just to help get the context of where the examples are expected to be found or stand in as placeholders for your own actual, and no doubt very thorough, comments.
+
+## Required Directory Structure
+
+The following directories must be present in your module root:
+```
+[cFS repository directory] # Clone of the cFS repository and the root of all paths in this user guide
+├── (apps|libs) # Home of all applications or libraries
+ ├── ym/ # Your specific submodule
+ ├── config/ # Configuration files and interface definitions
+ ├── eds/ # Houses the CCSDS Electronic Data Sheet package (.xml files)
+ ├── fsw/ # Source units that comprise the flight software executing on the target
+ │ ├── inc/ # Public/interface headers for the module
+ │ └── src/ # Source files and private headers for the module
+ └── tables/ # Example table definitions for the module (applications only - libraries do not use tables)
+```
+
+### Directory Descriptions
+**- [cFS]/(apps|libs)/ym/config/** - Contains example configuration files for the module
+**- [cFS]/(apps|libs)/ym/eds/** - Houses the CCSDS Electronic Data Sheet package (.xml files)
+**- [cFS]/(apps|libs)/ym/fsw/** - Source units that comprise the flight software executing on the target
+**- [cFS]/(apps|libs)/ym/fsw/inc/** - Public/interface headers for the module
+**- [cFS]/(apps|libs)/ym/fsw/src/** - Source files and private headers for the module
+**- [cFS]/(apps|libs)/ym/tables/** - Example table definitions for the module (optional)
+
+## Required Files by Directory
+
+**Note**: In the following file names, the root directory is also assumed to be `[cFS]/(apps|libs)/ym`
+
+> **Important File Naming Convention**:
+>
+> The configuration files in the `config/` directory are created with a `default_` prefix (e.g., `default_ym_fcncode_values.h`), but the CMake build system automatically removes this prefix during the build process. This means:
+> - **File creation**: You create `default_ym_fcncode_values.h`
+> - **File usage**: In your `#include` statements, reference `ym_fcncode_values.h` (without the `default_` prefix)
+> - **Build process**: CMake handles the mapping between the two
+>
+> This convention allows the build system to select between default configuration files and mission-specific overrides automatically.
+
+### Understanding File Scopes
+
+**Interface Scope Files**: Configuration that affects the public interface (visible to other applications)
+- `xx_interface_cfg.h`
+- `default_xx_msgdefs.h`
+- `default_xx_msgstruct.h`
+
+**Platform Scope Files**: Configuration that may differ per instance/platform but doesn't affect interfaces
+- `xx_internal_cfg.h`
+
+
config/ Directory Files
+
+### Core Configuration Files
+*Required for all applications and libraries:*
+
+- `default_ym_interface_cfg_values.h`
+- `default_ym_internal_cfg_values.h`
+- `default_ym_mission_cfg.h`
+- `default_ym_perfids.h`
+- `default_ym_platform_cfg.h`
+- `eds_ym_interface_cfg_values.h`
+
+### Command and Telemetry Interface Files
+*Required for applications with CMD/TLM interfaces (not applicable to libraries):*
+
+- `default_ym_fcncode_values.h`
+- `default_ym_msg.h`
+- `default_ym_msgdefs.h`
+- `default_ym_msgid_values.h`
+- `default_ym_msgids.h`
+- `default_ym_msgstruct.h`
+- `default_ym_topicid_values.h`
+- `eds_ym_fcncode_values.h`
+- `eds_ym_msgdefs.h`
+- `eds_ym_msgstruct.h`
+- `eds_ym_topicid_values.h`
+
+### Table Interface Files
+*Required for applications that use tables (not applicable to libraries):*
+
+- `default_ym_tbl.h`
+- `default_ym_tbldefs.h`
+- `default_ym_tblstruct.h`
+- `eds_ym_tbldefs.h`
+- `eds_ym_tblstruct.h`
+
+### Additional Files
+*May be needed for specific component requirements (both applications and libraries):*
+
+- `default_ym_extern_typedefs.h`
+- `eds_ym_extern_typedefs.h`
+
+**Important Notes:**
+- Libraries typically do NOT have CMD/TLM interfaces and therefore will not need the message-related files
+- Libraries typically do NOT use tables and therefore will not need the table-related files
+- All applications need the core configuration files
+- Libraries primarily need core configuration files and any custom data types
+
+For explanations for what these files contain and what they do jump to [config header explanations](#step-6-populate-config-header-files-with-module-specific-definitions)
+
+
+
eds/ Directory Files
+
+
+`- ym.xml` – The core EDS definition file containing all interface specifications
+
+
+
fsw/inc/ Directory Files
+
+
+**Files Required for Both Applications and Libraries**
+`- ym_eventids.h` – Event ID definitions
+`- ym_interface_cfg.h` – Public interface definitions
+`- ym_internal_cfg.h` – Internal interface definitions
+
+**Application-Specific Files**
+`- ym_fcncodes.h` – Function code definitions (applications with CMD interface only)
+`- ym_topicids.h` – Topic ID definitions (applications with messaging interface only)
+
+**Library-Specific Files**
+`- ym_lib.h` – Public library API definitions
+
+
+
fsw/src/ Directory Files
+
+
+**Files Required for Both Applications and Libraries**
+`- ym_version.h` – Version information
+`- ym_internal.c` – (Optional) Utility functions
+`- ym_internal.h` – (Optional) Utility function headers
+
+**Application-Specific Files**
+`- ym_app.c` – Main application logic
+`- ym_app.h` – Application header
+`- ym_cmds.c` – Command processing implementation
+`- ym_cmds.h` – Command processing header
+`- ym_dispatch.c` – Message dispatch implementation
+`- ym_dispatch.h` – Message dispatch header
+`- ym_eds_dispatch.c` – EDS-specific dispatch logic
+
+**Library-Specific Files**
+`- ym_lib.c` – Library implementation
+
+
+
tables/ Directory Files
+
+
+Contains table definition files specific to your module requirements.
+
+## Integration Steps
+
+### Step 1: Ensure all [required directories](#required-directory-structure) exist
+
+These are the directories that are needed at a minimum. Create missing directories as needed.
+
+### Step 2: Create the [required source files](#fsw-src-directory-files) within fsw/src/
+
+**For Applications:**
+```bash
+touch ym_app.c
+touch ym_app.h
+touch ym_cmds.c
+touch ym_cmds.h
+touch ym_dispatch.c
+touch ym_dispatch.h
+touch ym_eds_dispatch.c
+touch ym_internal.c
+touch ym_internal.h
+touch ym_version.h
+```
+
+**For Libraries:**
+```bash
+touch ym_internal.c
+touch ym_internal.h
+touch ym_version.h
+```
+
+### Step 2: Create the [required header files](#fsw-inc-directory-files) within fsw/inc/
+
+**For Applications:**
+``` bash
+touch ym_eventids.h
+touch ym_fcncodes.h
+touch ym_interface_cfg.h
+touch ym_internal_cfg.h
+touch ym_topicids.h
+```
+**For Libraries:**
+``` bash
+touch ym_eventids.h
+touch ym_interface_cfg.h
+touch ym_internal_cfg.h
+touch ym_lib.h
+```
+
+### Step 3: Create the [required header files](#config-directory-files) within config/
+
+**For Applications:**
+``` bash
+# Core configuration files (required for all applications)
+touch default_ym_interface_cfg_values.h
+touch default_ym_internal_cfg_values.h
+touch default_ym_mission_cfg.h
+touch default_ym_perfids.h
+touch default_ym_platform_cfg.h
+touch eds_ym_interface_cfg_values.h
+
+# Command/Telemetry interface files (applications with CMD/TLM interface)
+touch default_ym_fcncode_values.h
+touch default_ym_msg.h
+touch default_ym_msgdefs.h
+touch default_ym_msgid_values.h
+touch default_ym_msgids.h
+touch default_ym_msgstruct.h
+touch default_ym_topicid_values.h
+touch eds_ym_fcncode_values.h
+touch eds_ym_msgdefs.h
+touch eds_ym_msgstruct.h
+touch eds_ym_topicid_values.h
+```
+
+** For Libraries:**
+``` bash
+# Core configuration files (required for all libraries)
+touch default_ym_interface_cfg_values.h
+touch default_ym_internal_cfg_values.h
+touch default_ym_mission_cfg.h
+touch default_ym_perfids.h
+touch default_ym_platform_cfg.h
+touch eds_ym_interface_cfg_values.h
+
+# Additional files if needed
+touch default_ym_extern_typedefs.h
+touch eds_ym_extern_typedefs.h
+```
+
+**Optional Files for Applications Using Tables**
+
+``` bash
+touch default_ym_tbl.h
+touch default_ym_tbldefs.h
+touch default_ym_tblstruct.h
+touch eds_ym_extern_typedefs.h
+touch eds_ym_tbldefs.h
+```
+
+### Step 4: Create the skeleton for each of the created files
+
+* License Header
+ * Copy the standard license block from other .h files in the project. This is typically the multi-line comment at the very top of the file that includes copyright, licensing info, and version identifiers
+* Include Guards
+ * Use traditional `#ifndef #define #endif` guards that match the file name in all caps with underscores. This prevents double-inclusion of headers
+ * Example:
+ ``` C
+ #ifndef DEFAULT_YM_FCNCODE_VALUES_H
+ #define DEFAULT_YM_FCNCODE_VALUES_H
+
+ /* header content */
+
+ #endif /* DEFAULT_YM_FCNCODE_VALUES_H */
+ ```
+
+
+### Step 5: Populate fsw/inc/ header files with module-specific definitions
+
+**Note**: All modules should include their doxygen markups for user documentation
+#### `ym_eventids.h` (Applications and Libraries)
+* Defines CFE EVS Event IDs for the module
+* How to find what goes here
+ * Macros the typically end in `_EID`
+* Include brief descriptions and documentation for each event
+
+#### `ym_fcncodes.h` (Applications Only)
+* Contains function codes (also called Command Codes) for the module's CMD interface
+* **Note**: Libraries do not have command interfaces and therefore do not need this file
+* How to find what goes here
+ * Macros that typically end in `_CC`
+ * Example: `#define YM_NOOP_CC 1`
+
+#### `ym_interface_cfg.h` (Applications and Libraries)
+* Defines public interface configuration values used across the module
+ * Command lengths, message sizes, and externally visible parameters
+* This file should only contain macros. Any structs should go in default_ym_extern_typedefs.h
+* Make sure you rename all instances of the macro in use
+
+1. Define macros
+ * Macro naming convention:
+ ``` C
+ /**
+ * Long macro comment that totally
+ * makes the purpose of this macro
+ * much clearer and less confusing
+ */
+ #define YM_INTERFACE_EXAMPLE [value]
+ ```
+2. Add `#include "ym_interface_cfg.h"` into [default_ym\_msgdefs.h](#default_ym_msgdefsh-applications-only) and [default_ym_msgstruct.h](#default_ym_msgstructh-applications-only)
+3. Depending on whether you have tables, add `#include "ym_interface_cfg.h"` to [default_ym\_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only) and [default_ym_tblstruct.h](#default_ym_tblstructh-applications-with-tables-only)
+
+#### `ym_internal_cfg.h` (Applications and Libraries)
+* Software configuration values that do not affect interfaces, and may be different per instance/platform
+ * Includes pipe depth, pipe name, number of tables, platform-specific error codes, valid table value ranges, table file name, SB timeout, memory size specifications
+* This file should only contain macros
+ * Non-macros that seem like they should go here should instead be in [ym_extern_typedefs.h](#default_ym_extern_typedefsh-applications-and-libraries)
+
+1. Define macros
+ * Macro naming convention:
+ ``` C
+ /**
+ * Another long comment for a macro
+ * that is so in-depth and perfectly
+ * worded that you now understand
+ * that value more than the original
+ * developer
+ */
+ #define YM_INTERNAL_EXAMPLE [value]
+ ```
+2. Add `#include "ym_internal_cfg.h"` from any file you stole a macro from
+
+#### `ym_topicids.h` (Applications Only)
+* Defines topic IDs used in the messaging system
+* **Note**: Libraries do not use software bus messaging and therefore do not need this file
+* Make sure you rename all instances of the macro in use
+* There are 3 required topic IDs shown here as an example:
+``` C
+ /* Command topic IDs */
+ #define YM_MISSION_CMD_TOPICID YM_MISSION_TIDVAL(CMD)
+ #define DEFAULT_YM_MISSION_CMD_TOPICID 0xA4
+
+ #define YM_MISSION_SEND_HK_TOPICID YM_MISSION_TIDVAL(SEND_HK)
+ #define DEFAULT_YM_MISSION_SEND_HK_TOPICID 0xA5
+
+ /* Telemetry topic IDs */
+ #define YM_MISSION_HK_TLM_TOPICID YM_MISSION_TIDVAL(HK_TLM)
+ #define DEFAULT_YM_MISSION_HK_TLM_TOPICID 0xA7
+```
+
+* **Topic ID Default Value Calculation:**
+ * Extract the lower 8 bits from the corresponding Message ID in `default_ym_msgids.h`
+ * YM_CMD_MID = 0x18A4 → DEFAULT_YM_MISSION_CMD_TOPICID = 0xA4
+ * YM_SEND_HK_MID = 0x18A5 → DEFAULT_YM_MISSION_SEND_HK_TOPICID = 0xA5
+ * YM_HK_TLM_MID = 0x08A7 → DEFAULT_YM_MISSION_HK_TLM_TOPICID = 0xA7
+
+#### `ym_lib.h` (Libraries Only)
+* Defines the public API for the library
+* **Note**: Applications do not need this file
+* Contains function prototypes, public data structures, and constants needed by library users
+
+### Step 6: Populate config/ Header Files with Module-Specific Definitions
+
+__**Required files:**__
+#### `default_ym_fcncode_values.h` (Applications Only)
+* Defines default function code values used across the interface
+
+1. Create a macro to shorthand values in the function code enumerator
+ ``` C
+ #define YM_CCVAL(x) YM_FunctionCode_##x
+ ```
+2. Create an enumerator that holds the command code value for each command found in [ym_fcncodes.h](#ym_fcncodesh-applications-only)
+ ``` C
+ /* === C code in ym_fcncodes.h for module YM === */
+
+ /**
+ * Wow this comment is so long.
+ * It explains the purpose of
+ * the macro almost too well
+ */
+ #define YM_NOOP_CC (0u)
+
+ /**
+ * This comment isn't as good
+ * as the one above but it at
+ * least makes sense
+ */
+ #define YM_RESET_CC (1u)
+
+ /* Other function codes here */
+ ```
+
+ will become
+
+ ```C
+ /* === C code in default_ym_fcncode_values.h for module YM === */
+
+ enum YM_FunctionCode
+ {
+ YM_FunctionCode_NOOP = 0,
+ YM_FunctionCode_RESET = 1,
+ /* Other function codes here */
+ };
+ ```
+3. Include default_ym_fcncode_values.h in [ym_fcncodes.h](#ym_fcncodesh-applications-only)
+ ``` C
+ /* === C code in ym_fcncodes.h for module YM === */
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_fcncode_values.h"
+ ```
+4. Use the shorthand macro in [ym_fcncodes.h](#ym_fcncodesh-applications-only)
+ ``` C
+ /* === C code in ym_fcncodes.h for module YM === */
+
+ /**
+ * Pretend this is a long comment
+ * Woooooow, so many words. Thanks
+ */
+ #define YM_NOOP_CC YM_CCVAL(NOOP)
+
+ /**
+ * This comment is only pretending
+ * to be long but it's a phony
+ */
+ #define YM_RESET_CC YM_CCVAL(RESET)
+
+ /* Other function codes here */
+ ```
+* The final version of default_ym_fcncode_values.h should look something like this:
+ ``` C
+ #ifndef DEFAULT_YM_FCNCODE_VALUES_H
+ #define DEFAULT_YM_FCNCODE_VALUES_H
+
+ /* ====== */
+ /* Macros */
+ /* ====== */
+
+ #define YM_CCVAL(x) YM_FunctionCode_##x
+
+ /* ======== */
+ /* Typedefs */
+ /* ======== */
+
+ enum YM_FunctionCode
+ {
+ YM_FunctionCode_NOOP = 0,
+ YM_FunctionCode_RESET = 1,
+ /* Other function codes */
+ };
+
+ #endif /* DEFAULT_YM_FCNCODE_VALUES_H */
+ ```
+
+#### `default_ym_interface_cfg_values.h` (Applications and Libraries)
+* Defines interface configuration values that can be instantiated by name
+* Make sure you rename all instances of the macro in use
+ * Don't use the version of the macro with the word "DEFAULT_" in it, just the non-default one
+
+1. Create a macro to resolve interface configuration values by name
+ ``` C
+ #define YM_INTERFACE_CFGVAL(x) DEFAULT_YM_INTERFACE_##x
+ ```
+2. Include ym_interface_cfg_values.h in [ym_interface_cfg.h](#ym_interface_cfgh-applications-and-libraries)
+ ``` C
+ #include "ym_interface_cfg_values.h"
+ ```
+3. Re-define each macro with `YM_INTERFACE_CFGVAL`, adding the default value under the modified macro
+ ``` C
+ /* === C code in ym_interface_cfg.h for module YM === */
+
+ /**
+ * Long macro comment that totally
+ * makes the purpose of this macro
+ * much clearer and less confusing
+ */
+ #define YM_INTERFACE_EXAMPLE YM_INTERFACE_CFGVAL(EXAMPLE)
+ #define DEFAULT_YM_INTERFACE_EXAMPLE [value]
+ ```
+* The final version of default_ym_interface_cfg_values.h should look something like this:
+ ``` C
+ #ifndef DEFAULT_YM_INTERFACE_CFG_VALUES_H
+ #define DEFAULT_YM_INTERFACE_CFG_VALUES_H
+
+ /* ====== */
+ /* Macros */
+ /* ====== */
+
+ #define YM_INTERFACE_CFGVAL(x) DEFAULT_YM_##x
+
+ #endif /* DEFAULT_YM_INTERFACE_CFG_VALUES_H */
+ ```
+
+#### `default_ym_internal_cfg_values.h` (Applications and Libraries)
+* Defines internal configuration values that can be instantiated by name
+* Make sure you rename all instances of the macro in use
+ * Don't use the version of the macro with the word "DEFAULT_" in it, just the non-default one
+
+1. Create a macro to resolve internal config values by name
+ ``` C
+ #define YM_INTERNAL_CFGVAL(x) DEFAULT_YM_INTERNAL_##x
+ ```
+2. Include ym_internal_cfg_values.h in [ym_internal_cfg.h](#ym_internal_cfgh-applications-and-libraries)
+ ``` C
+ #include "ym_internal_cfg_values.h"
+ ```
+3. Re-define each macro with `YM_INTERNAL_CFGVAL`, adding the default value under the modified macro
+ ``` C
+ /* === C code in ym_internal_cfg.h for module YM === */
+
+ /**
+ * I mean, I don't know what to
+ * put here. Just act like this
+ * is pithy and cool
+ */
+ #define YM_INTERNAL_EXAMPLE YM_INTERNAL_CFGVAL(EXAMPLE)
+ #define DEFAULT_YM_INTERNAL_EXAMPLE [value]
+ ```
+* The final version of default_ym_internal_cfg_values.h should like something like this:
+ ``` C
+ #ifndef DEFAULT_YM_INTERNAL_CFG_VALUES_H
+ #define DEFAULT_YM_INTERNAL_CFG_VALUES_H
+
+ /* ====== */
+ /* Macros */
+ /* ====== */
+
+ #define YM_INTERNAL_CFGVAL(x) DEFAULT_YM_INTERNAL_##x
+
+ #endif /* DEFAULT_YM_INTERNAL_CFG_VALUES_H */
+ ```
+
+#### `default_ym_mission_cfg.h` (Applications and Libraries)
+* Combination of the mission scope configuration files. This file is created and populated for backwards compatibility
+
+1. Include the interface configuration file
+ ``` C
+ #include "ym_interface_cfg.h
+ ```
+2. (Optional) Include the global configuration file
+ ``` C
+ #include "ym_global_cfg.h
+ ```
+* The final version of default_ym_mission_cfg.h should look something like this:
+ ``` C
+ #ifndef DEFAULT_YM_MISSION_CFG_H
+ #define DEFAULT_YM_MISSION_CFG_H
+
+ #include "ym_interface_cfg.h"
+ /* Uncomment below if you have a global_cfg.h file */
+ /* #include "ym_global_cfg.h" */
+
+ #endif /* DEFAULT_YM_MISSION_CFG_H */
+ ```
+
+#### `default_ym_msg.h` (Applications Only)
+* Combination of the message interface files and all their dependencies
+
+1. Include the message definitions file
+ ``` C
+ #include "ym_msgdefs.h"
+ ```
+2. Include the message structures file
+ ``` C
+ #include "ym_msgstruct.h"
+ ```
+
+#### `default_ym_msgdefs.h` (Applications Only)
+* Definitions for the command and telemetry message payloads of the module
+* No macros should go in here
+* How to find what goes here
+ * Any struct used directly inside packets
+ * Any struct with "Payload_t" at the end of its name
+* The final version of default_ym_msgdefs.h should look something like:
+ ``` C
+ #ifndef DEFAULT_YM_MSGDEFS_H
+ #define DEFAULT_YM_MSGDEFS_H
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "common_types.h"
+ #include "cfe.h"
+ /* Any other dependencies */
+
+ /* ======== */
+ /* Typedefs */
+ /* ======== */
+
+ /**
+ * \brief Example Command Payload
+ */
+ typedef struct
+ {
+ size_t ExampleSize;
+ uint8 ExampleInt;
+ char ExampleStr[CFE_MISSION_MAX_PATH_LEN];
+ } YM_ExampleCmd_Payload_t;
+
+ /**
+ * \brief Housekeeping Packet Payload Structure
+ */
+ typedef struct
+ {
+ uint8 CmdCounter;
+ uint8 ErrCounter;
+ uint8 ExampleInt;
+ size_t ExampleSize;
+ } YM_HkTlm_Payload_t;
+
+ /* Other payloads */
+
+ #endif /* DEFAULT_YM_MSGDEFS_H */
+ ```
+
+#### `default_ym_msgids.h` (Applications Only)
+* CFE Software Bus Message ID definitions for CMD/TLM interface(s) of the module
+* How to find what goes here
+ * Any value you pass into `CFE_SB_ValueToMsgId`
+ * This function is typically called in conjunction with `CFE_SB_Suscribe` and `CFE_MSG_Init`
+ * Message IDs are used as the value in case statements for the switch-case in your module's `AppPipe` function
+ * Message ID macros typically end with "_MID"
+ * The command, send HK, and telemetry message IDs are required for modules
+* The final version of default_ym_msgids.h should look something like:
+ ``` C
+ #ifndef DEFAULT_YM_MSGIDS_H
+ #define DEFAULT_YM_MSGIDS_H
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "cfe_core_api_base_msgids.h"
+
+ /* ====== */
+ /* Macros */
+ /* ====== */
+
+ #define YM_CMD_MID 0x0 /* Dummy value, yours might be different */
+ #define YM_SEND_HK_MID 0x1 /* Dummy value, yours might be different */
+
+ #define YM_HK_TLM_MID 0x2 /* Dummy value, yours might be different */
+
+ #endif /* DEFAULT_YM_MSGIDS_H */
+ ```
+
+#### `default_ym_msgid_values.h` (Applications Only)
+* Defines message ID values that can be instantiated by name
+* Make sure you rename all instances of the macro in use
+
+1. Include the topic ID definitions
+ ``` C
+ /* === C code in default_ym_msgid_values.h for module YM === */
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_topicids.h"
+ ```
+2. Create a macro to resolve message ID values for commands and telemetry by name
+ ``` C
+ /* === C code in default_ym_msgid_values.h for module YM === */
+
+ #define YM_CMD_PLATFORM_MIDVAL(x) CFE_PLATFORM_CMD_TOPICID_TO_MIDV(YM_MISSION_##x##_TOPICID)
+ #define YM_TLM_PLATFORM_MIDVAL(x) CFE_PLATFORM_TLM_TOPICID_TO_MIDV(YM_MISSION_##x##_TOPICID)
+ ```
+3. Include default_ym_msgid_values.h in [default_ym_msgids.h](#default_ym_msgidsh-applications-only)
+ ``` C
+ /* === C code in default_ym_msgids.h for module YM === */
+
+ #include "ym_msgid_values.h"
+ ```
+4. Define the message IDs with the newly created macro. The 3 required message IDs are used below as examples
+ ``` C
+ /* === C code in default_ym_msgids.h for module YM === */
+
+ #define YM_CMD_MID YM_CMD_PLATFORM_MIDVAL(CMD)
+ #define YM_SEND_HK_MID YM_CMD_PLATFORM_MIDVAL(SEND_HK)
+
+ #define YM_HK_TLM_MID YM_TLM_PLATFORM_MIDVAL(HK_TLM)
+ ```
+
+#### `default_ym_msgstruct.h` (Applications Only)
+* Structures that define the command and telemetry message interfaces of the module. The structs defined in this file combine a payload (from [default_ym_msgdefs.h](#default_ym_msgdefsh-applications-only)) with a header (and possibly a trailer).
+* How to find what goes here
+ * Any struct that has:
+ * A member of data type `CFE_MSG_CommandHeader_t`
+ * A member of data type `CFE_MSG_TelemetryHeader_t`
+ * A name ending with "Cmd_t" or "HkPacket_t"/"HkTlm_t"
+ * The No-Op command, Reset Counters command, Send HK command, and HK packet are required
+* Every command needs its own struct
+* The final version of default_ym_msgstruct.h should look something like:
+ ``` C
+ #ifndef DEFAULT_YM_MSGSTRUCT_H
+ #define DEFAULT_YM_MSGSTRUCT_H
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_msgdefs.h"
+ #include "cfe.h"
+
+ /* ======== */
+ /* Typedefs */
+ /* ======== */
+
+ typedef struct
+ {
+ CFE_MSG_CommandHeader_t CommandHeader;
+ } YM_NoopCmd_t;
+
+ typedef struct
+ {
+ CFE_MSG_CommandHeader_t CommandHeader;
+ } YM_ResetCountersCmd_t;
+
+ typedef struct
+ {
+ CFE_MSG_CommandHeader_t CommandHeader;
+ YM_ExampleCmd_Payload_t Payload;
+ } YM_ExampleCmd_t;
+
+ typedef struct
+ {
+ CFE_MSG_CommandHeader_t CommandHeader;
+ } YM_SendHkCmd_t;
+
+ typedef struct
+ {
+ CFE_MSG_TelemetryHeader_t TelemetryHeader;
+ YM_HkTlm_Payload_t Payload;
+ } YM_HkTlm_t;
+
+ #endif /* DEFAULT_YM_MSGSTRUCT_H */
+ ```
+
+#### `default_ym_perfids.h` (Applications and Libraries)
+* CFE ES performance monitor IDs for the module, with descriptions/documentation
+* **For Applications**: Performance IDs for main processing loop, command processing, telemetry generation
+* **For Libraries**: Performance IDs for major API functions or processing algorithms
+* How to find what goes here:
+ * You most likely have an "_perfids.h" file. Just move that file into config with the proper name
+ * With regex enabled, search for `#define .*PERF_?ID` in your module
+ * Any value passed into the `CFE_ES_PerfLogEntry` or `CFE_ES_PerfLogExit` function is a performance monitor ID
+* The final version of default_ym_perfids.h should look something like:
+ ``` C
+ #ifndef DEFAULT_YM_PERFIDS_H
+ #define DEFAULT_YM_PERFIDS_H
+
+ #define YM_APPMAIN_PERF_ID 30 /* Dummy values, yours can be different */
+ #define YM_EXAMPLE_PERF_ID 31 /* Dummy values, yours can be different */
+
+ #endif /* DEFAULT_MM_PERFIDS_H */
+ ```
+
+#### `default_ym_platform_cfg.h` (Applications and Libraries)
+* Combination of mission_cfg.h, internal_cfg.h and any other dependencies
+
+1. Include the mission configuration file
+ ``` C
+ #include "ym_mission_cfg.h"
+ ```
+2. Include the internal configuration file
+ ``` C
+ #include "ym_internal_cfg.h"
+ ```
+
+#### `default_ym_topicid_values.h` (Applications Only)
+* Defines topic ID values that can be instantiated by name
+
+1. Create a macro to resolve topic ID values by name
+ ``` C
+ /* === C code in default_ym_topicid_values.h for module YM === */
+
+ #define YM_MISSION_TIDVAL(x) DEFAULT_YM_MISSION_##x##_TOPICID
+ ```
+2. Include default_ym_topicid_values.h in [ym_topicids.h](#ym_topicidsh-applications-only)
+ ``` C
+ /* === C code in ym_topicids.h for module YM === */
+
+ #include "ym_topicid_values.h"
+ ```
+3. Define the topic IDs with the newly created macro. The 3 required message IDs are used below as examples
+ ``` C
+ #define YM_CMD_MID YM_CMD_PLATFORM_MIDVAL(CMD)
+ #define YM_SEND_HK_MID YM_CMD_PLATFORM_MIDVAL(SEND_HK)
+
+ #define YM_HK_TLM_MID YM_TLM_PLATFORM_MIDVAL(HK_TLM)
+ ```
+
+#### `eds_ym_fcncode_values.h` (Applications Only)
+* When using EDS, map function codes to their EDS-defined values instead of their default values
+* **Note**: Libraries do not have command interfaces and therefore do not need this file
+
+1. Include EDS command codes
+ ``` C
+ #include "ym_eds_cc.h"
+ ```
+2. Map the command codes to an EDS generate command code
+ ``` C
+ #define YM_CCVAL(x) EDS_CONTAINER_YM_##x##_CC
+ ```
+* The final version of eds_ym_fcncode_values.h should look something like this:
+ ``` C
+ #ifndef EDS_YM_FCNCODE_VALUES_H
+ #define EDS_YM_FCNCODE_VALUES_H
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_eds_cc.h"
+
+ /* ====== */
+ /* Macros */
+ /* ====== */
+
+ #define YM_CCVAL(x) EDS_CONTAINER_YM_##x##_CC
+
+ #endif /* EDS_YM_FCNCODE_VALUES_H */
+ ```
+
+#### `eds_ym_interface_cfg_values.h` (Applications and Libraries)
+* When using EDS, map interface configuration to their EDS-defined values instead of their default values
+* **For Applications**: EDS-generated command/telemetry interface parameters
+* **For Libraries**: EDS-generated API interface parameters
+* The way EDS interface configuration generation is handled means there isn't an "_INTERFACE\_" in the macro definition
+
+1. Include EDS headers
+ ``` C
+ /* === C code in eds_ym_interface_cfg_values.h for module YM === */
+
+ #include "cfe_mission_eds_designparameters.h"
+ #include "ym_eds_defines.h"
+ ```
+2. Create a macro to resolve EDS interface configuration values by name
+ ``` C
+ /* === C code in eds_ym_interface_cfg_values.h for module YM === */
+
+ #define YM_INTERFACE_CFGVAL(x) EdsParam_YM_##x
+ ```
+3. The final version of eds_ym_interface_cfg_values.h should look something like:
+ ``` C
+ #ifndef EDS_YM_INTERFACE_CFG_VALUES_H
+ #define EDS_YM_INTERFACE_CFG_VALUES_H
+
+ #include "cfe_mission_eds_designparameters.h"
+
+ #define YM_INTERFACE_CFGVAL(x) EdsParam_YM_##x
+
+ #endif /* EDS_YM_INTERFACE_CFG_VALUES_H */
+ ```
+
+#### `eds_ym_msgdefs.h` (Applications Only)
+* When using EDS, map the message payloads to their EDS-defined values instead of their default values
+
+1. Include the typedefs created by EDS from the XML file
+ ``` C
+ /* === C code in eds_ym_msgdefs.h for module YM === */
+
+ #include "ym_eds_typedefs.h"
+ ```
+2. Include the function codes for payloads
+ ``` C
+ /* === C code in eds_ym_msgdefs.h for module YM === */
+
+ #include "ym_fcncodes.h"
+ ```
+3. The final version of eds_ym_msgdefs.h should look something like:
+ ``` C
+ #ifndef EDS_YM_MSGDEFS_H
+ #define EDS_YM_MSGDEFS_H
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_eds_typedefs.h"
+ #include "ym_fcncodes.h"
+
+ #endif /* EDS_YM_MSGDEFS_H */
+ ```
+
+#### `eds_ym_msgstruct.h` (Applications Only)
+* When using EDS, map message structs to their EDS-defined values instead of their default values
+
+1. Include the EDS-defined typedefs generated from the XML
+ ``` C
+ /* === C code in eds_ym_msgstruct.h for module YM === */
+
+ #include "ym_eds_typedefs.h"
+ ```
+2. The final version of eds_ym_msgstruct.h should look something like this:
+ ``` C
+ #ifndef EDS_YM_MSGSTRUCT_H
+ #define EDS_YM_MSGSTRUCT_H
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_eds_typedefs.h"
+
+ #endif /* EDS_YM_MSGSTRUCT_H */
+ ```
+
+#### `eds_ym_topicid_values.h` (Applications Only)
+* When using EDS, map function codes to their EDS-defined values instead of their default values by defining topic ID values that can be instantiated by name
+
+1. Include EDS design parameters
+ ``` C
+ /* === C code in eds_tm_topicid_values.h for module YM === */
+
+ #include "cfe_mission_eds_designparameters.h"
+ ```
+2. Define a macro to instantiate EDS topic IDs by name
+ ``` C
+ /* === C code in eds_ym_topicid_values.h for module YM === */
+
+ #define YM_MISSION_TIDVAL(x) EdsParam_CFE_MISSION_YM_##x##_TOPICID
+ ```
+3. The final version of eds_ym_topicid_values.h should look something like this:
+ ``` C
+ #ifndef EDS_YM_TOPICID_VALUES_H
+ #define EDS_YM_TOPICID_VALUES_H
+
+ #include "cfe_mission_eds_designparameters.h"
+
+ #define YM_MISSION_TIDVAL(x) EdsParam_CFE_MISSION_YM_##x##_TOPICID
+
+ #endif /* EDS_YM_TOPICID_VALUES_H */
+ ```
+
+__**Optional files:**__
+#### `default_ym_tbldefs.h` (Applications with Tables Only)
+* Definitions for the table file payload(s) of the module
+* How to find what goes here
+ * Data type of the array that constitutes a table
+* No macros should go in this file, put them in [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only) instead
+
+1. In ym/fsw/tables/*tbl.c, find where the datatype of this instance of the table is declared
+ * In this example, you're interested in YM_ExampleTable_t:
+ ``` C
+ YM_ExampleTable_t ExampleTable = {
+ "MemberString 1",
+ {0, 0, "Entry 1"},
+ {0, 0, "Entry 2"},
+ {0, 0, "Entry 3"},
+ }
+ ```
+2. Find the definition of the table entry member
+ * Could have "Entry_t" in the data type name
+ * Could have "Entry" in or as the name of the variable
+ * Could be an array of size X, where X is a macro with some variant of "TABLE_SIZE"
+ * In this example, you're interested in YM_ExampleEntry_t:
+ ``` C
+ typedef struct
+ {
+ YM_ExampleEntry_t Entry[YM_INTERFACE_EXAMPLE_TABLE_SIZE];
+ } YM_ExampleTable_t;
+ ```
+3. Put _that_ typedef in default_ym_tbldefs.h
+4. Repeat for any other unique tables
+5. Include dependencies
+
+#### `default_ym_tblstruct.h` (Applications with Tables Only)
+* Structures that define the table file interface(s) of the module. The structs defined in this file combine a payload (from [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only)) with a header (and possibly a trailer).
+* How to find what goes here
+ * Datatypes of tables
+ * All table related macros
+
+1. In ym/fsw/tables/*tbl.c, find where the datatype of this instance of the table is declared
+ * In this example, you're interested in YM_ExampleTable_t:
+ ``` C
+ YM_ExampleTable_t ExampleTable = {
+ "MemberString 1",
+ {0, 0, "Entry 1"},
+ {0, 0, "Entry 2"},
+ {0, 0, "Entry 3"},
+ }
+ ```
+2. Put that typedef in default_ym_tblstruct.h
+3. Repeat for any other unique tables
+4. Include dependencies
+
+#### `default_ym_tbl.h` (Applications with Tables Only)
+* Required if default_tm_tbldefs.h and [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only) are used
+
+1. Include table payloads
+ ``` C
+ /* === C code in default_ym_tbl.h for module YM === */
+
+ #include "ym_tbldefs.h"
+ ```
+2. Include table interfaces
+ ``` C
+ /* === C code in default_ym_tbl.h for module YM === */
+
+ #include "ym_tblstruct.h"
+ ```
+
+#### `default_ym_extern_typedefs.h` (Applications and Libraries)
+* Macros and data types shared between command or telemetry messages, data files, and API functions
+* **For Applications**: Custom types used in command/telemetry payloads and table entries
+* **For Libraries**: Custom types used in API functions and shared data structures
+* How to find what goes here
+ * typedef declarations (struct, enums, etc.) used as member of payloads or entries in [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only) and [default_ym_msgdefs.h](#default_ym_msgdefsh-applications-only)
+ * Any structs inside diagnostic packets (typically held in YM_AppData)
+* Example
+ ``` C
+ /* === C code in default_ym_tbldefs.h for module YM === */
+
+ typedef struct
+ {
+ uint16 ExampleInt;
+ YM_ExampleStruct_t ExampleStruct[YM_NUM_EXAMPLE_STRUCTS]; /* This struct should go in default_ym_extern_typedefs.h */
+ } YM_ExampleTableEntry_t;
+ ```
+
+ ``` C
+ /* === C code in default_ym_msgdefs.h for module YM === */
+
+ typedef struct
+ {
+ uint8 ExampleInt;
+ YM_ExampleEnum_t ExampleEnum; /* This enum should go in default_ym_extern_typedefs.h */
+ } YM_ExampleCmd_Payload_t;
+ ```
+
+ ``` C
+ /* === C code in default_ym_extern_typedefs.h for module YM === */
+
+ /* ====== */
+ /* Macros */
+ /* ====== */
+
+ #define YM_NUM_EXAMPLE_STRUCTS (5u)
+
+ /* ======== */
+ /* Typedefs */
+ /* ======== */
+
+ typedef struct
+ {
+ uint8 Example1;
+ uint16 Example2;
+ } YM_ExampleStruct_t;
+
+ typedef enum
+ {
+ YM_TYPE1 = 0,
+ YM_TYPE2 = 1,
+ YM_TYPE3 = 2,
+ } YM_ExampleEnum_t;
+ ```
+
+#### `eds_ym_tbldefs.h` (Applications with Tables Only)
+* When using EDS, map table payload definitions to their EDS-defined values instead of their default values
+
+* Include the typedefs created by EDS from the XML file
+ ``` C
+ /* === C code in eds_ym_tbldefs.h for module YM === */
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_eds_typedefs.h"
+ ```
+
+#### `eds_ym_extern_typedefs.h` (Applications and Libraries - As Needed)
+* When using EDS, map macros and data types shared between command or telemetry messages, data files, and API functions to their EDS-defined values instead of their default values
+* **For Applications**: EDS-generated versions of custom command/telemetry types
+* **For Libraries**: EDS-generated versions of custom API types
+
+1. Include common header files
+ ``` C
+ /* === C code in eds_ym_extern_typdefs.h for module YM === */
+
+ #include "common_types.h"
+ #include "cfe_resourceid_typedefs.h"
+ ```
+2. Include the typedefs created by EDS from the XML file
+ ``` C
+ /* === C code in eds_ym_extern_typdefs.h for module YM === */
+
+ #include "ym_eds_typedefs.h"
+ ```
+
+### Step 7: Populate Dispatch Files
+
+* Non-EDS dispatch files
+ 1. Add the license header to ym_dispatch.h and ym_dispatch.c. See [Step 4](#step-4-create-the-skeleton-for-each-of-the-created-files)
+ 2. Add include guards to ym_dispatch.h. See [Step 4](#step-4-create-the-skeleton-for-each-of-the-created-files)
+ 3. Move the command length verification function prototype and definition to ym_dispatch.h and ym_dispatch.c respectively
+ * How to find:
+ * Search for "VerifyCmdLength"
+ * Search for "CFE_MSG_GetSize"
+ * Look in fsw/src/ym_app.h
+ * Look in fsw/src/ym_cmds.h
+ * Sometimes this function is put into a file named something like ym*_utils.c/h
+ 4. Move the ground command processing function prototype and definition to ym_dispatch.h and ym_dispatch.c respectively
+ * How to find:
+ * Search for "AppPipe"
+ * Search for "ProcessGroundCommand"
+ * Search for usages of the message IDs in [default_ym_msgids.h](#default_ym_msgidsh-applications-only)
+ * Search for "switch (CFE_SB_MsgIdToValue"
+ 5. Move the task pipe function prototype and definition to ym_dispatch.h and ym_dispatch.c respectively
+ * How to find:
+ * Sometimes it's part of the ground processing function and hasn't been prototyped yet
+ * If this is the case the prototype should be `void YM_TaskPipe(const CFE_SB_Buffer_t* BufPtr);`. Make sure you add documentation
+ * Search for "TaskPipe"
+ * Search for the Send HK message ID from [default_ym_msgids.h](#default_ym_msgidsh-applications-only)
+ * The final version of ym_dispatch.h should look something like the following code snippet. Pay special attention to the prototype function names and the const arguments
+ ``` C
+ /* === C code in ym_dispatch.h for module YM === */
+
+ #ifndef YM_DISPATCH_H
+ #define YM_DISPATCH_H
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "cfe.h"
+
+ /* =================== */
+ /* Function Prototypes */
+ /* =================== */
+
+ /**
+ * \brief This routine will check if the actual length of a software bus
+ * command message matches the expected length
+ * \param[in] MsgPtr Pointer to the command to be verified
+ * \param[in] ExpectedLength The expected length of the message
+ * based upon the command code
+ * \return Command length validity
+ * \retval true: The length of the provided message and the expected
+ * length match
+ * \retval false: The length of the provided message differs from the
+ * expected length
+ */
+ bool YM_VerifyCmdLength(const CFE_MSG_Message_t* MsgPtr, size_t ExpectedLength);
+
+ /**
+ * \brief Using the command IDs this function calls the appropriate
+ * routine to handle the command
+ * \param[in] BufPtr Pointer to Software Bus buffer
+ */
+ void YM_ProcessGroundCommd(const CFE_SB_Buffer_t* BufPtr);
+
+ /**
+ * \brief Route a message/packet to the command processing function or to
+ * the housekeeping request function
+ * \param[in] BufPtr SB buffer pointer to be routed
+ */
+ void YM_TaskPipe(const CFE_SB_Buffer_t* BufPtr);
+
+ #endif /* YM_DISPATCH_H */
+ ```
+
+ * The final version of ym_dispatch.c should look something like:
+ ``` C
+ /* === C code in ym_dispatch.c for module YM === */
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_dispatch.h"
+ #include "ym_app.h"
+ #include "ym_cmds.h"
+ #include "ym_eventids.h"
+ #include "ym_msg.h"
+ #include "ym_msgids"
+ #include "ym_fcncodes.h"
+
+ #include "cfe.h"
+
+ /* ==================== */
+ /* Function Definitions */
+ /* ==================== */
+
+ bool YM_VerifyCmdLength(const CFE_MSG_Message_t* MsgPtr, size_t ExpectedLength)
+ {
+ /* Code here */
+ }
+
+ void YM_ProcessGroundCommd(const CFE_SB_Buffer_t* BufPtr)
+ {
+ /* Code here */
+ }
+
+ void YM_TaskPipe(const CFE_SB_Buffer_t* BufPtr)
+ {
+ /* Code here */
+ }
+ ```
+
+* EDS dispatch file
+1. Add the license header to ym_eds_dispatch.c. See [Step 4](#step-4-create-the-skeleton-for-each-of-the-created-files)
+2. Include likely dependencies. While these dependencies might be enough for you, you might end up needed to add others
+ ``` C
+ /* === C code in ym_eds_dispatch.c for module YM === */
+
+ /* ======== */
+ /* Includes */
+ /* ======== */
+
+ #include "ym_app.h"
+ #include "ym_dispatch.h"
+ #include "ym_cmds.h"
+ #include "ym_eventids.h"
+ #include "ym_msgids.h"
+ #include "ym_msg.h"
+
+ #include "ym_eds_dispatcher.h"
+ #include "ym_eds_dictionary.h"
+ ```
+3. Create a lookup table for MM command codes by referencing ym_cmds.h
+ ``` C
+ /* === C code in ym_cmds.h for module YM === */
+
+ CFE_Status_t YM_NoopCmd(const CFE_SB_Buffer_t* BufPtr);
+ CFE_Status_t YM_ResetCountersCmd(const CFE_SB_Buffer_t* BufPtr);
+ CFE_Status_t YM_SendHkCmd(const CFE_SB_Buffer_t* BufPtr);
+ ```
+
+ ``` C
+ /* === C code in ym_eds_dispatch.c for module YM === */
+
+ /* ======= */
+ /* Globals */
+ /* ======= */
+
+ /**
+ * \brief Lookup table for YM command codes
+ */
+ /* clang-format off */
+ static const EdsDispatchTable_EdsComponent_YM_Application_CFE_SB_Telecommand_t YM_TC_DISPATCH_TABLE =
+ {
+ .CMD =
+ {
+ .NoopCmd_indication = YM_NoopCmd,
+ .ResetCountersCmd_indication = YM_ResetCountersCmd,
+ },
+ .SEND_HK =
+ {
+ .indication = YM_SendHkCmd
+ }
+ };
+ /* clang-format on */
+ ```
+4. Create the EDS version of the task pipe function, this can be copy-pasted
+ ``` C
+ /* === C code in ym_eds_dispatch.c === */
+
+ /* ==================== */
+ /* Function Definitions */
+ /* ==================== */
+
+ void YM_TaskPipe(const CFE_SB_Buffer_t* BufPtr)
+ {
+ CFE_Status_t Status;
+ CFE_SB_MsgId_t MsgId;
+ CFE_MSG_Size_t MsgSize;
+ CFE_MSG_FcnCode_t MsgFc;
+
+ Status = EdsDispatch_EdsComponent_YM_Application_Telecommand(BufPtr, &YM_TC_DISPATCH_TABLE);
+
+ if (Status != CFE_SUCCESS)
+ {
+ CFE_MSG_GetMsgId(&BufPtr->Msg, &MsgId);
+ CFE_MSG_GetSize(&BufPtr->Msg, &MsgSize);
+ CFE_MSG_GetFcnCode(&BufPtr->Msg, &MsgFc);
+ ++YM_AppData.HkTlm.Payload.ErrCounter;
+
+ if (Status == CFE_STATUS_UNKNOWN_MSG_ID)
+ {
+ CFE_EVS_SendEvent(YM_MID_ERR_EID, CFE_EVS_EventType_ERROR,
+ "YM: invalid command packet,MID = 0x%x", (unsigned int)CFE_SB_MsgIdToValue(MsgId));
+ }
+ else if (Status == CFE_STATUS_WRONG_MSG_LENGTH)
+ {
+ CFE_EVS_SendEvent(YM_CMD_LEN_ERR_EID, CFE_EVS_EventType_ERROR,
+ "YM: Invalid Msg length: ID = 0x%X, CC = %u, Len = %u",
+ (unsigned int)CFE_SB_MsgIdToValue(MsgId), (unsigned int)MsgFc, (unsigned int)MsgSize);
+ }
+ else
+ {
+ CFE_EVS_SendEvent(YM_CC_ERR_EID, CFE_EVS_EventType_ERROR,
+ "YM: Invalid ground command code: CC = %d", (int)MsgFc);
+ }
+ }
+ }
+ ```
+
+### Step 8: Standardize Files
+*When integrating EDS into your module, the following code modifications are typically required to ensure compatibility:*
+
+**Unit Test Updates**
+Existing unit tests may require updates to accommodate the new EDS-based interface definitions and message structures.
+
+**Macro Standardization**
+Replace OS-specific macros with CFE/mission-standard macros to ensure consistency across the flight software framework.
+
+**Command Structure Requirements**
+Each command must be defined with its own dedicated structure to properly interface with the EDS message definitions.
+
+**Enumeration Naming Convention**
+All enumeration types must end with `Enum_t` suffix to match the naming convention used by the EDS code generator.
+
+**Telemetry Header Naming Convention**
+Telemetry packet structures must use `TelemetryHeader` as the name for the telemetry header member to align with EDS-generated code expectations.
+
+**Message Pointer Usage**
+When accessing message pointer (`CFE_MSG_Message_t*`), expecially telemetry packet message pointers, use the `CFE_MSG_PTR()` macro in conjunction with the `TelemetryHeader` member of the packet structure to ensure proper type casting and memory access.
+
+Example:
+
+Given the following definitions
+``` C
+/* === C code in ym_msgstructs.h === */
+
+typedef struct
+{
+ CFE_MSG_TelemetryHeader_t TelemetryHeader; /** \brief Telemetry Header */
+ YM_HkTlm_Payload_t Payload; /** \brief Telemetry Payload */
+} YM_HkTlm_t;
+```
+
+and
+
+``` C
+/* === C code in ym_app.h === */
+
+typedef struct
+{
+ /* Other stuff */
+ YM_HkTlm_t HkTlm;
+ /* Other stuff */
+} YM_AppData_t;
+```
+
+this:
+``` C
+/* === C code in ym_cmds.c === */
+
+CFE_SB_TimeStampMsg((CFE_MSG_Message_t*) &(YM_AppData.HkTlm));
+CFE_SB_TransmitMsg((CFE_MSG_Message_t*) &(YM_AppData.HkTlm), true);
+```
+
+will become:
+``` C
+/* === C code in ym_cmds.c === */
+
+CFE_SB_TimeStampMsg(CFE_MSG_PTR(YM_AppData.HkTlm.TelemetryHeader));
+CFE_SB_TransmitMsg(CFE_MSG_PTR(YM_AppData.HkTlm.TelemetryHeader), true);
+```
+
+**Command Organization**
+* All command processing functions must be implemented in `ym_cmds.c` and declared in `ym_cmds.h` to maintain clear separation of concerns between message dispatching and command execution.
+* All command function names are expected to mirror the names of the command structs. For example:
+ ``` C
+ /* === C code in default_ym_msgstruct.h for module YM === */
+
+ typedef struct
+ {
+ CFE_MSG_CommandHeader_t CommandHeader;
+ YM_ExampleCmd_Payload_t Payload;
+ } YM_ExampleCmd_t;
+ ```
+
+ The important part of the struct name is ExampleCmd. That should mean that your example command function should have this signature:
+
+ ``` C
+ /* === C code in ym_cmds.h for module YM === */
+
+ CFE_Status_t YM_ExampleCmd(const YM_ExampleCmd_t* Msg);
+ ```
+* All command processing functions should return a CFE_Status_t-type status
+ * So long as there is nothing else to do, the command processing function should return CFE_SUCCESS, even if the command processing function rejected the message
+ * A non-CFE_SUCCESS response is only if the calling function is expecting to do something atypical, such as increment the error counter.
+ * The nominal case for application dispatchers (like ym_dispatch.c) is to ignore the return code
+
+
+These standardizations ensure seamless integration between manually written code and EDS-generated interface definitions.
+
+
+## EDS XML Configuration
+**Important**: The following EDS XML configuration instructions apply primarily to **applications** that have command/telemetry interfaces. **Libraries** typically have much simpler EDS definitions that focus on:
+- Custom data types used in API functions
+- Public interface parameters
+- Shared data structures
+
+Libraries generally do **not** need:
+- Command containers
+- Telemetry containers
+- Topic ID mappings
+
+For libraries, focus on the DataTypeSet section and skip most of the ComponentSet requirements.
+
+**Reference Files for EDS XML**: When creating your EDS XML definitions, you can reference existing types and assets from:
+- `base_types.xml` - Contains fundamental data types (uint8, uint16, strings, etc.)
+- `config.xml` - Contains mission-specific configuration parameters and constants
+- See [Update EDS Configuration Files](#3-update-eds-configuration-files) for details on config.xml setup
+
+* All members of the XML should be found in the config directory. If you wander outside those files, you're probably doing it wrong
+* Start by creating the general XML Headers `` and ``
+ * Verbatim,
+ ``` XML
+
+
+
+
+
+
+ ```
+* A `` should have 2 sub-elements, `` and ``
+ * ``` XML
+
+
+
+
+
+
+
+
+
+ ```
+ * The `` contains the internal definitions of the module
+ * Custom Data Types
+ * Strings
+ * How to find `StringDataType`s
+ * Using regex, search the module for `^\s*(const|static)?\s*char[*]?.*[[]?.*$`
+ * This will match all character arrays/pointers
+ * Exclude unit tests
+ * Exclude source files (.c files)
+ * Any remaining strings that aren't `CFE_MISSION_*`-sized are strings you'll need to create
+ * Be careful to not create strings that already exist in `base_types.xml` or `config.xml` (see [Update EDS Configuration Files](#3-update-eds-configuration-files))
+ * ``` XML
+
+ ```
+ * | Value | Description |
+ | ------------ | ----------- |
+ | [StringName] | Name of the variable from the source code |
+ | [Length] | Value of the macro from the source code, also defined in [base_types.xml](#3-update-eds-configuration-files) or [config.xml](#3-update-eds-configuration-files) |
+ * Example
+ ``` C
+ /* === C code for module YM === */
+ char YM_Example1[YM_STR_LEN];
+ char* YM_Example2;
+ ```
+
+ becomes
+
+ ``` XML
+
+
+
+ ```
+ * Enums
+ * How to find `EnumeratedDataType`s
+ * Search your module for "typedef enum"
+ * Search your module for "_Enum_t"
+ * ``` XML
+
+
+
+
+
+ [EnumerationDesc]
+
+
+
+
+
+ ```
+ * | Value | Description |
+ | ------------------ | ----------- |
+ | [EnumDataTypeName] | The name of the enum from the source code |
+ | [EnumDataTypeDesc] | Comment from the source code describing the purpose of the enum |
+ | [EnumerationLabel] | Name of an enum member from the source code |
+ | [EnumerationVal] | Value of [EnumerationLabel] |
+ | [EnumerationDesc] | Comment from the source code describing the purpose of the enum |
+ | [EnumerationBits] | The number of bits (in multiples of 8) that covers the largest enumeration value |
+ | [EnumerationSign] | Almost always `unsigned`, but could be `signed` if appropriate |
+ * Example
+ ``` C
+ /* === C code for module YM === */
+ /** \brief Example Enum */
+ typedef enum
+ {
+ YM_A = 1, /** \brief Value of A for YM */
+ /*
+ * Some complicated multi-line
+ * explanation of the purpose of
+ * the value of YM_B
+ */
+ YM_B = 2,
+ YM_C = 3, /* Value of C for YM */
+ YM_D,
+ } YM_ExampleEnum_t;
+ ```
+
+ becomes
+
+ ``` XML
+
+
+
+
+
+
+ Some complicated multi-line
+ explanation of the purpose of
+ the value of YM_B
+
+
+
+
+
+
+
+ ```
+ * Non-character Arrays
+ * ``` XML
+
+
+
+
+
+ ```
+ * | Value | Description |
+ | ---------------- | ----------- |
+ | [ArrayName] | Variable name of the array from the source code |
+ | [ArrayDataType] | The name of a previously defined container or common type |
+ | [ArrayDesc] | Comment from the source code describing the purpose of the array |
+ | [ArrayDimension] | Size of the array from the source code and defined in `config.xml` (see [Update EDS Configuration Files](#3-update-eds-configuration-files)) |
+ * Example
+ ``` C
+ /* === C code for module YM === */
+ uint8 YM_ExampleArray[YM_MAX_ARRAY_SIZE]; /* Just an example */
+ ```
+
+ becomes
+
+ ``` XML
+
+
+
+
+
+
+ ```
+ * Structs
+ * Most instances of `typedef struct` declared in config/
+ * Excludes structs in:
+ * [default_ym_msgdefs.h](#default_ym_msgdefsh-applications-only)
+ * [default_ym_msgstruct.h](#default_ym_msgstructh-applications-only)
+ * [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only)
+ * [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only)
+
+ * Payloads
+ * Defined in [default_ym_msgdefs.h](#default_ym_msgdefsh-applications-only)
+ * ``` C
+ /* === C code in default_ym_msgdefs.h for module YM === */
+ typedef struct
+ {
+ uint32 ValU32; /* 32 bit unsigned integer value */
+ int16 ValI16; /* 16 bit signed integer value */
+ } YM_Example_Payload_t;
+ ```
+
+ becomes
+
+ ``` XML
+
+
+
+
+
+
+
+ ```
+ * Basic command container
+ * The base data type for all command containers
+ * In the source code this is sometimes called `YM_NoArgsCmd_t`
+ * ``` XML
+
+
+ ```
+ * No-Op Command container
+ * ``` XML
+
+
+ ```
+ * Reset Counters Command container
+ * ``` XML
+
+
+ ```
+ * Send Housekeeping Command container
+ * ``` XML
+
+
+ ```
+ * Housekeeping telemetry container
+ * ``` C
+ /* === C code in default_ym_msgdefs.h for module YM === */
+
+ /**
+ * \brief Housekeeping Packet Payload Structure
+ */
+ typedef struct
+ {
+ uint8 CommandCounter; /** \brief Command Counter */
+ uint8 CommandErrorCounter; /** \brief Command Error Counter */
+ /* [others] */
+ } YM_HkTlm_Payload_t;
+ ```
+
+ ``` XML
+
+
+
+
+
+
+
+
+
+ ...
+
+
+
+
+
+
+ ```
+ * The HkTlm_Payload container should be defined before using it in the HkTlm container
+ * Commands
+ * The structs to be added to the EDS XML file are found in [default_ym_msgdefs.h](#default_ym_msgdefsh-applications-only)
+ * The function code values are found in [default_ym_fcncode_values.h](#default_ym_fcncode_valuesh-applications-only)
+ * ``` C
+ /* === C code in default_ym_msgdefs.h for module YM === */
+
+ /**
+ * \brief Example command
+ */
+ typedef struct
+ {
+ uint32 CommandParam; /** \brief Example command parameter */
+ } YM_ExampleCmd_Payload_t;
+ ```
+
+ ``` C
+ /* === C code in default_ym_fcncode_values.h for module YM === */
+ enum YM_FunctionCode
+ {
+ YM_FunctionCode_EXAMPLE = 0,
+ ...
+ }
+ ```
+
+ ``` XML
+
+
+
+
+
+
+
+ ...
+
+
+
+
+
+
+
+
+
+
+ ```
+ * Table container
+ * ``` C
+ /* === C code in default_ym_tbldefs.h for module YM === */
+
+ #define YM_NUM_MEMBERS (42u)
+
+ ...
+
+ /*
+ ** Example Table structure
+ */
+ typedef struct
+ {
+ uint16 Int1;
+ uint16 Int2;
+ } YM_ExampleTableMember_t;
+ ```
+
+ ``` C
+ /* === C code in default_ym_tblstruct.h for module YM === */
+
+ typedef struct
+ {
+ YM_ExampleTableMember_t Members[YM_NUM_MEMBERS];
+ } YM_ExampleTable_t;
+ ```
+
+ ``` XML
+
+
+
+
+
+
+
+
+ ...
+
+
+
+
+
+
+
+ ...
+
+
+
+
+
+
+ ```
+ * [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only)'s `YM_ExampleTableMember_t` is turned in ym.xml's `ExampleTableMember`
+
+ ym.xlm's `ExampleTableMember` is used as the `dataTypeRef` in ym.xml's `ArrayDataType`, `Members`
+
+ ym.xml's `Members` was then used as the `type` in the `ContainerDataType` that defines the table `ExampleTable`
+
+ ym.xml's `ExampleTable` thus, is a converted version of [default_ym_tbldefs.h](#default_ym_tbldefsh-applications-with-tables-only)'s `YM_ExampleTable_t`
+
+ * ``
+ * Required block that contains the interface definitions for the module
+ * ``` XML
+
+
+
+
+
+ ```
+ * ``
+ * Required block that outlines the interfaces of the module
+ * ``` XML
+
+
+
+
+
+
+
+
+ ```
+ * ``
+ * Required block that contains all the assets used by other modules or software
+ * ``` XML
+
+
+
+
+
+
+
+
+
+
+ ```
+ * ``
+ * Required block that defines a specific interface. Interfaces are tables, a generic command interface, a Send HK command interface, HK telemetry interface, and any additional diagnostic packets (these are typically packets issed by command)
+ * Each table file that the app uses is its own interface. However many tables the app uses, there should be that many interfaces
+ * Example: HS has the 3 typical interfaces (CMD, HK_TLM, and SEND_HK), a wake up interface, plus 4 different tables. Therefore, there should be 8 total interfaces, 4 for CFE_SB and 4 for CFE_TBL
+ * ``` XML
+
+
+
+
+
+ ```
+ * | Value | Description |
+ | ---------------------- | ----------- |
+ | [InterfaceName] | A common sense name for the interface. Tables should have the table's variable name as defined in the source code (typically found in ym_tbl.c). Diagnostic packets should have the variable name of the packet as defined in the source code (typically found in `YM_AppData`) |
+ | [InterfaceDescription] | A quick description of what the interface is for |
+ | [InterfaceType] | `CFE_TBL/Table` for tables, `CFE_SB/Telemetry` for telemetry packets, or `CFE_SB/Telecommand` for commands |
+ | [GenericTypeMapName] | Can be whatever you want. If you don't feel like thinking all that much use `TableDataType` for tables, `TelemetryDataType` for packets, and `TelecommandDataType` for commands |
+ | [GenericTypeMapType] | Must be a type defined by a ContainerDataType block in the DataTypeSet block |
+ * Example:
+ ``` C
+ /* === C code in default_ym_tbldefs.h for module YM === */
+
+ /*
+ ** Example Table structure
+ */
+ typedef struct
+ {
+ uint16 Int1;
+ uint16 Int2;
+ } YM_ExampleTable_t;
+ ```
+
+ ``` C
+ /* === C code in ym_tbl.c for module YM === */
+
+ /** \brief Just an example table that holds
+ * two dummy values
+ */
+ YM_ExampleTable_t ExampleTable = {1, 2};
+ ```
+
+ ``` XML
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+ * There are 3 required ``s
+ * The generic command interface
+ * ``` XML
+
+
+
+
+
+ ```
+ * The Send Housekeeping Telemetry command interface
+ * ``` XML
+
+
+
+
+
+ ```
+ * The Housekeeping Telemetry interface
+ * ``` XML
+
+
+
+
+
+ ```
+ * ``
+ * Assigns topic IDs to interfaces
+ * ``` XML
+
+
+
+
+
+
+
+
+
+ ```
+ * ``
+ * Defines the topic IDs found in [ym_topicids.h](#ym_topicidsh) for module YM
+ * ``` XML
+
+
+
+
+
+ ```
+ * ``
+ * For applications, 3 `` containers are needed: `CMD`, `SEND_HK`, `HK_TLM`. See the example for those containers
+ * ``` XML
+
+ ```
+ * | Value | Description |
+ | ---------------------- | ----------- |
+ | [VariableType] | Typically BASE_TYPES/uint16 |
+ | [VariableName] | Take the topic ID from [ym_topicids.h](#ym_topicidsh-applications-only), remove the module name, remove "MISSION", covert to title case |
+ | [VariableInitialValue] | Topic IDs defined in `cfe-topicids.xml` (see [Update EDS Configuration Files](#update-eds-configuration-files)) which get its values from [ym_topicids.h](#ym_topicidsh-applications-only) |
+ * Example:
+ ``` C
+ /* === C code in ym_topicids.h for module YM === */
+
+ /* Command topic IDs */
+ #define YM_MISSION_CMD_TOPICID YM_MISSION_TIDVAL(CMD)
+ #define DEFAULT_YM_MISSIONE_CMD_TOPICID 0x42
+
+ #define YM_MISSION_SEND_HK_TOPICID YM_MISSION_TIDVAL(SEND_HK)
+ #define DEFAULT_YM_MISSION_SEND_HK_TOPICID 0x43
+
+ /* Other command topic ID definitions here! */
+
+ /* Telemetry topic IDs */
+ #define YM_MISSION_HK_TLM_TOPICID YM_MISSION_TIDVAL(HK_TLM)
+ #define DEFAULT_YM_MISSION_HK_TLM_TOPICID 0x44
+
+ /* Other telemetry topic IDs definitions here! */
+ ```
+
+ ``` XML
+
+
+
+
+
+
+
+
+ ```
+ * ``
+ * Assigns values from Variable blocks to the interfaces
+ * ``` XML
+
+
+
+
+
+ ```
+ * | Value | Description |
+ | ------------------------- | ----------- |
+ | [ParameterMapInterface] | The `name` field for an `` block in the `` block |
+ | [ParameterMapVariableRef] | The `name` field for a `` block in the `` block |
+ * Example:
+ ``` XML
+
+
+
+
+
+ ```
+
+## Build Integration
+
+### 1. Configure EDS-Specific Build Options within `CMakeLists.txt` (Applications Only)
+To conditionally include different source files based on whether EDS is enabled, add the following code to your `CMakeLists.txt` file:
+
+Check if EDS is enabled and include the appropriate dispatch file
+
+``` cmake
+# ==== Context, don't add ====
+set(APP_SRC_FILES
+ # App source files
+ )
+# ==== Context, dont' add ====
+
+if (CFE_EDS_ENABLED)
+ list(APPEND APP_SRC_FILES
+ fsw/src/ym_eds_dispatch.c
+ )
+else()
+ list(APPEND APP_SRC_FILES
+ fsw/src/ym_dispatch.c
+ )
+endif()
+
+# ==== Context, don't add ====
+add_cfe_app(ym ${APP_SRC_FILES})
+# ==== Context, dont' add ====
+```
+
+### 2. Creating `arch_build.cmake` for Platform-Specific Setup (Applications and Libraries)
+
+As part of the build integration, create an `arch_build.cmake` file to handle platform-specific build setup. This file is evaluated during the "prepare" stage and sets up prerequisites for the build, such as generating header files.
+
+Create the file in your module directory with content like this:
+
+``` cmake
+###########################################################
+#
+# YM platform build setup
+#
+# This file is evaluated as part of the "prepare" stage
+# and can be used to set up prerequisites for the build,
+# such as generating header files
+#
+###########################################################
+
+# The list of header files that control the CI configuration
+set(YM_PLATFORM_CONFIG_FILE_LIST
+ ym_internal_cfg_values.h
+ ym_platform_cfg.h
+ ym_msgids.h
+ ym_msgid_values.h
+)
+
+generate_configfile_set(${YM_PLATFORM_CONFIG_FILE_LIST})
+```
+
+### 3. Verify `mission_build.cmake` Configuration (Applications and Libraries)
+
+Ensure that your `mission_build.cmake` file contains the appropriate mission-level configuration files:
+
+``` cmake
+###########################################################
+#
+# YM mission build setup
+#
+# This file is evaluated as part of the "prepare" stage
+# and can be used to set up prerequisites for the build,
+# such as generating header files
+#
+###########################################################
+
+# Add stand alone documentation
+add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/docs/dox_src ${MISSION_BINARY_DIR}/docs/ym-usersguide)
+
+# The list of header files that control the YM configuration
+set(YM_MISSION_CONFIG_FILE_LIST
+ ym_fcncode_values.h
+ ym_interface_cfg_values.h
+ ym_mission_cfg.h
+ ym_msgdefs.h
+ ym_msg.h
+ ym_msgstruct.h
+ ym_perfids.h
+ ym_topicid_values.h
+)
+
+generate_configfile_set(${YM_MISSION_CONFIG_FILE_LIST})
+```
+## Updating System Configuration Files
+Several system configuration files must be updated to properly integrate your EDS-enabled module:
+
+### 1. Update sample_defs/targets.cmake
+Add your module to the list of modules being built for your target.
+```
+SET(cpu1_APPLIST ci_lab to_lab sch_lab ym)
+```
+
+### 2. Update cfe/cmake/sample_defs/cpu1_cfe_es_startup.scr
+Add an entry to load your module during system startup
+``` C
+CFE_APP, ym, YM_AppMain, YM, 50, 16384, 0x0, 0;
+```
+
+### 3. Update EDS Configuration Files
+- `sample_defs/eds/config.xml`
+
+ Defines module specific configuration parameters. These are the macros you defined in [ym_interface_cfg.h](#ym_interface_cfgh-applications-and-libraries)
+
+ Example:
+ ``` C
+ /* === C code in ym_interface_cfg.h for module YM === */
+ #define YM_[ConfigName] [ConfigValue]
+ ```
+
+ is defined as,
+
+ ``` XML
+
+
+
+
+
+ ```
+
+- `sample_defs/eds/cfe-topicids.xml`
+
+ Register both your module's command and telemetry topics in the CFE topic ID registry. These are the macros defined in [ym_topicids.h](#ym_topicidsh-applications-only)
+
+ Example:
+ ``` C
+ /* === C code in ym_topicids.h for module YM === */
+
+ #define YM_MISSION_CMD_TOPICID YM_MISSION_TIDVAL(CMD)
+ #define DEFAULT_YM_MISSION_CMD_TOPICID 0x456
+
+ #define YM_MISSION_SEND_HK_TOPICID YM_MISSION_TIDVAL(SEND_HK)
+ #define DEFAULT_YM_MISSION_SEND_HK_TOPICID 0x789
+
+ #define YM_MISSION_HK_TLM_TOPICID YM_MISSION_TIDVAL(HK_TLM)
+ #define DEFAULT_YM_MISSION_HK_TLM_TOPICID 0xABC
+
+ #define YM_MISSION_DIAG_TLM_TOPICID YM_MISSION_TIDVAL(DIAG_TLM)
+ #define DEFAULT_YM_MISSION_DIAG_TLM_TOPICID 0xDEF
+ ```
+
+ ``` XML
+
+
+
+
+
+
+
+
+
+ ```
+
+## Testing and Validation
+
+After integrating your EDS-enabled module, thorough testing is crucial to ensure proper operation. Follow these steps for effective validation:
+
+### Validate EDS Integration
+
+In order to verify that EDS was integrated properly, one must build the source code in the following combinations without issue:
+ 1. Unit tests enabled, EDS enabled
+ * ``` shell
+ make distclean
+ make SIMULATION=native ENABLE_UNIT_TESTS=true CFE_EDS_ENABLED=true prep
+ make
+ make test
+ ```
+ 2. Unit tests enabled, EDS disabled
+ * ``` shell
+ make distclean
+ make SIMULATION=native ENABLE_UNIT_TESTS=true prep
+ make
+ make test
+ ```
+ 3. Unit tests disabled, EDS enabled
+ * ``` shell
+ make distclean
+ make SIMULATION=native CFE_EDS_ENABLED=true prep
+ make
+ make test
+ ```
+ 4. Unit tests disabled, EDS disabled
+ * ``` shell
+ make distclean
+ make SIMULATION=native prep
+ make
+ make test
+ ```
+
+### Unit Testing
+
+1. **Command Processing Tests**
+ - Verify that each command defined in your EDS XML is properly processed
+ - Test boundary conditions and error handling for each command
+ - Ensure command counters are properly incremented
+
+2. **Telemetry Verification**
+ - Confirm all telemetry packets are properly formatted according to EDS definitions
+ - Verify that telemetry data is updated at the expected frequency
+ - Test housekeeping telemetry comprehensively
+
+### Integration Testing
+1. **End-to-End Testing**
+ - Send commands from ground systems using the EDS-generated command dictionary
+ - Verify telemetry can be properly decoded using the EDS-generated telemetry dictionary
+ - Test all nominal operations and error recovery scenarios
+
+2. **Performance Testing**
+ - Monitor CPU and memory usage to ensure they remain within budget
+ - Verify timing requirements are met under load conditions
+
+### Validation Tools
+- **cFS EDS Tools**: Use built-in tools like `eds2cfgfile` for configuration validation
+- **CTF (cFS Test Framework)**: If available, create automated tests using the cFS Test Framework
+- **GDS (Ground Data System)**: Use a compatible ground system to verify end-to-end operations
+
+## Troubleshooting
+
+Common issues when integrating EDS-enabled modules and their solutions:
+
+### Build Issues
+
+| Issue | Possible Cause | Solution |
+|-------|---------------|----------|
+| Missing EDS-generated header files | Incorrect path in `mission_build.cmake` or `arch_build.cmake` | Verify file paths and ensure `generate_configfile_set()` is called with the correct file list |
+| Linker errors with undefined EDS symbols | Missing EDS library linkage | Add `CFE_EDS_ENABLED_BUILD` flag and ensure proper library linking in `CMakeLists.txt` |
+| `ym_eds_dispatch.c` compilation errors | Incompatible EDS definitions | Verify EDS XML syntax and ensure it matches the implementation in the dispatch file |
+
+### Runtime Issues
+
+| Issue | Possible Cause | Solution |
+|-------|---------------|----------|
+| Commands not being processed | Incorrect topic IDs | Verify topic IDs in [cfe-topicids.xml](#3-update-eds-configuration-files) match those used in the module |
+| "Unknown command code" errors | Mismatch between EDS definitions and code | Ensure function codes in EDS XML match those in the implementation |
+| Module fails to start | Missing or incorrect entries in startup script | Check `cfe_es_startup.scr` for correct module name and entry point |
+| Telemetry not appearing | Incorrect telemetry message format | Verify EDS telemetry definitions match the structure being sent |
+
+### EDS XML Issues
+
+| Issue | Possible Cause | Solution |
+|-------|---------------|----------|
+| EDS validation errors | Syntax or semantic errors in XML | Use the EDS validator tool: `eds_tool verify ym.xml` |
+| Namespace conflicts | Duplicate definitions across modules | Ensure unique namespace usage in your EDS XML |
+| Incompatible data types | Using types not supported by EDS | Review CCSDS EDS specification for supported types |
+
+### Debugging Tips
+
+1. **Enable Verbose Logging**
+ - Add debug messages in key processing points
+ - Set `CFE_EVS_DEFAULT_TYPE_FLAG` to include debug events
+
+2. **Use Message Analyzer**
+ - Capture and decode software bus messages to verify format
+ - Compare against EDS definitions
+
+3. **Check Generated Files**
+ - Examine generated header files to ensure they match expectations
+ - Look for discrepancies between default and EDS-generated versions
+
+4. **Common Resolution Steps**
+ - Rebuild the entire system with `make dist clean`
+ - Verify EDS XML file is properly included in the build
+ - Ensure module is properly registering for message reception
diff --git a/INTEGRATION.md b/INTEGRATION.md
new file mode 100644
index 000000000..d71a580c7
--- /dev/null
+++ b/INTEGRATION.md
@@ -0,0 +1,65 @@
+# Integration Guide
+
+This document is for a project on an older version of cFS who wants to step up to this version. To use this guide, scroll down until you reach the first version that you do not have. In that section and each one above it, each entry represents an API change or other modification that may require updates in your project bundle.
+
+Note that this document does *not* list all changes to cFS, only those that are expected to have a noticeable impact to existing code such as an API or behavioral changes. There is no guarantee that this document captures all changes that may affect the mission code, and full verification and validation is expected when updating versions.
+
+## Format
+
+- Description: What changed?
+- Affects: Who is impacted by this change?
+- Required modification: What do you need to change in your bundle?
+- Common repo(s) affected: Where was the cFS change made?
+- Commit: Which commit changed the code that required this?
+
+## Versions
+
+Versions here are listed from newest (at the top) to oldest (at the bottom). Start from your version and work your way to the top.
+
+### Fornax
+
+LAB apps table name change
+ - The default CFE startup script now starts the LAB apps as `CI_LAB`, `TO_LAB`, and `SCH_LAB`, as opposed
+ to `CI_LAB_APP`, `TO_LAB_APP`, and `SCH_LAB_APP`, respectively.
+ - Additionally, the table names in the TO_LAB and SCH_LAB apps have been simplified. CI_LAB does not have a table.
+ - When combined with the application name, the "fully-qualified" table name now becomes:
+ - For TO_LAB: `TO_LAB.Subscriptions` instead of `TO_LAB_APP.TO_LAB_Subs`
+ - For SCH_LAB: `SCH_LAB.Schedule` instead of `SCH_LAB_APP.ScheduleTable`
+ - Affects: Those who use TO_LAB and SCH_LAB and have modified the table(s) by overriding the table file
+ - Required modification: Change the table name in the `CFE_TBL_FILEDEF` macro in the overridden table file as above.
+ The fully-qualified table runtime name is the second parameter to the macro.
+ - Common repo(s) affected: cFE, TO_LAB, SCH_LAB
+ - cFE Commit: df6f7240b0e6265fdcb2ab9a182934c6baa7f5e8
+ - TO_LAB Commit: 4121af6f1fa571325849ce809ae880635597b6cf
+ - SCH_LAB Commit: 701d4600d3ef8b9011418e3f5e6a2311ea9fa3c0
+
+CFE_SB_SUB_ENTRIES_PER_PKT renamed
+ - Description: A macro `CFE_SB_SUB_ENTRIES_PER_PKT` had been incorrectly defined in cfe_sb_extern_typedefs.h. This has been
+ moved to the CFE SB interface (mission-scope) configuration and is now called `CFE_MISSION_SB_SUB_ENTRIES_PER_PKT` in
+ accordance with the patterns used for all other interface configuration options
+ - Affects: Those who use the `CFE_SB_SUB_ENTRIES_PER_PKT` macro in their mission code
+ - Required modification: Rename any references from `CFE_SB_SUB_ENTRIES_PER_PKT` to `CFE_MISSION_SB_SUB_ENTRIES_PER_PKT`
+ - Note this is related to internal telemetry from SB, which was only intended to be consumed by SBN. It is not expected that this will affect any other external/user applications as this was not part of the TLM set normally published by SB.
+ - Common repo(s) affected: cFE
+ - Commit: b014007afae0d94b795daff16ca772e60f1c72d3
+
+CFE Table Services handle typedef update
+ - Description: The `CFE_TBL_Handle_t` typedef is changed from a simple int16 to an opaque 32-bit value derived from CFE_ResourceId_t
+ - Affects: Those who perform operations on `CFE_TBL_Handle_t`
+ - This change is only exposed by switching OMIT_DEPRECATED to ON. If OMIT_DEPRECATED is OFF, then a 16 bit integer
+ type is used instead, which is backward compatible
+ - Required modification: With the transition to the opaque 32 bit value, applications must transition to using the
+ inline functions for checking or comparing the values:
+ - Use `CFE_TBL_HandleID_IsEqual()` instead of a numeric comparison using `==`
+ - Use `CFE_TBL_HandleID_AsInt()` for use with logging/events or any other printf-style calls
+ - Use `CFE_TBL_HandleID_IsDefined()` to check if a table handle is valid or not
+ - Commit repo(s) affected: cFE
+ - Commit: d16f1412f94e0e24b53e4f21b89e57efb80fff66
+
+RTS Seconds to Wakeups
+- Description: Relative Time Sequence (RTS) file times now represent the number of wakeups, rather than seconds
+- Affects: Those who use the Stored Command RTS capability with a Scheduler wakeup different from 1 Hz
+- Required modification: Regenerate all RTS files based on the wakeup frequency, rather than time in seconds
+- Common repo(s) affected: SC
+- Commit: 90ddac7c379690fdad05dee05368bdec70ae2912
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..48b9eedb3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,83 @@
+#
+# Core Flight Software CMake / GNU make wrapper
+#
+# This wrapper defines the following major goals:
+# prep -- Runs CMake to create a new or re-configure an existing build tree
+# all -- Build all targets in the CMake build tree
+# install -- Copy all files to the installation tree and run packaging scripts
+# clean -- Clean all targets in the CMake build tree, but not the build tree itself.
+# distclean -- Entirely remove the build directory
+# docs -- Build all doxygen source documentation.
+# test -- Run all unit tests defined in the build.
+# lcov -- Runs the "lcov" tool on the build tree to collect all code coverage
+#
+# Actual buildable targets combine one of the goals above with a configuration,
+# specified as a pair in the form .
+#
+# For example, "native.prep" runs prep for the native config, and "flight.test"
+# runs the tests for the flight config.
+#
+# As a shorthand, specifying only the goal (e.g. prep) runs that target for all
+# defined configurations.
+#
+
+# This file must define all the possible make goals
+include goal-configs.mk
+
+# For all targets the O var should be set to the per-config build dir
+$(ALL_TARGETS): CFG = $(basename $(@))
+$(ALL_TARGETS): O = $(O_$(CFG))
+$(STAMP_TARGETS): STAMPFILE = $(O)/stamp$(suffix $(@))
+$(CFS_TARGETS): SUBTGT_PREFIX ?= mission-
+
+.PHONY: $(ALL_GOAL_NAMES) $(ALL_TARGETS)
+
+# This makefile just invokes a sub-make, and it is important to not invoke that
+# sub-make multiple times in parallel when the -j option is used. This is still
+# a bit heavy-handed because it only really needs to be done for targets on the
+# same build tree (e.g. native.compile and native.test need to be serialized, but
+# native.compile and flight.test should be fine in parallel). However, make does
+# not seem to offer much granularity in this target. Furthermore, running tests
+# still might conflict (e.g. native.test and flight.test) if those programs run
+# on the host and bind to the same network ports, so it is safest to serialize all.
+.NOTPARALLEL:
+
+# The "docs" target is just a meta target for all docs (detaildesign, usersguide, osalguide)
+$(CFS_DOCS_TARGETS): %.docs: %.detaildesign
+$(CFS_DOCS_TARGETS): %.docs: %.usersguide
+$(CFS_DOCS_TARGETS): %.docs: %.osalguide
+
+# The "distclean" goal removes the entire build dir, including generated makefiles
+$(DISTCLEAN_TARGETS):
+ [ ! -z "$(O)" ] && rm -rf "$(O)"
+
+# Each of these targets has a corresponding stamp file in the build dir, reflecting the
+# last time the target was successfully built. The stampfile is removed first, such that
+# _directly_ specified targets will always run and rebuild, but dependent targets may be
+# skipped if the stampfile is up to date.
+# For example, the .test stampfile depends on .install stampfile, and if "native.test" is
+# specified here then the .test stampfile will be removed but not the .install stampfile.
+# Thus the install will only run if the .install stampfile does not exist, but the test will
+# always run regardless of the stampfile.
+$(STAMP_TARGETS):
+ rm -f "$(STAMPFILE)"
+ env $(ENV_OPTS_$(CFG)) $(MAKE) --no-print-directory -f $(CURDIR)/target-rules.mk \
+ CFG=$(CFG) GOAL=$(@) STAMPFILE=$(STAMPFILE) all
+ @echo "$(@) successfully completed"
+
+# A generic pattern rule to clean a build area
+$(CLEAN_TARGETS):
+ $(MAKE) --no-print-directory -C "$(O)" $(SUBTGT_PREFIX)clean
+ rm -rf "$(O)"/stamp.*
+
+# Clean up the test state, purges coverage stats and forces all tests to re-run
+$(CLEANTEST_TARGETS):
+ $(MAKE) --no-print-directory -f $(CFG)-test.mk O="$(O)" clean_lcov
+ rm -rf "$(O)"/test-results "$(O)"/stamp.*
+ env $(ENV_OPTS_$(CFG)) $(MAKE) --no-print-directory -f $(CURDIR)/target-rules.mk \
+ CFG=$(CFG) GOAL=$(CFG).runtest STAMPFILE=$(O)/stamp.runtest all
+
+# also define targets which builds all configs (except world, which has custom rule)
+# This utilizes "second expansion" feature of gnu make so that $@ may be referenced in prereq list
+.SECONDEXPANSION:
+$(ALL_GOAL_NAMES) distclean: $$(addsuffix .$$(@),$(CONFIG_NAMES))
diff --git a/README.md b/README.md
index b7a4f709e..b7694e645 100644
--- a/README.md
+++ b/README.md
@@ -88,37 +88,80 @@ You can email the cFS Product Team at [cfs-program@lists.nasa.gov](). Quick-start is below:
+The cFS Framework including sample applications will build and run on the pc-linux platform support package (should run on most Linux distributions). Quick-start is below:
To prep, compile, and run on the host (from cFS directory above) as a normal user (best effort message queue depth and task priorities):
- make distclean
- (For a clean build on subsequent runs)
- make SIMULATION=native prep
- make
- make install
- cd build/exe/cpu1/
+ make native_std.prep # Sets up the build tree
+ make native_std.install # Compiles the software and stages it to the exe directory
+ make native_std.runtest # Executes the tests
+ make native_std.lcov # Executes lcov to collect coverage metrics
+
+In order to boot CFE, the default linux PSP requires that the working directory be set to the location of the staged binaries:
+
+ cd build-native_std/exe/cpu1/
./core-cpu1
Should see startup messages, and CFE_ES_Main entering OPERATIONAL state. Note the code must be executed from the build/exe/cpu1 directory to find the startup script and shared objects.
-Note: The steps above are for a debug, permissive mode build and includes deprecated elements. For a release build, recommendation is `make BUILDTYPE=release OMIT_DEPRECATED=true prep`. Unit tests can be added with `ENABLE_UNIT_TESTS=true` during the prep step, run with `make test`, and coverage reported with `make lcov`. Functional tests can be run by including `ENABLE_UNIT_TESTS=true` during prep and including the cfe_testcase app in the runtime app configuration (.scr file).
+### Other Build configurations
+
+The Makefile system included in this bundle allows multiple output targets/configurations to be built and tested in parallel. Each configuration is given a separate build directory, keeping all the artifacts separate from other build configurations.
+
+The following configurations are defined, which build for the native machine and are intended for development and testing:
+
+ - `native_std`: the traditional Linux development build, targets the local machine architecture (native), debugging enabled, includes unit tests
+ - `native_eds`: like native_std but enables EDS. This is the reference configuration for EDS development and testing.
+ - `osal`: compiles OSAL in a standalone manner, creates a library that can be linked into any application
+ - `edslib`: complies EdsLib in a standalone manner, creates a library that can be linked into any application
+
+The following configurations utilize cross compilers and require that the respective toolchain is installed on the host (instructions provided separately where relevant)
+
+ - `pc686_rtems5`: cross compile for the "pc686" target running RTEMS 5, using the toolchain from rtems-tools. The resulting binaries may be executed in QEMU.
+ - `gr712_rtems5`: cross compile for the "gr712" target running RTEMS 5, using the gaisler rcc toolchain
+ - `rpi_vxworks7`: cross compile for the Raspberry Pi running VxWorks 7
+ - `rpi_linux`: cross compile for the Raspberry Pi running Linux
+ - `qemu_yocto_linux`: cross compile for a Yocto/Space Grade Linux target. The resulting binaries can be executed in QEMU. This enables full optimizations (release build).
+
+### Other build goals
+
+The following set of goals exist for each configuration:
+
+ - `prep`: Sets up the build tree
+ - `compile` : Compiles the software, but does not stage it to any output/install directory
+ - `install` : Compiles and stages the software to the output/install directory (suitable for execution)
+ - `runtest`: Executes all the unit tests. (Recommend using `-j` option to run tests in parallel, depending on available cores)
+ - `lcov`: Computes code coverage metrics (Requires/depends on "runtest" completing and passing)
+ - `detaildesign`: Generates doxygen documentation for the complete mission, all software included
+ - `usersguide` : Generates the CFE users guide documentation
+ - `osalguide` : Generates the OSAL users guide documentation
+ - `image`: Generates an image that can be booted in a container or VM (e.g. Docker or QEMU) if applicable to that configuration. Not all configurations implement this goal.
+
+
+### General build instructions
+
+The Makefiles implement targets following the pattern of:
+
+ .
+
+`` represents one of the configurations listed above and `` represents one of the goals listed above.
+For example, `rpi_linux.install` will build the "install" goal using the "rpi_linux" configuration.
+
+Each configuration gets its own output directory based on the configuration name with a `build-` prefix. So for example, the binaries produced by `native_eds` targets will be staged under `build-native_eds/`. This is what allows all the configurations to be built in parallel without interfering with each other.
+
-### Send commands, receive telemetry
+## Send commands, receive telemetry
The cFS-GroundSystem tool can be used to send commands and receive telemetry. For details on using and setting up the Ground System, see the [Guide-GroundSystem](https://github.com/nasa/cFS-GroundSystem/blob/main/Guide-GroundSystem.md). Note it depends on PyQt5 and PyZMQ:
diff --git a/apps/cf b/apps/cf
new file mode 160000
index 000000000..92baf07dc
--- /dev/null
+++ b/apps/cf
@@ -0,0 +1 @@
+Subproject commit 92baf07dc04d92cb388d899119df060126f708a0
diff --git a/apps/cs b/apps/cs
new file mode 160000
index 000000000..d6b1eff2f
--- /dev/null
+++ b/apps/cs
@@ -0,0 +1 @@
+Subproject commit d6b1eff2f05e9f8d525c67b8565a833f2ca38b2c
diff --git a/apps/ds b/apps/ds
new file mode 160000
index 000000000..036e8550d
--- /dev/null
+++ b/apps/ds
@@ -0,0 +1 @@
+Subproject commit 036e8550db9db3cfd8da806f0ec5d60c0b97737e
diff --git a/apps/fm b/apps/fm
new file mode 160000
index 000000000..558a77630
--- /dev/null
+++ b/apps/fm
@@ -0,0 +1 @@
+Subproject commit 558a7763027dd6d495a603624e7dd6b35f9952ac
diff --git a/apps/hk b/apps/hk
new file mode 160000
index 000000000..6c7b88be0
--- /dev/null
+++ b/apps/hk
@@ -0,0 +1 @@
+Subproject commit 6c7b88be06a2915af9518a36e9d731e04640d9cc
diff --git a/apps/hs b/apps/hs
new file mode 160000
index 000000000..5c63be63f
--- /dev/null
+++ b/apps/hs
@@ -0,0 +1 @@
+Subproject commit 5c63be63f621448b390a46a6bcd9bdacf953c7a9
diff --git a/apps/lc b/apps/lc
new file mode 160000
index 000000000..4cc95d79d
--- /dev/null
+++ b/apps/lc
@@ -0,0 +1 @@
+Subproject commit 4cc95d79d5ef4f8c442405dcac338cccd0c8f1e7
diff --git a/apps/md b/apps/md
new file mode 160000
index 000000000..1057af2fa
--- /dev/null
+++ b/apps/md
@@ -0,0 +1 @@
+Subproject commit 1057af2fa44327bf7e4d9f2141ca0ebd8e9a94d3
diff --git a/apps/mm b/apps/mm
new file mode 160000
index 000000000..099887a77
--- /dev/null
+++ b/apps/mm
@@ -0,0 +1 @@
+Subproject commit 099887a77ad5fc308c00ddce02dc55b3267ed954
diff --git a/apps/sbn b/apps/sbn
new file mode 160000
index 000000000..7c37a493e
--- /dev/null
+++ b/apps/sbn
@@ -0,0 +1 @@
+Subproject commit 7c37a493ecfb0677cbc47407e20d7ef62c48bb2b
diff --git a/apps/sbn_f_remap b/apps/sbn_f_remap
new file mode 120000
index 000000000..bf2dea619
--- /dev/null
+++ b/apps/sbn_f_remap
@@ -0,0 +1 @@
+sbn/modules/filter/remap/
\ No newline at end of file
diff --git a/apps/sbn_udp b/apps/sbn_udp
new file mode 120000
index 000000000..79a5bd624
--- /dev/null
+++ b/apps/sbn_udp
@@ -0,0 +1 @@
+sbn/modules/protocol/udp/
\ No newline at end of file
diff --git a/apps/sc b/apps/sc
new file mode 160000
index 000000000..81f17b281
--- /dev/null
+++ b/apps/sc
@@ -0,0 +1 @@
+Subproject commit 81f17b281faea4be88c16c0244fe892bd1323442
diff --git a/custom-rules.mk b/custom-rules.mk
new file mode 100644
index 000000000..af730f502
--- /dev/null
+++ b/custom-rules.mk
@@ -0,0 +1,154 @@
+# This converts the staging directory from "make install" into a virtual
+# filesystem that can be mounted in a VM or container
+
+YOCTO_SANDBOX_REPO = https://developer.nasa.gov/cFS/yocto-sandbox
+YOCTO_SANDBOX_TAG = v0.0.3-testing
+
+PARTED_CMD ?= /usr/sbin/parted
+
+IMAGE_TYPE ?= qcow2
+IMAGE_LABEL ?= cFS
+IMAGE_SIZE ?= 128M
+DEPLOY_DIR ?= $(O)/deploy
+
+QEMU_YOCTO_DEPLOY_DIR = $(O_qemu_yocto_linux)/deploy
+QEMU_PC686_RTEMS_DEPLOY_DIR = $(O_pc686_rtems5)/deploy
+
+CFS_IMAGE_BASENAME = cfs-$(CPUNAME)
+
+QEMU_MACADDR = 52:54:00$(shell head -c 3 /dev/urandom | hexdump -v -e '/1 ":%02X"')
+QEMU_HOSTFWD = udp::1234-:1234,hostfwd=tcp::2222-:22
+
+QEMU_NET_OPTS += -device $(QEMU_NETDEV_TYPE),netdev=net0,mac=$(QEMU_MACADDR)
+QEMU_NET_OPTS += -netdev user,id=net0,hostfwd=$(QEMU_HOSTFWD)
+
+ifeq ($(IMAGE_TYPE),qcow2)
+IMAGE_FORMAT ?= qcow2
+else
+IMAGE_FORMAT ?= raw
+endif
+
+QEMU_DEVICE_OPTS += -object rng-random,filename=/dev/urandom,id=rng0
+QEMU_DEVICE_OPTS += -device virtio-rng-pci,rng=rng0
+QEMU_DEVICE_OPTS += -display none
+QEMU_DEVICE_OPTS += -serial stdio
+
+RTEMS5_APPEND_OPTS += --console=/dev/com1
+RTEMS5_APPEND_OPTS += --batch-mode
+
+
+$(QEMU_YOCTO_DEPLOY_DIR)/fetch_yocto_rootfs.cpu1.stamp: SYSTEM_PACKAGE = qemuriscv64-target-bin.tar.xz
+$(QEMU_YOCTO_DEPLOY_DIR)/fetch_yocto_rootfs.cpu2.stamp: SYSTEM_PACKAGE = qemumips-target-bin.tar.xz
+
+$(DEPLOY_DIR)/fetch_yocto_rootfs.%.stamp:
+ mkdir -p $(DEPLOY_DIR)/$(CPUNAME)
+ curl -fsL $(YOCTO_SANDBOX_REPO)/releases/download/$(YOCTO_SANDBOX_TAG)/$(SYSTEM_PACKAGE) | tar Jxv -C $(DEPLOY_DIR)/$(CPUNAME) -f -
+ touch "$(@)"
+
+# generic rule for creating a CFS tarball
+# this uses "fakeroot" so the files in the resulting tarball have root:root ownership
+%.tar.xz: $(O)/stamp.install
+ mkdir -p "$(dir $(@))"
+ rm -f "$(@)"
+ tar Jc --owner=root --group=root -f "$(abspath $(@)).tmp" -C $(O)/exe/$(CPUNAME) .
+ mv -v "$(@).tmp" "$(@)"
+
+# generic rule for creating an ext4 image from the build
+# This is intended for linux so it includes everything including the cfs executable
+%.ext4: $(O)/stamp.install
+ mkdir -p "$(dir $(@))"
+ rm -f "$(@)"
+ fakeroot /usr/sbin/mke2fs -t ext4 -L "$(IMAGE_LABEL)" -d "$(O)/exe/$(CPUNAME)" "$(@).tmp" $(IMAGE_SIZE)
+ mv -v "$(@).tmp" "$(@)"
+
+# generic rule for creating a qcow overlay image from an ext4 image
+%.qcow2: %.ext4
+ mkdir -p "$(dir $(@))"
+ rm -f "$(@)"
+ cd "$(dir $(<))" && qemu-img create -o backing_file="$(notdir $(<))",backing_fmt=raw -f qcow2 "$(notdir $(@)).tmp"
+ mv -v "$(@).tmp" "$(@)"
+
+# generic rule for creating a fat filesystem image from the build
+# Note that this does NOT include the cfs executable itself, just the eeprom dir
+%.fat: $(O)/stamp.install
+ mkdir -p "$(dir $(@))"
+ truncate -s $(IMAGE_SIZE) $(@).tmp
+ /usr/sbin/mkfs.fat "$(@).tmp"
+ (cd $(O)/exe/$(CPUNAME) && mcopy -sv -i "$(abspath $(@).tmp)" eeprom ::)
+ mv -v "$(@).tmp" "$(@)"
+
+# generic rule for creating a disk image from a fat filesystem image
+# The disk image needs to be exactly 63 512-byte sectors larger than the fat FS
+# This is the traditional size of the MS-DOS partition table
+%.diskimg: FS_SIZE = $(shell stat --printf="%s" "$(<)")
+%.diskimg: %.fat
+ mkdir -p "$(dir $(@))"
+ truncate -s $$(($(FS_SIZE) + 32256)) $(@).tmp
+ $(PARTED_CMD) -s $(@).tmp -- mklabel msdos
+ $(PARTED_CMD) -a none -s $(@).tmp -- mkpart primary fat32 63s -1s
+ dd if=$(<) of=$(@).tmp bs=512 seek=63
+ mv -v "$(@).tmp" "$(@)"
+
+# generic rule for creating a disk image from a fat filesystem image
+%.diskimg: %.fat
+ mkdir -p "$(dir $(@))"
+ truncate -s $(IMAGE_SIZE) $(@)
+ $(PARTED_CMD) -s $(@) -- mklabel msdos
+ $(PARTED_CMD) -a none -s $(@) -- mkpart primary fat32 63s -1s
+ dd if=$(<) of=$(@) bs=512 seek=63
+
+%/rtems-cfs.exe: $(O)/stamp.install
+ mkdir -p "$(dir $(@))"
+ cp -v "$(O)/exe/$(CPUNAME)/core-$(CPUNAME).exe" "$(@)"
+
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: CPUNAME = cpu1
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: QEMU_HYPERVISOR = qemu-system-riscv64 -M virt -m 512M -smp 4 -bios fw_jump.elf
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: QEMU_KERNEL = -kernel Image -append 'root=/dev/vda mem=512M earlycon=sbi swiotlb=0'
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: ROOTFS_IMAGE_BASENAME = core-image-cfecfs-qemuriscv64.rootfs
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: QEMU_NETDEV_TYPE = virtio-net-device
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: $(QEMU_YOCTO_DEPLOY_DIR)/cpu1/core-image-cfecfs-qemuriscv64.rootfs.$(IMAGE_TYPE)
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: $(QEMU_YOCTO_DEPLOY_DIR)/cpu1/cfs-cpu1.$(IMAGE_TYPE)
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start: $(QEMU_YOCTO_DEPLOY_DIR)/fetch_yocto_rootfs.cpu1.stamp
+
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: CPUNAME = cpu2
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: QEMU_HYPERVISOR = qemu-system-mips -M malta -cpu 34Kf -m 256M
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: QEMU_KERNEL = -kernel vmlinux
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: ROOTFS_IMAGE_BASENAME = core-image-cfecfs-qemumips.rootfs
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: QEMU_NETDEV_TYPE = virtio-net-pci
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: $(QEMU_YOCTO_DEPLOY_DIR)/cpu2/core-image-cfecfs-qemumips.rootfs.$(IMAGE_TYPE)
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: $(QEMU_YOCTO_DEPLOY_DIR)/cpu2/cfs-cpu2.$(IMAGE_TYPE)
+$(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start: $(QEMU_YOCTO_DEPLOY_DIR)/fetch_yocto_rootfs.cpu2.stamp
+
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/container-start: CPUNAME = cpu1
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/container-start: QEMU_KERNEL = -kernel rtems-cfs.exe -append '$(RTEMS5_APPEND_OPTS)'
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/container-start: $(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/rtems-cfs.exe
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/container-start: $(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/cfs-cpu1.diskimg
+
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu2/container-start: CPUNAME = cpu2
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu2/container-start: QEMU_KERNEL = -kernel rtems-cfs.exe -append '$(RTEMS5_APPEND_OPTS)'
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/container-start: $(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu2/rtems-cfs.exe
+$(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu2/container-start: $(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu2/cfs-cpu2.diskimg
+
+%/container-start: custom-rules.mk
+ truncate -s 0 "$(@)"
+ echo -n "$(QEMU_HYPERVISOR) " >> "$(@)"
+ echo -n "$(QEMU_NET_OPTS) " >> "$(@)"
+ echo -n "$(QEMU_DISK_OPTS) " >> "$(@)"
+ echo -n "$(QEMU_DEVICE_OPTS) " >> "$(@)"
+ echo -n "$(QEMU_KERNEL) " >> "$(@)"
+ echo "" >> "$(@)"
+ chmod +x "$(@)"
+
+$(O_qemu_yocto_linux)/stamp.image: QEMU_DISK_OPTS += -drive id=disk0,file=$(ROOTFS_IMAGE_BASENAME).$(IMAGE_TYPE),format=$(IMAGE_FORMAT)
+$(O_qemu_yocto_linux)/stamp.image: QEMU_DISK_OPTS += -drive id=disk1,file=$(CFS_IMAGE_BASENAME).$(IMAGE_TYPE),format=$(IMAGE_FORMAT)
+$(O_qemu_yocto_linux)/stamp.image: $(QEMU_YOCTO_DEPLOY_DIR)/cpu1/container-start
+$(O_qemu_yocto_linux)/stamp.image: $(QEMU_YOCTO_DEPLOY_DIR)/cpu2/container-start
+
+$(O_pc686_rtems5)/stamp.image: QEMU_HYPERVISOR = qemu-system-i386 -m 128M -no-reboot
+$(O_pc686_rtems5)/stamp.image: QEMU_NETDEV_TYPE = i82557b
+$(O_pc686_rtems5)/stamp.image: QEMU_DISK_OPTS += -drive id=disk0,file=$(CFS_IMAGE_BASENAME).diskimg,format=raw
+$(O_pc686_rtems5)/stamp.image: $(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu1/container-start
+$(O_pc686_rtems5)/stamp.image: $(QEMU_PC686_RTEMS_DEPLOY_DIR)/cpu2/container-start
+
+# do not auto-delete these artifacts
+.PRECIOUS: %.ext4 %.qcow2
diff --git a/distbuild.mk b/distbuild.mk
new file mode 120000
index 000000000..9253bfc18
--- /dev/null
+++ b/distbuild.mk
@@ -0,0 +1 @@
+cfe/cmake/Makefile.sample
\ No newline at end of file
diff --git a/edslib-test.mk b/edslib-test.mk
new file mode 100644
index 000000000..51f75cd86
--- /dev/null
+++ b/edslib-test.mk
@@ -0,0 +1,23 @@
+# At a minimum the variable O must be set by the caller
+ifeq ($(O),)
+$(error O must be set prior to edslib-test.mk)
+endif
+
+TEST_PARALLEL_JOBS ?= 8
+
+.PHONY: all_tests all_lcov clean_lcov force
+
+$(O)/coverage_test.info: force
+ lcov --capture --rc lcov_branch_coverage=1 --directory "$(O)" --output-file "$(O)/coverage_test.info"
+
+clean_lcov:
+ find "$(O)" -type f -name '*.gcno' -o -name '*.gcda' -print0 | xargs -0 rm -f
+ -rm -f $(O)/coverage_test.info
+
+all_tests: | clean_lcov
+all_tests:
+ cd "$(O)" && ctest -j$(TEST_PARALLEL_JOBS) --output-on-failure -O osal-test.log
+
+all_lcov: $(O)/ $(O)/coverage_test.info
+ genhtml "$(O)/coverage_test.info" --branch-coverage --output-directory "$(O)/lcov"
+ @/bin/echo -e "\n\nCoverage Report Link: file://$(abspath $(O))/lcov/index.html\n"
diff --git a/goal-configs.mk b/goal-configs.mk
new file mode 100644
index 000000000..8d3279095
--- /dev/null
+++ b/goal-configs.mk
@@ -0,0 +1,81 @@
+#
+# Core Flight Software CMake / GNU make wrapper
+#
+# ABOUT THIS MAKEFILE:
+# This is actually part of the CMake alternative build system.
+# It is a GNU-make wrapper that calls the CMake tools appropriately
+# so that setting up a new build is fast and easy with no need to
+# learn the CMake commands. It also makes it easier to integrate
+# the build with IDE tools such as Eclipse by providing a default
+# makefile that has the common targets such as all/clean/etc.
+#
+# Use of this file is optional.
+#
+# This file is intended to be placed at the TOP-MOST level of the mission
+# source tree, i.e. a level above "cfe". Note this is outside the cfe
+# repository which is why it cannot be delivered directly in place.
+# To use it, simply copy it to the top directory. As this just contains
+# wrappers for the CMake targets, it is unlikely to change. Projects
+# are also free to customize this file and add their own targets after
+# copying it to the top of the source tree.
+#
+# For _ALL_ targets defined in this file the build tree location may
+# be specified via the "O" variable (i.e. make O= all).
+# If not specified then the "build" subdirectory will be assumed.
+#
+# This wrapper defines the following major targets:
+# prep -- Runs CMake to create a new or re-configure an existing build tree
+# Note that multiple build trees can exist from a single source
+# Other control options (such as "SIMULATION") may be passed to CMake via
+# make variables depending on the mission build scripts. These will be
+# cached in the build tree so they do not need to be set again thereafter.
+#
+# all -- Build all targets in the CMake build tree
+#
+# install -- Copy all files to the installation tree and run packaging scripts
+# The "DESTDIR" environment variable controls where the files are copied
+#
+# clean -- Clean all targets in the CMake build tree, but not the build tree itself.
+#
+# distclean -- Entirely remove the build directory specified by "O"
+# Note that after this the "prep" step must be run again in order to build.
+# Use caution with this as it does an rm -rf - don't set O to your home dir!
+#
+# docs -- Build all doxygen source documentation. The HTML documentation will be
+# generated under the build tree specified by "O".
+#
+# test -- Run all unit tests defined in the build. Unit tests will typically only
+# be executable when building with the "SIMULATION=native" option. Otherwise
+# it is up to the user to copy the executables to the target and run them.
+#
+# lcov -- Runs the "lcov" tool on the build tree to collect all code coverage
+# analysis data and build the reports. Code coverage data may be output by
+# the "make test" target above.
+#
+
+# The "stamp" target names are associated with a file in the build dir to indicate last run time
+# The "nostamp" target names do not have this, and are always executed
+STAMP_GOAL_NAMES := prep compile install checktest runtest lcov
+CFS_STAMP_GOAL_NAMES := detaildesign usersguide osalguide image
+ALL_GOAL_NAMES := $(STAMP_GOAL_NAMES) $(CFS_STAMP_GOAL_NAMES)
+
+# This file must define CONFIG_NAMES and all other per-config vars
+include target-configs.mk
+
+# The actual buildable targets are a combination of CONFIG.NAME (e.g. native.install)
+STAMP_TARGETS := $(foreach CFG,$(CONFIG_NAMES),$(addprefix $(CFG).,$(STAMP_GOAL_NAMES)))
+STAMP_TARGETS += $(foreach CFG,$(CFS_CONFIG_NAMES),$(addprefix $(CFG).,$(CFS_STAMP_GOAL_NAMES)))
+CFS_TARGETS := $(foreach CFG,$(CFS_CONFIG_NAMES),$(addprefix $(CFG).,$(ALL_GOAL_NAMES)))
+NONCFS_TARGETS := $(filter-out $(CFS_TARGETS),$(STAMP_TARGETS))
+ALL_TARGETS := $(CFS_TARGETS) $(NONCFS_TARGETS)
+
+DISTCLEAN_TARGETS := $(addsuffix .distclean,$(CONFIG_NAMES))
+ALL_TARGETS += $(DISTCLEAN_TARGETS)
+CFS_DOCS_TARGETS := $(addsuffix .docs,$(CFS_CONFIG_NAMES))
+ALL_TARGETS += $(CFS_DOCS_TARGETS)
+CLEAN_TARGETS := $(addsuffix .clean,$(CONFIG_NAMES))
+ALL_TARGETS += $(CLEAN_TARGETS)
+CFS_TARGETS += $(addsuffix .clean,$(CFS_CONFIG_NAMES))
+CLEANTEST_TARGETS := $(addsuffix .cleantest,$(CONFIG_NAMES))
+ALL_TARGETS += $(CLEANTEST_TARGETS)
+CFS_TARGETS += $(addsuffix .cleantest,$(CFS_CONFIG_NAMES))
diff --git a/local-test.mk b/local-test.mk
new file mode 100644
index 000000000..3f1be786e
--- /dev/null
+++ b/local-test.mk
@@ -0,0 +1,40 @@
+# At a minimum the variable O must be set by the caller
+ifeq ($(O),)
+$(error O must be set prior to native-test.mk)
+endif
+
+include $(O)/test-deps.mk
+
+ARCH ?= native
+OBJDIR := $(O)/$(ARCH)
+
+COVERAGE_MODE ?= basic
+
+.PHONY: all_tests all_lcov clean_lcov force
+
+all_tests: $(OBJDIR)/all_tests_complete.stamp
+
+all_lcov: $(OBJDIR)/coverage_$(COVERAGE_MODE).info
+ genhtml "$(<)" --branch-coverage --output-directory "$(OBJDIR)/lcov"
+ @/bin/echo -e "\n\nCoverage Report Link: file://$(abspath $(OBJDIR))/lcov/index.html\n"
+
+clean_lcov:
+ find "$(OBJDIR)" -type f -name '*.info' -o -name '*.gcno' -o -name '*.gcda' -print0 | xargs -0 rm -f
+ rm -f "$(OBJDIR)/all_tests_complete.stamp"
+ rm -rf "$(OBJDIR)/lcov"
+
+# It is important NOT to create the ".log" file unless it was successful
+# The intent is if the test failed it will stop at the temp file and not rename it
+# This relies on the exit code of the test process - it returns nonzero on error
+%.log:
+ (cd $(dir $(<)) && ./$(notdir $(<))) > "$(@).tmp"
+ @mv -v "$(@).tmp" "$(@)"
+
+$(OBJDIR)/all_tests_complete.stamp: $(TEST_OUTPUT_FILES)
+ touch "$(OBJDIR)/all_tests_complete.stamp"
+
+$(OBJDIR)/coverage_basic.info: $(OBJDIR)/all_tests_complete.stamp
+ lcov --capture --rc branch_coverage=1 --directory "$(OBJDIR)" --output-file "$(OBJDIR)/coverage_basic.info"
+
+$(OBJDIR)/coverage_mcdc.info: $(OBJDIR)/all_tests_complete.stamp
+ lcov --capture --rc branch_coverage=1 --directory "$(OBJDIR)" --output-file "$(OBJDIR)/coverage_mcdc.info"
diff --git a/native_eds-test.mk b/native_eds-test.mk
new file mode 100644
index 000000000..9257e04e4
--- /dev/null
+++ b/native_eds-test.mk
@@ -0,0 +1 @@
+include local-test.mk
diff --git a/native_std-test.mk b/native_std-test.mk
new file mode 100644
index 000000000..9257e04e4
--- /dev/null
+++ b/native_std-test.mk
@@ -0,0 +1 @@
+include local-test.mk
diff --git a/osal-test.mk b/osal-test.mk
new file mode 100644
index 000000000..6a8ea3e0b
--- /dev/null
+++ b/osal-test.mk
@@ -0,0 +1,23 @@
+# At a minimum the variable O must be set by the caller
+ifeq ($(O),)
+$(error O must be set prior to osal-test.mk)
+endif
+
+TEST_PARALLEL_JOBS ?= 8
+
+.PHONY: all_tests all_lcov clean_lcov force
+
+$(O)/coverage_test.info: force
+ lcov --capture --rc lcov_branch_coverage=1 --exclude '/usr/*' --directory "$(O)" --output-file "$(O)/coverage_test.info"
+
+clean_lcov:
+ find "$(O)" -type f -name '*.gcno' -o -name '*.gcda' -print0 | xargs -0 rm -f
+ -rm -f $(O)/coverage_test.info
+
+all_tests: | clean_lcov
+all_tests:
+ cd "$(O)" && ctest -j$(TEST_PARALLEL_JOBS) --output-on-failure -O osal-test.log
+
+all_lcov: $(O)/ $(O)/coverage_test.info
+ genhtml "$(O)/coverage_test.info" --branch-coverage --output-directory "$(O)/lcov"
+ @/bin/echo -e "\n\nCoverage Report Link: file://$(abspath $(O))/lcov/index.html\n"
diff --git a/pc686_rtems5-test.mk b/pc686_rtems5-test.mk
new file mode 100644
index 000000000..5548c4897
--- /dev/null
+++ b/pc686_rtems5-test.mk
@@ -0,0 +1,89 @@
+
+# At a minimum the variable O must be set by the caller
+ifeq ($(O),)
+$(error O must be set prior to calling this makefile)
+endif
+
+TEST_RESULT_DIR := $(O)/test-results
+OBJDIR := $(O)/$(ARCH)
+
+include $(O)/test-deps.mk
+
+CFE_IMG_MB ?= 32
+CFE_DISK_IMG ?= $(TEST_RESULT_DIR)/nonvol-disk.img
+CFE_FS_IMG ?= $(TEST_RESULT_DIR)/nonvol-fs.img
+QEMU_COMMAND ?= qemu-system-i386 -m 128
+MACADDR = 00:04:9F$(shell head -c 3 /dev/urandom | hexdump -v -e '/1 ":%02X"')
+
+PARTED_CMD = /usr/sbin/parted
+MKFS_CMD = /usr/sbin/mkfs.fat
+
+# when using RTEMS 5 it needs console specified
+APPEND_OPTS += --console=/dev/com1
+APPEND_OPTS += --batch-mode
+
+.PHONY: all_tests cfe-disk
+
+all_tests: $(OBJDIR)/all_tests_complete.stamp
+
+$(OBJDIR)/all_tests_complete.stamp: $(TEST_OUTPUT_FILES)
+ touch "$(OBJDIR)/all_tests_complete.stamp"
+
+cfe-disk: $(CFE_DISK_IMG).stamp
+
+$(CFE_DISK_IMG): FS_SIZE := $(shell echo $$(($(CFE_IMG_MB) * 1048576)))
+
+$(CFE_DISK_IMG):
+ truncate -s $(FS_SIZE) $(@)
+ $(PARTED_CMD) -s $(@) -- mklabel msdos
+ $(PARTED_CMD) -a none -s $(@) -- mkpart primary fat32 63s -1s
+
+$(CFE_FS_IMG): $(O)/stamp.install
+ truncate -s $$((($(CFE_IMG_MB) * 1048576) - 32256)) $(@)
+ $(MKFS_CMD) $(@)
+
+$(CFE_DISK_IMG).stamp: $(CFE_DISK_IMG) $(CFE_FS_IMG)
+ dd if=$(CFE_FS_IMG) of=$(CFE_DISK_IMG) bs=512 seek=63
+ touch $(@)
+
+clean_img:
+ rm -f $(INSTALL_DIR)/*.img
+
+clean_lcov:
+
+# Special rule for the OS loader image, it needs the modules added
+$(TEST_RESULT_DIR)/osal_loader_UT.img: $(CFE_DISK_IMG).stamp
+ cp "$(CFE_DISK_IMG)" "$(TEST_RESULT_DIR)/osal_loader_UT.img"
+ mcopy -i $(TEST_RESULT_DIR)/osal_loader_UT.img@@63s $(WORKDIR)/utmod ::
+
+# The cow image will be created with the special image above
+$(TEST_RESULT_DIR)/osal_loader_UT.cow: BACKING_IMG=$(TEST_RESULT_DIR)/osal_loader_UT.img
+$(TEST_RESULT_DIR)/osal_loader_UT.cow: $(TEST_RESULT_DIR)/osal_loader_UT.img
+
+%.cow: BACKING_IMG ?= $(CFE_DISK_IMG)
+%.cow: $(CFE_DISK_IMG).stamp
+ qemu-img create -o backing_file="$(abspath $(BACKING_IMG))",backing_fmt=raw -f qcow2 "$(@)"
+
+$(TEST_RESULT_DIR)/%-testrunner.exe:
+ if [ -e "$(WORKDIR)/$(*).exe" ]; then ln -s "$(WORKDIR)/$(*).exe" "$(@)"; fi
+ if [ -e "$(WORKDIR)/$(*)-testrunner.exe" ]; then ln -s "$(WORKDIR)/$(*)-testrunner.exe" "$(@)"; fi
+ if [ ! -e "$(@)" ]; then echo "Cannot find testrunner"; /bin/false; fi
+
+# The network and select tests do not currently run
+$(TEST_RESULT_DIR)/network-api-test.log \
+$(TEST_RESULT_DIR)/select-test.log:
+ echo "TEST SKIPPED" > "$(@)"
+
+# It is important NOT to create the ".log" file unless it was successful
+# The intent is if the test failed it will stop at the temp file and not rename it
+# This needs an extra grep for the SUCCESS line because exit code is from QEMU not the test
+$(TEST_RESULT_DIR)/%.log: $(TEST_RESULT_DIR)/%-testrunner.exe $(TEST_RESULT_DIR)/%.cow
+ $(QEMU_COMMAND) -no-reboot -display none \
+ -kernel $(<) \
+ -drive file=$(TEST_RESULT_DIR)/$(*).cow,format=qcow2 \
+ -device i82557b,netdev=net0,mac=$(MACADDR) \
+ -netdev user,id=net0 \
+ -append '$(APPEND_OPTS)' \
+ -serial file:"$(@).tmp"
+ grep -q '^Application exit status: SUCCESS' "$(@).tmp"
+ @mv -v "$(@).tmp" $(@)
diff --git a/qemu_yocto_linux-test.mk b/qemu_yocto_linux-test.mk
new file mode 100644
index 000000000..5548c4897
--- /dev/null
+++ b/qemu_yocto_linux-test.mk
@@ -0,0 +1,89 @@
+
+# At a minimum the variable O must be set by the caller
+ifeq ($(O),)
+$(error O must be set prior to calling this makefile)
+endif
+
+TEST_RESULT_DIR := $(O)/test-results
+OBJDIR := $(O)/$(ARCH)
+
+include $(O)/test-deps.mk
+
+CFE_IMG_MB ?= 32
+CFE_DISK_IMG ?= $(TEST_RESULT_DIR)/nonvol-disk.img
+CFE_FS_IMG ?= $(TEST_RESULT_DIR)/nonvol-fs.img
+QEMU_COMMAND ?= qemu-system-i386 -m 128
+MACADDR = 00:04:9F$(shell head -c 3 /dev/urandom | hexdump -v -e '/1 ":%02X"')
+
+PARTED_CMD = /usr/sbin/parted
+MKFS_CMD = /usr/sbin/mkfs.fat
+
+# when using RTEMS 5 it needs console specified
+APPEND_OPTS += --console=/dev/com1
+APPEND_OPTS += --batch-mode
+
+.PHONY: all_tests cfe-disk
+
+all_tests: $(OBJDIR)/all_tests_complete.stamp
+
+$(OBJDIR)/all_tests_complete.stamp: $(TEST_OUTPUT_FILES)
+ touch "$(OBJDIR)/all_tests_complete.stamp"
+
+cfe-disk: $(CFE_DISK_IMG).stamp
+
+$(CFE_DISK_IMG): FS_SIZE := $(shell echo $$(($(CFE_IMG_MB) * 1048576)))
+
+$(CFE_DISK_IMG):
+ truncate -s $(FS_SIZE) $(@)
+ $(PARTED_CMD) -s $(@) -- mklabel msdos
+ $(PARTED_CMD) -a none -s $(@) -- mkpart primary fat32 63s -1s
+
+$(CFE_FS_IMG): $(O)/stamp.install
+ truncate -s $$((($(CFE_IMG_MB) * 1048576) - 32256)) $(@)
+ $(MKFS_CMD) $(@)
+
+$(CFE_DISK_IMG).stamp: $(CFE_DISK_IMG) $(CFE_FS_IMG)
+ dd if=$(CFE_FS_IMG) of=$(CFE_DISK_IMG) bs=512 seek=63
+ touch $(@)
+
+clean_img:
+ rm -f $(INSTALL_DIR)/*.img
+
+clean_lcov:
+
+# Special rule for the OS loader image, it needs the modules added
+$(TEST_RESULT_DIR)/osal_loader_UT.img: $(CFE_DISK_IMG).stamp
+ cp "$(CFE_DISK_IMG)" "$(TEST_RESULT_DIR)/osal_loader_UT.img"
+ mcopy -i $(TEST_RESULT_DIR)/osal_loader_UT.img@@63s $(WORKDIR)/utmod ::
+
+# The cow image will be created with the special image above
+$(TEST_RESULT_DIR)/osal_loader_UT.cow: BACKING_IMG=$(TEST_RESULT_DIR)/osal_loader_UT.img
+$(TEST_RESULT_DIR)/osal_loader_UT.cow: $(TEST_RESULT_DIR)/osal_loader_UT.img
+
+%.cow: BACKING_IMG ?= $(CFE_DISK_IMG)
+%.cow: $(CFE_DISK_IMG).stamp
+ qemu-img create -o backing_file="$(abspath $(BACKING_IMG))",backing_fmt=raw -f qcow2 "$(@)"
+
+$(TEST_RESULT_DIR)/%-testrunner.exe:
+ if [ -e "$(WORKDIR)/$(*).exe" ]; then ln -s "$(WORKDIR)/$(*).exe" "$(@)"; fi
+ if [ -e "$(WORKDIR)/$(*)-testrunner.exe" ]; then ln -s "$(WORKDIR)/$(*)-testrunner.exe" "$(@)"; fi
+ if [ ! -e "$(@)" ]; then echo "Cannot find testrunner"; /bin/false; fi
+
+# The network and select tests do not currently run
+$(TEST_RESULT_DIR)/network-api-test.log \
+$(TEST_RESULT_DIR)/select-test.log:
+ echo "TEST SKIPPED" > "$(@)"
+
+# It is important NOT to create the ".log" file unless it was successful
+# The intent is if the test failed it will stop at the temp file and not rename it
+# This needs an extra grep for the SUCCESS line because exit code is from QEMU not the test
+$(TEST_RESULT_DIR)/%.log: $(TEST_RESULT_DIR)/%-testrunner.exe $(TEST_RESULT_DIR)/%.cow
+ $(QEMU_COMMAND) -no-reboot -display none \
+ -kernel $(<) \
+ -drive file=$(TEST_RESULT_DIR)/$(*).cow,format=qcow2 \
+ -device i82557b,netdev=net0,mac=$(MACADDR) \
+ -netdev user,id=net0 \
+ -append '$(APPEND_OPTS)' \
+ -serial file:"$(@).tmp"
+ grep -q '^Application exit status: SUCCESS' "$(@).tmp"
+ @mv -v "$(@).tmp" $(@)
diff --git a/sample_defs/arch_build_custom.cmake b/sample_defs/arch_build_custom.cmake
new file mode 100644
index 000000000..056b32f33
--- /dev/null
+++ b/sample_defs/arch_build_custom.cmake
@@ -0,0 +1,46 @@
+#
+# Example arch_build_custom.cmake
+# -------------------------------
+#
+# This file will be automatically included in the arch-specific build scope
+#
+# Definitions and options specified here will be used when cross-compiling
+# _all_ FSW code for _all_ targets defined in targets.cmake.
+#
+# Avoid machine-specific code generation options in this file (e.g. -f,-m options); such
+# options should be localized to the toolchain file such that they will only be
+# included on the machines where they apply.
+#
+# CAUTION: In heterogeneous environments where different cross compilers are
+# used for different CPUs, particularly if from different vendors, it is likely
+# that compile options will need to be different as well.
+#
+# In general, options in this file can only be used in cases where all CPUs use a
+# compiler from the same vendor and/or are all GCC based such that they accept similar
+# command line options.
+#
+# This file can alternatively be named as "arch_build_custom_${TARGETSYSTEM}.cmake"
+# where ${TARGETSYSTEM} represents the system type, matching the toolchain.
+#
+# These example options assume a GCC-style toolchain is used for cross compilation,
+# and uses the same warning options that are applied at the mission level.
+#
+add_compile_options(
+ -std=c99 # Target the C99 standard (without gcc extensions)
+ -pedantic # Issue all the warnings demanded by strict ISO C
+ -Wall # Warn about most questionable operations
+ -Wstrict-prototypes # Warn about missing prototypes
+ -Wwrite-strings # Warn if not treating string literals as "const"
+ -Wpointer-arith # Warn about suspicious pointer operations
+ -Werror # Treat warnings as errors (code should be clean)
+ -fstrict-aliasing
+)
+
+if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0.0)
+add_compile_options(
+ -Wno-stringop-overflow
+ -Wno-stringop-truncation
+ -Wno-format-overflow
+ -Wno-format-truncation
+)
+endif()
diff --git a/sample_defs/arch_build_custom_native.cmake b/sample_defs/arch_build_custom_native.cmake
new file mode 100644
index 000000000..04bf76664
--- /dev/null
+++ b/sample_defs/arch_build_custom_native.cmake
@@ -0,0 +1,12 @@
+#
+# Example arch_build_custom.cmake
+# -------------------------------
+#
+# On native builds only, add strict cast alignment warnings
+# This requires a newer version of gcc
+#
+add_compile_options(
+ -Wcast-align=strict # Warn about casts that increase alignment requirements
+ -fno-common # Do not use a common section for globals
+)
+
diff --git a/sample_defs/cfe_perfids.h b/sample_defs/cfe_perfids.h
new file mode 100644
index 000000000..f3d2f3849
--- /dev/null
+++ b/sample_defs/cfe_perfids.h
@@ -0,0 +1,59 @@
+/************************************************************************
+ * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes”
+ *
+ * Copyright (c) 2020 United States Government as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All Rights Reserved.
+ *
+ * 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 http://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.
+ ************************************************************************/
+
+/**
+ * @file
+ *
+ * Purpose: This file contains the cFE performance IDs
+ *
+ * Design Notes:
+ * Each performance id is used to identify something that needs to be
+ * measured. Performance ids are limited to the range of 0 to
+ * CFE_MISSION_ES_PERF_MAX_IDS - 1. Any performance ids outside of this range
+ * will be ignored and will be flagged as an error. Note that
+ * performance ids 0-31 are reserved for the cFE Core.
+ *
+ * References:
+ *
+ */
+
+#ifndef SAMPLE_PERFIDS_H
+#define SAMPLE_PERFIDS_H
+
+#define CFE_MISSION_ES_PERF_EXIT_BIT 31 /**< \brief bit (31) is reserved by the perf utilities */
+
+/** \name cFE Performance Monitor IDs (Reserved IDs 0-31) */
+/** \{ */
+#define CFE_MISSION_ES_MAIN_PERF_ID 1 /**< \brief Performance ID for Executive Services Task */
+#define CFE_MISSION_EVS_MAIN_PERF_ID 2 /**< \brief Performance ID for Events Services Task */
+#define CFE_MISSION_TBL_MAIN_PERF_ID 3 /**< \brief Performance ID for Table Services Task */
+#define CFE_MISSION_SB_MAIN_PERF_ID 4 /**< \brief Performance ID for Software Bus Services Task */
+#define CFE_MISSION_SB_MSG_LIM_PERF_ID 5 /**< \brief Performance ID for Software Bus Msg Limit Errors */
+#define CFE_MISSION_SB_PIPE_OFLOW_PERF_ID 27 /**< \brief Performance ID for Software Bus Pipe Overflow Errors */
+
+#define CFE_MISSION_TIME_MAIN_PERF_ID 6 /**< \brief Performance ID for Time Services Task */
+#define CFE_MISSION_TIME_TONE1HZISR_PERF_ID 7 /**< \brief Performance ID for 1 Hz Tone ISR */
+#define CFE_MISSION_TIME_LOCAL1HZISR_PERF_ID 8 /**< \brief Performance ID for 1 Hz Local ISR */
+
+#define CFE_MISSION_TIME_SENDMET_PERF_ID 9 /**< \brief Performance ID for Time ToneSendMET */
+#define CFE_MISSION_TIME_LOCAL1HZTASK_PERF_ID 10 /**< \brief Performance ID for 1 Hz Local Task */
+#define CFE_MISSION_TIME_TONE1HZTASK_PERF_ID 11 /**< \brief Performance ID for 1 Hz Tone Task */
+
+/** \} */
+
+#endif /* SAMPLE_PERFIDS_H */
diff --git a/sample_defs/cpu1/cfe_core_api_base_msgid_values.h b/sample_defs/cpu1/cfe_core_api_base_msgid_values.h
new file mode 100644
index 000000000..9bc5be506
--- /dev/null
+++ b/sample_defs/cpu1/cfe_core_api_base_msgid_values.h
@@ -0,0 +1,35 @@
+/************************************************************************
+ * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes”
+ *
+ * Copyright (c) 2020 United States Government as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All Rights Reserved.
+ *
+ * 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 http://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.
+ ************************************************************************/
+
+/**
+ * @file
+ *
+ * This header file contains the platform-specific base msg ID values and
+ * logic to convert a topic ID to a message ID value.
+ *
+ */
+
+#ifndef CPU1_CFE_CORE_BASE_MSGID_VALUES_H
+#define CPU1_CFE_CORE_BASE_MSGID_VALUES_H
+
+#include "global_core_api_base_msgid_values.h"
+
+#define CFE_PLATFORM_BASE_MIDVAL(x) SAMPLE_CPU1_##x##_MID_BASE
+#define CFE_GLOBAL_BASE_MIDVAL(x) SAMPLE_GLOBAL_##x##_MID_BASE
+
+#endif /* CFE_CORE_BASE_MSGIDS_H */
diff --git a/sample_defs/cpu1/cfe_es_startup.scr b/sample_defs/cpu1/cfe_es_startup.scr
new file mode 100644
index 000000000..fd462f80c
--- /dev/null
+++ b/sample_defs/cpu1/cfe_es_startup.scr
@@ -0,0 +1,44 @@
+CFE_LIB, cfe_assert, CFE_Assert_LibInit, ASSERT_LIB, 0, 0, 0x0, 0;
+CFE_LIB, sample_lib, SAMPLE_LIB_Init, SAMPLE_LIB, 0, 0, 0x0, 0;
+CFE_APP, sch_lab, SCH_LAB_AppMain, SCH_LAB, 45, 16384, 0x0, 0;
+CFE_APP, ci_lab, CI_LAB_AppMain, CI_LAB, 50, 16384, 0x0, 0;
+CFE_APP, to_lab, TO_LAB_AppMain, TO_LAB, 55, 16384, 0x0, 0;
+CFE_APP, lc, LC_AppMain, LC, 56, 16384, 0x0, 0;
+CFE_APP, cf, CF_AppMain, CF, 57, 16384, 0x0, 0;
+CFE_APP, ds, DS_AppMain, DS, 58, 16384, 0x0, 0;
+CFE_APP, fm, FM_AppMain, FM, 59, 16384, 0x0, 0;
+CFE_APP, hk, HK_AppMain, HK, 60, 16384, 0x0, 0;
+CFE_APP, hs, HS_AppMain, HS, 61, 16384, 0x0, 0;
+CFE_APP, mm, MM_AppMain, MM, 62, 16384, 0x0, 0;
+CFE_APP, sc, SC_AppMain, SC, 63, 16384, 0x0, 0;
+CFE_APP, md, MD_AppMain, MD, 64, 16384, 0x0, 0;
+CFE_APP, cs, CS_AppMain, CS, 65, 16384, 0x0, 0;
+CFE_APP, sample_app, SAMPLE_APP_Main, SAMPLE_APP, 66, 16384, 0x0, 0;
+CFE_APP, sbn, SBN_AppMain, SBN, 67, 131072, 0x0, 0;
+!
+! Startup script fields:
+! 1. Object Type -- CFE_APP for an Application, or CFE_LIB for a library.
+! 2. Path/Filename -- This is a cFE Virtual filename, not a vxWorks device/pathname
+! 3. Entry Point -- This is the "main" function for Apps.
+! 4. CFE Name -- The cFE name for the APP or Library
+! 5. Priority -- This is the Priority of the App, not used for Library
+! 6. Stack Size -- This is the Stack size for the App, not used for the Library
+! 7. Load Address -- This is the Optional Load Address for the App or Library. Currently not implemented
+! so keep it at 0x0.
+! 8. Exception Action -- This is the Action the cFE should take if the App has an exception.
+! 0 = Just restart the Application
+! Non-Zero = Do a cFE Processor Reset
+!
+! Other Notes:
+! 1. The software will not try to parse anything after the first '!' character it sees. That
+! is the End of File marker.
+! 2. Common Application file extensions:
+! Linux = .so ( ci.so )
+! OS X = .bundle ( ci.bundle )
+! Cygwin = .dll ( ci.dll )
+! vxWorks = .o ( ci.o )
+! RTEMS with S-record Loader = .s3r ( ci.s3r )
+! RTEMS with CEXP Loader = .o ( ci.o )
+! 3. The filename field (2) no longer requires a fully-qualified filename; the path and extension
+! may be omitted. If omitted, the standard virtual path (/cf) and a platform-specific default
+! extension will be used, which is derived from the build system.
diff --git a/sample_defs/cpu1/container-start b/sample_defs/cpu1/container-start
new file mode 100644
index 000000000..72328bb08
--- /dev/null
+++ b/sample_defs/cpu1/container-start
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+./core-cpu1
diff --git a/sample_defs/cpu1/install_custom.cmake b/sample_defs/cpu1/install_custom.cmake
new file mode 100644
index 000000000..5c7905437
--- /dev/null
+++ b/sample_defs/cpu1/install_custom.cmake
@@ -0,0 +1,31 @@
+
+# For the native builds, include a wrapper script to start cFS on the container.
+if (${SIMULATION} MATCHES "^native")
+ install(PROGRAMS ${CMAKE_CURRENT_LIST_DIR}/container-start DESTINATION cpu1)
+endif()
+
+set(APP_INCLUDE_TABLE_LIST
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+)
+
+if (NOT CFE_EDS_ENABLED)
+ list(APPEND APP_INCLUDE_TABLE_LIST
+ $
+ )
+endif()
+
+# specify extra include dirs for to_lab + sch_lab table builds
+target_include_directories(to_lab.table INTERFACE ${APP_INCLUDE_TABLE_LIST})
+target_include_directories(sch_lab.table INTERFACE ${APP_INCLUDE_TABLE_LIST})
diff --git a/sample_defs/cpu1/sbn_msgids.h b/sample_defs/cpu1/sbn_msgids.h
new file mode 100644
index 000000000..e254607e7
--- /dev/null
+++ b/sample_defs/cpu1/sbn_msgids.h
@@ -0,0 +1,68 @@
+/*=======================================================================================
+** File Name: sbn_msgids.h
+**
+** Title:
+**
+** $Author: Steve Duran
+** $Revision: $
+** $Date: 2013-06-10
+**
+** Purpose:
+**
+** Modification History:
+** Date | Author | Description
+** ---------------------------
+** 2013-06-10 | Steve Duran | Build #: Code Started
+**
+**=====================================================================================*/
+
+#ifndef _SBN_MSGIDS_H_
+#define _SBN_MSGIDS_H_
+
+/*
+** Include Files
+*/
+
+#include "global_core_api_base_msgid_values.h" /* defines the base MIDs for each CPU */
+#include "global_sbn_topicids.h" /* defines the base MIDs for each CPU */
+
+/*
+** Pragmas
+*/
+
+/*
+** Local Defines
+*/
+#define SBN_CMD_MID (SAMPLE_CPU1_CMD_MID_BASE + SBN_CMD_TOPICID)
+
+#define SBN_HK_TLM_MID (SAMPLE_CPU1_TLM_MID_BASE + SBN_HK_TLM_TOPICID)
+#define SBN_HKNET_TLM_MID (SAMPLE_CPU1_TLM_MID_BASE + SBN_HKNET_TLM_TOPICID)
+#define SBN_HKPEER_TLM_MID (SAMPLE_CPU1_TLM_MID_BASE + SBN_HKPEER_TLM_TOPICID)
+#define SBN_HKMYSUBS_TLM_MID (SAMPLE_CPU1_TLM_MID_BASE + SBN_HKMYSUBS_TLM_TOPICID)
+#define SBN_HKPEERSUBS_TLM_MID (SAMPLE_CPU1_TLM_MID_BASE + SBN_HKPEERSUBS_TLM_TOPICID)
+
+/*
+** Local Structure Declarations
+*/
+
+/*
+** External Global Variables
+*/
+
+/*
+** Global Variables
+*/
+
+/*
+** Local Variables
+*/
+
+/*
+** Local Function Prototypes
+*/
+
+#endif /* _SBN_MSGIDS_H_ */
+
+/*=======================================================================================
+** End of file sbn_msgids.h
+**=====================================================================================*/
diff --git a/sample_defs/cpu2/cfe_core_api_base_msgid_values.h b/sample_defs/cpu2/cfe_core_api_base_msgid_values.h
new file mode 100644
index 000000000..6468a0206
--- /dev/null
+++ b/sample_defs/cpu2/cfe_core_api_base_msgid_values.h
@@ -0,0 +1,35 @@
+/************************************************************************
+ * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes”
+ *
+ * Copyright (c) 2020 United States Government as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All Rights Reserved.
+ *
+ * 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 http://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.
+ ************************************************************************/
+
+/**
+ * @file
+ *
+ * This header file contains the platform-specific base msg ID values and
+ * logic to convert a topic ID to a message ID value.
+ *
+ */
+
+#ifndef CPU2_CFE_CORE_BASE_MSGID_VALUES_H
+#define CPU2_CFE_CORE_BASE_MSGID_VALUES_H
+
+#include "global_core_api_base_msgid_values.h"
+
+#define CFE_PLATFORM_BASE_MIDVAL(x) SAMPLE_CPU2_##x##_MID_BASE
+#define CFE_GLOBAL_BASE_MIDVAL(x) SAMPLE_GLOBAL_##x##_MID_BASE
+
+#endif /* CFE_CORE_BASE_MSGIDS_H */
diff --git a/sample_defs/cpu2/cfe_es_startup.scr b/sample_defs/cpu2/cfe_es_startup.scr
new file mode 100644
index 000000000..fd462f80c
--- /dev/null
+++ b/sample_defs/cpu2/cfe_es_startup.scr
@@ -0,0 +1,44 @@
+CFE_LIB, cfe_assert, CFE_Assert_LibInit, ASSERT_LIB, 0, 0, 0x0, 0;
+CFE_LIB, sample_lib, SAMPLE_LIB_Init, SAMPLE_LIB, 0, 0, 0x0, 0;
+CFE_APP, sch_lab, SCH_LAB_AppMain, SCH_LAB, 45, 16384, 0x0, 0;
+CFE_APP, ci_lab, CI_LAB_AppMain, CI_LAB, 50, 16384, 0x0, 0;
+CFE_APP, to_lab, TO_LAB_AppMain, TO_LAB, 55, 16384, 0x0, 0;
+CFE_APP, lc, LC_AppMain, LC, 56, 16384, 0x0, 0;
+CFE_APP, cf, CF_AppMain, CF, 57, 16384, 0x0, 0;
+CFE_APP, ds, DS_AppMain, DS, 58, 16384, 0x0, 0;
+CFE_APP, fm, FM_AppMain, FM, 59, 16384, 0x0, 0;
+CFE_APP, hk, HK_AppMain, HK, 60, 16384, 0x0, 0;
+CFE_APP, hs, HS_AppMain, HS, 61, 16384, 0x0, 0;
+CFE_APP, mm, MM_AppMain, MM, 62, 16384, 0x0, 0;
+CFE_APP, sc, SC_AppMain, SC, 63, 16384, 0x0, 0;
+CFE_APP, md, MD_AppMain, MD, 64, 16384, 0x0, 0;
+CFE_APP, cs, CS_AppMain, CS, 65, 16384, 0x0, 0;
+CFE_APP, sample_app, SAMPLE_APP_Main, SAMPLE_APP, 66, 16384, 0x0, 0;
+CFE_APP, sbn, SBN_AppMain, SBN, 67, 131072, 0x0, 0;
+!
+! Startup script fields:
+! 1. Object Type -- CFE_APP for an Application, or CFE_LIB for a library.
+! 2. Path/Filename -- This is a cFE Virtual filename, not a vxWorks device/pathname
+! 3. Entry Point -- This is the "main" function for Apps.
+! 4. CFE Name -- The cFE name for the APP or Library
+! 5. Priority -- This is the Priority of the App, not used for Library
+! 6. Stack Size -- This is the Stack size for the App, not used for the Library
+! 7. Load Address -- This is the Optional Load Address for the App or Library. Currently not implemented
+! so keep it at 0x0.
+! 8. Exception Action -- This is the Action the cFE should take if the App has an exception.
+! 0 = Just restart the Application
+! Non-Zero = Do a cFE Processor Reset
+!
+! Other Notes:
+! 1. The software will not try to parse anything after the first '!' character it sees. That
+! is the End of File marker.
+! 2. Common Application file extensions:
+! Linux = .so ( ci.so )
+! OS X = .bundle ( ci.bundle )
+! Cygwin = .dll ( ci.dll )
+! vxWorks = .o ( ci.o )
+! RTEMS with S-record Loader = .s3r ( ci.s3r )
+! RTEMS with CEXP Loader = .o ( ci.o )
+! 3. The filename field (2) no longer requires a fully-qualified filename; the path and extension
+! may be omitted. If omitted, the standard virtual path (/cf) and a platform-specific default
+! extension will be used, which is derived from the build system.
diff --git a/sample_defs/cpu2/container-start b/sample_defs/cpu2/container-start
new file mode 100644
index 000000000..32b0917af
--- /dev/null
+++ b/sample_defs/cpu2/container-start
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+./core-cpu2
diff --git a/sample_defs/cpu2/install_custom.cmake b/sample_defs/cpu2/install_custom.cmake
new file mode 100644
index 000000000..95a2faf48
--- /dev/null
+++ b/sample_defs/cpu2/install_custom.cmake
@@ -0,0 +1,31 @@
+
+# For the native builds, include a wrapper script to start cFS on the container.
+if (${SIMULATION} MATCHES "^native")
+ install(PROGRAMS ${CMAKE_CURRENT_LIST_DIR}/container-start DESTINATION cpu2)
+endif()
+
+set(APP_INCLUDE_TABLE_LIST
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+ $
+)
+
+if (NOT CFE_EDS_ENABLED)
+ list(APPEND APP_INCLUDE_TABLE_LIST
+ $
+ )
+endif()
+
+# specify extra include dirs for to_lab + sch_lab table builds
+target_include_directories(to_lab.table INTERFACE ${APP_INCLUDE_TABLE_LIST})
+target_include_directories(sch_lab.table INTERFACE ${APP_INCLUDE_TABLE_LIST})
diff --git a/sample_defs/cpu2/sbn_msgids.h b/sample_defs/cpu2/sbn_msgids.h
new file mode 100644
index 000000000..816e8c77f
--- /dev/null
+++ b/sample_defs/cpu2/sbn_msgids.h
@@ -0,0 +1,68 @@
+/*=======================================================================================
+** File Name: sbn_msgids.h
+**
+** Title:
+**
+** $Author: Steve Duran
+** $Revision: $
+** $Date: 2013-06-10
+**
+** Purpose:
+**
+** Modification History:
+** Date | Author | Description
+** ---------------------------
+** 2013-06-10 | Steve Duran | Build #: Code Started
+**
+**=====================================================================================*/
+
+#ifndef _SBN_MSGIDS_H_
+#define _SBN_MSGIDS_H_
+
+/*
+** Include Files
+*/
+
+#include "global_core_api_base_msgid_values.h" /* defines the base MIDs for each CPU */
+#include "global_sbn_topicids.h" /* defines the base MIDs for each CPU */
+
+/*
+** Pragmas
+*/
+
+/*
+** Local Defines
+*/
+#define SBN_CMD_MID (SAMPLE_CPU2_CMD_MID_BASE + SBN_CMD_TOPICID)
+
+#define SBN_HK_TLM_MID (SAMPLE_CPU2_TLM_MID_BASE + SBN_HK_TLM_TOPICID)
+#define SBN_HKNET_TLM_MID (SAMPLE_CPU2_TLM_MID_BASE + SBN_HKNET_TLM_TOPICID)
+#define SBN_HKPEER_TLM_MID (SAMPLE_CPU2_TLM_MID_BASE + SBN_HKPEER_TLM_TOPICID)
+#define SBN_HKMYSUBS_TLM_MID (SAMPLE_CPU2_TLM_MID_BASE + SBN_HKMYSUBS_TLM_TOPICID)
+#define SBN_HKPEERSUBS_TLM_MID (SAMPLE_CPU2_TLM_MID_BASE + SBN_HKPEERSUBS_TLM_TOPICID)
+
+/*
+** Local Structure Declarations
+*/
+
+/*
+** External Global Variables
+*/
+
+/*
+** Global Variables
+*/
+
+/*
+** Local Variables
+*/
+
+/*
+** Local Function Prototypes
+*/
+
+#endif /* _SBN_MSGIDS_H_ */
+
+/*=======================================================================================
+** End of file sbn_msgids.h
+**=====================================================================================*/
diff --git a/sample_defs/default_osconfig.cmake b/sample_defs/default_osconfig.cmake
new file mode 100644
index 000000000..9d194a4cf
--- /dev/null
+++ b/sample_defs/default_osconfig.cmake
@@ -0,0 +1,38 @@
+##########################################################################
+#
+# CFE-specific configuration options for OSAL
+#
+# This file specifies the CFE-specific values for various compile options
+# supported by OSAL.
+#
+# OSAL has many configuration options, which may vary depending on the
+# specific version of OSAL in use. The complete list of OSAL options,
+# along with a description of each, can be found OSAL source in the file:
+#
+# osal/default_config.cmake
+#
+# A CFE framework build utilizes mostly the OSAL default configuration.
+# This file only contains a few specific overrides that tune for a debug
+# environment, rather than a deployment environment.
+#
+# ALSO NOTE: There is also an arch-specific addendum to this file
+# to allow further tuning on a per-arch basis, in the form of:
+#
+# ${TOOLCHAIN_NAME}_osconfig.cmake
+#
+# See "native_osconfig.cmake" for options which apply only to "native" builds.
+#
+##########################################################################
+
+#
+# OSAL_CONFIG_DEBUG_PRINTF
+# ------------------------
+#
+# For CFE builds this can be helpful during debugging as it will display more
+# specific error messages for various OSAL error/warning events, such as if a
+# module cannot be loaded or a file cannot be opened for some reason.
+#
+set(OSAL_CONFIG_DEBUG_PRINTF TRUE)
+
+# The maximum number of mutexes to support
+set(OSAL_CONFIG_MAX_MUTEXES 40)
diff --git a/sample_defs/default_pspconfig.cmake b/sample_defs/default_pspconfig.cmake
new file mode 100644
index 000000000..3e67a5bed
--- /dev/null
+++ b/sample_defs/default_pspconfig.cmake
@@ -0,0 +1,51 @@
+####################################################################################
+#
+# Configuration options for PSP
+#
+# PSP has configuration options, which may vary depending on the
+# specific version of PSP in use. The complete list of PSP options,
+# along with a description of each, can be found PSP source in the file:
+#
+# psp/default_config.cmake
+#
+# A CFE framework build utilizes mostly the PSP default configuration.
+# This file contains a few specific overrides for the deployment environment.
+#
+# ALSO NOTE: These settings can be overriden based on a CPU-specific or
+# ARCH-specific version of this file by renaming this file "default_pspconfig.cmake"
+# in the form of:
+#
+# ${CPU_NAME}_pspconfig.cmake or ${TOOLCHAIN_NAME}_pspconfig.cmake
+#
+# NOTE: When the "default_pspconfig.cmake" file exists these options will
+# apply to all builds, regardless of cpuname or toolchain file being present.
+#
+####################################################################################
+
+#
+# PSP_CONFIG_DEBUG_PRINTF
+# ------------------------
+#
+# For CFE builds this can be helpful during debugging as it will display more
+# specific error messages for various PSP error/warning events, such as if a
+# module cannot be loaded or a file cannot be opened for some reason.
+#
+set(PSP_CONFIG_DEBUG_PRINTF FALSE)
+
+#
+# PSP_CONFIG_DEBUG_LEVEL
+# ----------------------------------
+#
+# When debug messages are enabled this seting controls the debug level.
+#
+set(PSP_CONFIG_DEBUG_LEVEL 1)
+
+#
+# PSP_CONFIG_CF_VIRTUAL_MAPPING
+# ----------------------------------
+#
+# For PSP builds this setting controls the virtual FS mapping for the
+# "/cf" directory. Changing this value will override the default mapping.
+#
+set(PSP_CONFIG_CF_VIRTUAL_MAPPING "./cf")
+
diff --git a/sample_defs/eds/cfe-topicids.xml b/sample_defs/eds/cfe-topicids.xml
new file mode 100644
index 000000000..b8a475b71
--- /dev/null
+++ b/sample_defs/eds/cfe-topicids.xml
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sample_defs/eds/config.xml b/sample_defs/eds/config.xml
new file mode 100644
index 000000000..8aae92e45
--- /dev/null
+++ b/sample_defs/eds/config.xml
@@ -0,0 +1,699 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ \cfeescfg Maximum Length of CDS Name
+
+ \par Description:
+ Indicates the maximum length (in characters) of the CDS name ('CDSName')
+ portion of a Full CDS Name of the following form:
+ "ApplicationName.CDSName"
+
+ This length does not need to include an extra character for NULL termination.
+
+ \par Limits
+ This value should be kept as a multiple of 4, to maintain alignment of
+ any possible neighboring fields without implicit padding.
+
+
+
+
+
+ \cfeevscfg Maximum Event Message Length
+
+ \par Description:
+ Indicates the maximum length (in characters) of the formatted text
+ string portion of an event message
+
+ This length does not need to include an extra character for NULL termination.
+
+ \par Limits
+ Not Applicable
+
+
+
+
+
+ \cfetblcfg Maximum Table Name Length
+
+ \par Description:
+ Indicates the maximum length (in characers) of the table name
+ ('TblName') portion of a Full Table Name of the following
+ form: "ApplicationName.TblName"
+
+ This length does not need to include an extra character for NULL termination.
+
+ \par Limits
+ This value should be kept as a multiple of 4, to maintain alignment of
+ any possible neighboring fields without implicit padding.
+
+
+
+
+
+ \cfeescfg Mission Max Apps in a message
+
+ \par Description:
+ Indicates the maximum number of apps in a telemetry housekeeping message
+
+ This affects the layout of command/telemetry messages but does not affect run
+ time behavior or internal allocation.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) must share the same definition
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+
+
+
+
+ \cfeescfg Define Max Number of Performance IDs for messages
+
+ \par Description:
+ Defines the maximum number of perf ids allowed in command/telemetry messages
+
+ This affects the layout of command/telemetry messages but does not affect run
+ time behavior or internal allocation.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) must share the same definition
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+
+
+
+
+ \cfeescfg Maximum number of block sizes in pool structures
+
+ \par Description:
+ The upper limit for the number of block sizes supported in the generic
+ pool implementation, which in turn implements the memory pools and CDS.
+ This definition is used as the array size with the pool stats structure,
+ and therefore should be consistent across all CPUs in a mission, as well
+ as with the ground station.
+
+ There is also a platform-specific limit which may be fewer than this
+ value.
+
+ \par Limits:
+ Must be at least one. No specific upper limit, but the number is
+ anticipated to be reasonably small (i.e. tens, not hundreds). Large
+ values have not been tested.
+
+
+
+
+
+ \cfetblcfg Maximum Length of Full Table Name in messages
+
+ \par Description:
+ Indicates the maximum length (in characters) of the entire table name
+ within software bus messages, in "AppName.TableName" notation.
+
+ This affects the layout of command/telemetry messages but does not affect run
+ time behavior or internal allocation.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) must share the same definition
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+ This value should be kept as a multiple of 4, to maintain alignment of
+ any possible neighboring fields without implicit padding.
+
+
+
+
+
+ \cfesbcfg Maximum Number of pipes that SB command/telemetry messages may hold
+
+ \par Description:
+ Dictates the maximum number of unique Pipes the SB message definitions will hold.
+
+ This affects the layout of command/telemetry messages but does not affect run
+ time behavior or internal allocation.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) must share the same definition
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+
+
+
+
+ \cfesbcfg Maximum Number of subscription entries per subscription report packet
+
+ \par Description:
+ The subscription report will group up to this number of entries into each TLM packet
+
+ \par Limits
+ Must not cause the size of the subscription report telemetry packet to exceed mission limits
+
+
+
+
+
+ \cfesbcfg Maximum SB Message Size
+
+ \par Description:
+ The following definition dictates the maximum message size allowed on
+ the software bus. SB checks the pkt length field in the header of all
+ messages sent. If the pkt length field indicates the message is larger
+ than this define, SB sends an event and rejects the send.
+
+ \par Limits
+ This parameter has a lower limit of 6 (CCSDS primary header size). There
+ are no restrictions on the upper limit however, the maximum message size is
+ system dependent and should be verified. Total message size values that are
+ checked against this configuration are defined by a 16 bit data word.
+
+
+
+
+
+
+
+ \cfetimecfg Default Time Format
+
+ \par Description:
+ The following definitions select either UTC or TAI as the default
+ (mission specific) time format. Although it is possible for an
+ application to request time in a specific format, most callers
+ should use CFE_TIME_GetTime(), which returns time in the default
+ format. This avoids having to modify each individual caller
+ when the default choice is changed.
+
+ \par Limits
+ if CFE_MISSION_TIME_CFG_DEFAULT_TAI is defined as true then CFE_MISSION_TIME_CFG_DEFAULT_UTC must be
+ defined as false.
+ if CFE_MISSION_TIME_CFG_DEFAULT_TAI is defined as false then CFE_MISSION_TIME_CFG_DEFAULT_UTC must be
+ defined as true.
+
+
+
+
+
+
+
+ \cfetimecfg Default Time Format
+
+ \par Description:
+ The following definition enables the use of a simulated time at
+ the tone signal using a software bus message.
+
+ \par Limits
+ Not Applicable
+
+
+
+
+
+
+ \cfetimecfg Default Time and Tone Order
+
+ \par Description:
+ Time Services may be configured to expect the time at the tone
+ data packet to either precede or follow the tone signal. If the
+ time at the tone data packet follows the tone signal, then the
+ data within the packet describes what the time "was" at the tone.
+ If the time at the tone data packet precedes the tone signal, then
+ the data within the packet describes what the time "will be" at
+ the tone. One, and only one, of the following symbols must be set to true:
+
+ - CFE_MISSION_TIME_AT_TONE_WAS
+ - CFE_MISSION_TIME_AT_TONE_WILL_BE
+
+ Note: If Time Services is defined as using a simulated tone signal
+ (see #CFE_MISSION_TIME_CFG_FAKE_TONE above), then the tone data packet
+ must follow the tone signal.
+
+ \par Limits
+ Either CFE_MISSION_TIME_AT_TONE_WAS or CFE_MISSION_TIME_AT_TONE_WILL_BE must be set to true.
+ They may not both be true and they may not both be false.
+
+
+
+
+
+
+
+ \cfetimecfg Min and Max Time Elapsed
+
+ \par Description:
+ Based on the definition of Time and Tone Order
+ (CFE_MISSION_TIME_AT_TONE_WAS/WILL_BE) either the "time at the tone" signal or
+ data packet will follow the other. This definition sets the valid window
+ of time for the second of the pair to lag behind the first. Time
+ Services will invalidate both the tone and packet if the second does not
+ arrive within this window following the first.
+
+ For example, if the data packet follows the tone, it might be valid for
+ the data packet to arrive between zero and 100,000 micro-seconds after
+ the tone. But, if the tone follows the packet, it might be valid
+ only if the packet arrived between 200,000 and 700,000 micro-seconds
+ before the tone.
+
+ Note: units are in micro-seconds
+
+ \par Limits
+ 0 to 999,999 decimal
+
+
+
+
+
+
+
+ \cfetimecfg Default Time Values
+
+ \par Description:
+ Default time values are provided to avoid problems due to time
+ calculations performed after startup but before commands can be
+ processed. For example, if the default time format is UTC then
+ it is important that the sum of MET and STCF always exceed the
+ value of Leap Seconds to prevent the UTC time calculation
+
+ (time = MET + STCF - Leap Seconds) from resulting in a negative
+ (very large) number.
+
+ Some past missions have also created known (albeit wrong) default
+ timestamps. For example, assume the epoch is defined as Jan 1, 1970
+ and further assume the default time values are set to create a timestamp
+ of Jan 1, 2000. Even though the year 2000 timestamps are wrong, it
+ may be of value to keep the time within some sort of bounds acceptable
+ to the software.
+
+ Note: Sub-second units are in micro-seconds (0 to 999,999) and
+ all values must be defined
+
+ \par Limits
+ Not Applicable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ \cfetimecfg Default EPOCH Values
+
+ \par Description:
+ Default ground time epoch values
+ Note: these values are used only by the CFE_TIME_Print() API function
+
+ \par Limits
+ Year - must be within 136 years
+ Day - Jan 1 = 1, Feb 1 = 32, etc.
+ Hour - 0 to 23
+ Minute - 0 to 59
+ Second - 0 to 59
+ Micros - 0 to 999999
+
+
+
+
+
+
+
+
+
+
+ \cfetimecfg Time File System Factor
+
+ \par Description:
+ Define the s/c vs file system time conversion constant...
+
+ Note: this value is intended for use only by CFE TIME API functions to
+ convert time values based on the ground system epoch (s/c time) to
+ and from time values based on the file system epoch (fs time).
+
+ FS time = S/C time + factor
+ S/C time = FS time - factor
+
+ Worksheet:
+
+ S/C epoch = Jan 1, 2005 (LRO ground system epoch)
+ FS epoch = Jan 1, 1980 (vxWorks DOS file system epoch)
+
+ Delta = 25 years, 0 days, 0 hours, 0 minutes, 0 seconds
+
+ Leap years = 1980, 1984, 1988, 1992, 1996, 2000, 2004
+ (divisible by 4 -- except if by 100 -- unless also by 400)
+
+ 1 year = 31,536,000 seconds
+ 1 day = 86,400 seconds
+ 1 hour = 3,600 seconds
+ 1 minute = 60 seconds
+
+ 25 years = 788,400,000 seconds
+ 7 extra leap days = 604,800 seconds
+
+ total delta = 789,004,800 seconds
+
+ \par Limits
+ Not Applicable
+
+
+
+
+
+ \cfeescfg Mission Default CRC algorithm
+
+ \par Description:
+ Indicates the which CRC algorithm should be used as the default
+ for verifying the contents of Critical Data Stores and when calculating
+ Table Image data integrity values.
+
+ \par Limits
+ Currently only CFE_MISSION_ES_CRC_16 is supported (see #CFE_MISSION_ES_CRC_16)
+
+
+
+
+
+
+ \cfemissioncfg cFE Maximum length for filenames within data exchange structures
+
+ \par Description:
+ The value of this constant dictates the size of filenames within all structures
+ used for external data exchange, such as Software bus messages and table definitions.
+ This is typically the same as OS_MAX_FILE_LEN but that is OSAL dependent --
+ and as such it definable on a per-processor/OS basis and hence may be different
+ across multiple processors. It is recommended to set this to the value of the
+ largest OS_MAX_FILE_LEN in use on any CPU on the mission.
+
+ This affects only the layout of command/telemetry messages and table definitions;
+ internal allocation may use the platform-specific OS_MAX_FILE_LEN value.
+
+ This length must include an extra character for NULL termination.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) and ground tools must share the
+ same definition.
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+ This value should be kept as a multiple of 4, to maintain alignment of
+ any possible neighboring fields without implicit padding.
+
+
+
+
+
+ \cfemissioncfg cFE Maximum length for pathnames within data exchange structures
+
+ \par Description:
+ The value of this constant dictates the size of pathnames within all structures
+ used for external data exchange, such as Software bus messages and table definitions.
+ This is typically the same as OS_MAX_PATH_LEN but that is OSAL dependent --
+ and as such it definable on a per-processor/OS basis and hence may be different
+ across multiple processors. It is recommended to set this to the value of the
+ largest OS_MAX_PATH_LEN in use on any CPU on the mission.
+
+ This affects only the layout of command/telemetry messages and table definitions;
+ internal allocation may use the platform-specific OS_MAX_PATH_LEN value.
+
+ This length must include an extra character for NULL termination.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) and ground tools must share the
+ same definition.
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+ This value should be kept as a multiple of 4, to maintain alignment of
+ any possible neighboring fields without implicit padding.
+
+
+
+
+
+ \cfemissioncfg cFE Maximum length for API names within data exchange structures
+
+ \par Description:
+ The value of this constant dictates the size of filenames within all structures
+ used for external data exchange, such as Software bus messages and table definitions.
+ This is typically the same as OS_MAX_API_LEN but that is OSAL dependent --
+ and as such it definable on a per-processor/OS basis and hence may be different
+ across multiple processors. It is recommended to set this to the value of the
+ largest OS_MAX_API_LEN in use on any CPU on the mission.
+
+ This affects only the layout of command/telemetry messages and table definitions;
+ internal allocation may use the platform-specific OS_MAX_API_LEN value.
+
+ This length must include an extra character for NULL termination.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) must share the same definition
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+ This value should be kept as a multiple of 4, to maintain alignment of
+ any possible neighboring fields without implicit padding.
+
+
+
+
+
+ \cfeescfg Maximum Length of Full CDS Name in messages
+
+ \par Description:
+ Indicates the maximum length (in characters) of the entire CDS name
+ of the following form: "ApplicationName.CDSName"
+
+ This affects the layout of command/telemetry messages but does not affect run
+ time behavior or internal allocation.
+
+ \par Limits
+ All CPUs within the same SB domain (mission) must share the same definition
+ Note this affects the size of messages, so it must not cause any message
+ to exceed the max length.
+
+ This value should be kept as a multiple of 4, to maintain alignment of
+ any possible neighboring fields without implicit padding.
+
+
+
+
+
+
+
+
diff --git a/sample_defs/global_build_options.cmake b/sample_defs/global_build_options.cmake
new file mode 100644
index 000000000..99a808e30
--- /dev/null
+++ b/sample_defs/global_build_options.cmake
@@ -0,0 +1,50 @@
+#
+# Example global_build_options.cmake
+# ----------------------------------
+#
+# This may set global definitions that apply to ALL targets in ALL scopes,
+# including FSW code that is cross-compiled for a target as well as code
+# built for the development host itself (native).
+#
+# As such, it should only invoke basic commands that have wide applicability,
+# such as "add_definitions()" for macro definitions that should be set
+# globally. It should not include any compiler-specific options that might
+# change between compiler vendors or target processor families.
+#
+
+# If the OMIT_DEPRECATED flag is specified, then define the respective macros
+# that omit the deprecated features from the build. This is conditional in this
+# example for CI purposes, so it can be tested both ways. Most projects would
+# likely set this only one way.
+set(OMIT_DEPRECATED $ENV{OMIT_DEPRECATED} CACHE STRING "Omit deprecated elements")
+if (OMIT_DEPRECATED)
+ message (STATUS "OMIT_DEPRECATED=true: Not including deprecated elements in build")
+ add_definitions(-DCFE_OMIT_DEPRECATED_6_8 -DCFE_OMIT_DEPRECATED_6_7 -DCFE_OMIT_DEPRECATED_6_6 -DOSAL_OMIT_DEPRECATED)
+ set(MISSION_RESOURCEID_MODE "STRICT") # more type safe, but less backward compatible
+else()
+ message (STATUS "OMIT_DEPRECATED=false: Deprecated elements included in build")
+ set(MISSION_RESOURCEID_MODE "SIMPLE") # less type safe, but more backward compatible
+endif (OMIT_DEPRECATED)
+
+# Address Sanitizer option. This enables the ASAN library that is available
+# in recent versions of GCC - although it may depend on additional packages being
+# installed, depending on development host OS/version.
+set(ENABLE_ASAN $ENV{ENABLE_ASAN} CACHE BOOL "Enable address sanitizer")
+if (ENABLE_ASAN)
+ add_compile_options(-fsanitize=address -fsanitize-recover=address)
+ add_link_options(-fsanitize=address)
+endif(ENABLE_ASAN)
+
+# The stringop/format truncation and overflow warnings tend to produce lots of false positives
+# CFE code is designed to handle/tolerate string truncation so it is generally not a real issue
+if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0.0)
+ add_compile_options(
+ -Wno-stringop-overflow
+ -Wno-stringop-truncation
+ -Wno-format-overflow
+ -Wno-format-truncation
+ )
+endif()
+
+# Include Global Headers
+include_directories(${MISSION_DEFS}/inc)
diff --git a/sample_defs/inc/global_core_api_base_msgid_values.h b/sample_defs/inc/global_core_api_base_msgid_values.h
new file mode 100644
index 000000000..74698b1e2
--- /dev/null
+++ b/sample_defs/inc/global_core_api_base_msgid_values.h
@@ -0,0 +1,39 @@
+/************************************************************************
+ * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes”
+ *
+ * Copyright (c) 2020 United States Government as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All Rights Reserved.
+ *
+ * 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 http://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.
+ ************************************************************************/
+
+/**
+ * @file
+ *
+ * This header file contains the platform-specific base msg ID values and
+ * logic to convert a topic ID to a message ID value.
+ *
+ */
+
+#ifndef GLOBAL_CFE_CORE_BASE_MSGID_VALUES_H
+#define GLOBAL_CFE_CORE_BASE_MSGID_VALUES_H
+
+#define SAMPLE_CPU1_CMD_MID_BASE 0x1800
+#define SAMPLE_CPU1_TLM_MID_BASE 0x0800
+
+#define SAMPLE_CPU2_CMD_MID_BASE 0x1900
+#define SAMPLE_CPU2_TLM_MID_BASE 0x0900
+
+#define SAMPLE_GLOBAL_CMD_MID_BASE 0x1860
+#define SAMPLE_GLOBAL_TLM_MID_BASE 0x0860
+
+#endif /* CFE_CORE_BASE_MSGIDS_H */
diff --git a/sample_defs/inc/global_sbn_topicids.h b/sample_defs/inc/global_sbn_topicids.h
new file mode 100644
index 000000000..736ea2dc4
--- /dev/null
+++ b/sample_defs/inc/global_sbn_topicids.h
@@ -0,0 +1,65 @@
+/*=======================================================================================
+** File Name: sbn_msgids.h
+**
+** Title:
+**
+** $Author: Steve Duran
+** $Revision: $
+** $Date: 2013-06-10
+**
+** Purpose:
+**
+** Modification History:
+** Date | Author | Description
+** ---------------------------
+** 2013-06-10 | Steve Duran | Build #: Code Started
+**
+**=====================================================================================*/
+
+#ifndef _GLOBAL_SBN_TOPICIDS_H_
+#define _GLOBAL_SBN_TOPICIDS_H_
+
+/*
+** Pragmas
+*/
+
+/*
+** Local Defines
+*/
+#define SBN_CMD_TOPICID (0xFA)
+
+#define SBN_HK_TLM_TOPICID (0xFB)
+#define SBN_HKNET_TLM_TOPICID (0xFC)
+#define SBN_HKPEER_TLM_TOPICID (0xFD)
+#define SBN_HKMYSUBS_TLM_TOPICID (0xFE)
+#define SBN_HKPEERSUBS_TLM_TOPICID (0xFF)
+
+/*
+** Include Files
+*/
+
+/*
+** Local Structure Declarations
+*/
+
+/*
+** External Global Variables
+*/
+
+/*
+** Global Variables
+*/
+
+/*
+** Local Variables
+*/
+
+/*
+** Local Function Prototypes
+*/
+
+#endif /* _GLOBAL_SBN_TOPICIDS_H_ */
+
+/*=======================================================================================
+** End of file sbn_msgids.h
+**=====================================================================================*/
diff --git a/sample_defs/mission_build_custom.cmake b/sample_defs/mission_build_custom.cmake
new file mode 100644
index 000000000..11279665e
--- /dev/null
+++ b/sample_defs/mission_build_custom.cmake
@@ -0,0 +1,37 @@
+#
+# Example mission_build_custom.cmake
+# ----------------------------------
+#
+# This file will be automatically included in the top level ("mission") build scope
+#
+# Definitions and options specified here will be used when building local tools and
+# other code that runs on the development host, but do _NOT_ apply to flight software
+# (embedded) code or anything built for the target machine.
+#
+# These options assume a GCC toolchain but a similar set should be applicable to clang.
+#
+add_compile_options(
+ -std=c99 # Target the C99 standard (without gcc extensions)
+ -pedantic # Issue all the warnings demanded by strict ISO C
+ -Wall # Warn about most questionable operations
+ -Wstrict-prototypes # Warn about missing prototypes
+ -Wwrite-strings # Warn if not treating string literals as "const"
+ -Wpointer-arith # Warn about suspicious pointer operations
+ -Wcast-align # Warn about casts that increase alignment requirements
+ -Werror # Treat warnings as errors (code should be clean)
+)
+
+# The _XOPEN_SOURCE directive is required for glibc to enable conformance with the
+# the X/Open standard version 6, which includes POSIX.1c as well as SUSv2/UNIX98 extensions.
+add_definitions(
+ -D_XOPEN_SOURCE=600
+)
+
+if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0.0)
+add_compile_options(
+ -Wno-stringop-overflow
+ -Wno-stringop-truncation
+ -Wno-format-overflow
+ -Wno-format-truncation
+)
+endif()
diff --git a/sample_defs/native_osconfig.cmake b/sample_defs/native_osconfig.cmake
new file mode 100644
index 000000000..9cc252707
--- /dev/null
+++ b/sample_defs/native_osconfig.cmake
@@ -0,0 +1,58 @@
+##########################################################################
+#
+# CPU/Arch-specific configuration options for OSAL
+#
+# This file specifies the CFE-specific values for various compile options
+# that are used only when compiling using a specific toolchain.
+#
+# OSAL has many configuration options, which may vary depending on the
+# specific version of OSAL in use. The complete list of OSAL options,
+# along with a description of each, can be found OSAL source in the file:
+#
+# osal/default_config.cmake
+#
+# This file is an addendum to the CFE-specific overrides that will be
+# used/enabled when building with the "SIMULATION=native" mode.
+#
+# See "default_osconfig.cmake" for options which apply only to all builds,
+# regardless of toolchain in use.
+#
+##########################################################################
+
+#
+# OSAL_CONFIG_DEBUG_PERMISSIVE_MODE
+# ---------------------------------
+#
+# When building with SIMULATION=native, enable the PERMISSIVE option,
+# which allows for easier testing. This option causes the OSAL to
+# continue through certain privileged operations (ignores errors) when
+# running as a standard/non-root user.
+#
+# Typically a regular user on a default Linux workstation configuration
+# would not have permission to create realtime priority threads or FIFO
+# queues deeper than the soft limit in /proc/sys/fs/mqueue/msg_max.
+#
+# Note that even with this enabled, OSAL will still _attempt_ to create
+# resources as requested, this only makes it so the overall request will
+# continue, regardless of whether the privileged operation succeeded or not.
+#
+set(OSAL_CONFIG_DEBUG_PERMISSIVE_MODE TRUE)
+
+
+#
+# OSAL_CONFIG_UTILITYTASK_PRIORITY
+# --------------------------------
+#
+# Elevate the priority level of the console output helper task
+#
+# By default OSAL uses a low-priority utility task to write
+# "OS_printf" messages in a deferred manner. However this deferred
+# write can potentially cause the messages to appear on the console
+# out of sync with the events they are related to.
+#
+# Raising the priority of this task from its default to be _higher_
+# than the CFE core tasks means that OS_printf() messages should
+# appear on the console in a timely manner, which helps during debug.
+# However for a flight deployment this may cause undesired delays.
+#
+set(OSAL_CONFIG_UTILITYTASK_PRIORITY 10)
diff --git a/sample_defs/native_pspconfig.cmake b/sample_defs/native_pspconfig.cmake
new file mode 100644
index 000000000..d4062c9f0
--- /dev/null
+++ b/sample_defs/native_pspconfig.cmake
@@ -0,0 +1,37 @@
+##########################################################################
+#
+# Configuration options for PSP
+#
+# PSP has configuration options, which may vary depending on the
+# specific version of PSP in use. The complete list of PSP options,
+# along with a description of each, can be found PSP source in the file:
+#
+# psp/default_config.cmake
+#
+# This file is an addendum to the CFE-specific overrides that will be
+# used/enabled when building with the "SIMULATION=native" mode.
+#
+# The "default_pspconfig.cmake" file options applies to all other builds,
+# regardless of toolchain in use.
+#
+##########################################################################
+
+
+#
+# PSP_CONFIG_DEBUG_PRINTF
+# ------------------------
+#
+# For CFE builds this can be helpful during debugging as it will display more
+# specific error messages for various PSP error/warning events, such as if a
+# module cannot be loaded or a file cannot be opened for some reason.
+#
+set(PSP_CONFIG_DEBUG_PRINTF FALSE)
+
+#
+# PSP_CONFIG_DEBUG_LEVEL
+# ----------------------------------
+#
+# When debug messages are enabled this seting controls the debug level.
+#
+set(PSP_CONFIG_DEBUG_LEVEL 1)
+
diff --git a/sample_defs/tables/sch_lab_table.c b/sample_defs/tables/sch_lab_table.c
new file mode 100644
index 000000000..1e74e1452
--- /dev/null
+++ b/sample_defs/tables/sch_lab_table.c
@@ -0,0 +1,93 @@
+/************************************************************************
+ * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes”
+ *
+ * Copyright (c) 2020 United States Government as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All Rights Reserved.
+ *
+ * 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 http://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.
+ ************************************************************************/
+
+#include "cfe_tbl_filedef.h" /* Required to obtain the CFE_TBL_FILEDEF macro definition */
+#include "sch_lab_tbl.h"
+#include "cfe_sb.h" /* Required to use the CFE_SB_MSGID_WRAP_VALUE macro */
+
+/*
+** Include headers for message IDs here
+*/
+#include "ci_lab_msgids.h"
+#include "to_lab_msgids.h"
+#include "sample_app_msgids.h"
+#include "cf_msgids.h"
+#include "hs_msgids.h"
+#include "md_msgids.h"
+#include "fm_msgids.h"
+#include "lc_msgids.h"
+#include "cs_msgids.h"
+#include "mm_msgids.h"
+#include "sc_msgids.h"
+#include "ds_msgids.h"
+#include "hk_msgids.h"
+
+#ifndef CFE_EDS_ENABLED
+#include "sbn_msgids.h"
+#include "sbn_msgdefs.h"
+#endif
+
+/*
+** SCH Lab schedule table
+** When populating this table:
+** 1. The entire table is processed (SCH_LAB_MAX_SCHEDULE_ENTRIES) but entries with a
+** packet rate of 0 are skipped
+** 2. You can have commented out entries or entries with a packet rate of 0
+** 3. If the table grows too big, increase SCH_LAB_MAX_SCHEDULE_ENTRIES
+*/
+
+/* clang-format: off */
+SCH_LAB_ScheduleTable_t SCH_TBL_Structure =
+{
+ .TickRate = 10,
+ .Config = {
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_ES_SEND_HK_MID), 40, 0}, /* every 4.0 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_EVS_SEND_HK_MID), 42, 0}, /* every 4.2 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_TIME_SEND_HK_MID), 44, 0}, /* every 4.4 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_SB_SEND_HK_MID), 46, 0}, /* every 4.6 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_TBL_SEND_HK_MID), 48, 0}, /* every 4.8 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CI_LAB_SEND_HK_MID), 50, 0}, /* every 5.0 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(TO_LAB_SEND_HK_MID), 52, 0}, /* every 5.2 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(SAMPLE_APP_SEND_HK_MID), 54, 0}, /* every 5.4 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CF_SEND_HK_MID), 56, 0}, /* every 5.6 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CF_WAKE_UP_MID), 1, 0}, /* every 0.1 seconds (example of 10 Hz packet) */
+ {CFE_SB_MSGID_WRAP_VALUE(MD_SEND_HK_MID), 58, 0}, /* every 5.8 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(HS_SEND_HK_MID), 60, 0}, /* every 6.0 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(SC_SEND_HK_MID), 62, 0}, /* every 6.2 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(SC_WAKEUP_MID), 10, 0}, /* every 1.0 seconds (example of 1 Hz packet) */
+ {CFE_SB_MSGID_WRAP_VALUE(FM_SEND_HK_MID), 66, 0}, /* every 6.6 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(DS_SEND_HK_MID), 68, 0}, /* every 6.8 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(LC_SEND_HK_MID), 70, 0}, /* every 7.0 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CS_SEND_HK_MID), 72, 0}, /* every 7.1 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(CS_BACKGROUND_CYCLE_MID), 5, 0}, /* every 0.5 seconds (example of 2 Hz packet) */
+ {CFE_SB_MSGID_WRAP_VALUE(MM_SEND_HK_MID), 74, 0}, /* every 7.4 seconds */
+ {CFE_SB_MSGID_WRAP_VALUE(HK_SEND_HK_MID), 76, 0}, /* every 7.6 seconds */
+#ifndef CFE_EDS_ENABLED
+ {CFE_SB_MSGID_WRAP_VALUE(SBN_CMD_MID), 46, SBN_HK_CC}, /* every 4.6 seconds (matching the SB) */
+#endif
+ }
+};
+
+/*
+** The macro below identifies:
+** 1) the data structure type to use as the table image format
+** 2) the name of the table to be placed into the cFE Table File Header
+** 3) a brief description of the contents of the file image
+** 4) the desired name of the table image binary file that is cFE compatible
+*/
+CFE_TBL_FILEDEF(SCH_TBL_Structure, SCH_LAB.Schedule, Schedule Lab MsgID Table, sch_lab_table.tbl)
diff --git a/sample_defs/tables/to_lab_sub.c b/sample_defs/tables/to_lab_sub.c
new file mode 100644
index 000000000..5937052fc
--- /dev/null
+++ b/sample_defs/tables/to_lab_sub.c
@@ -0,0 +1,107 @@
+/************************************************************************
+ * NASA Docket No. GSC-18,719-1, and identified as “core Flight System: Bootes”
+ *
+ * Copyright (c) 2020 United States Government as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All Rights Reserved.
+ *
+ * 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 http://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.
+ ************************************************************************/
+
+/**
+ * \file
+ * Define TO Lab CPU specific subscription table
+ */
+
+#include "cfe_tbl_filedef.h" /* Required to obtain the CFE_TBL_FILEDEF macro definition */
+#include "cfe_sb_api_typedefs.h"
+#include "to_lab_tbl.h"
+
+/*
+** Add the proper include file for the message IDs below
+*/
+
+/*
+** Common CFS app includes below are commented out
+*/
+#include "cfe_msgids.h"
+#include "to_lab_msgids.h"
+#include "ci_lab_msgids.h"
+
+#include "sample_app_msgids.h"
+#include "cf_msgids.h"
+#include "hs_msgids.h"
+#include "md_msgids.h"
+#include "fm_msgids.h"
+#include "lc_msgids.h"
+#include "cs_msgids.h"
+#include "mm_msgids.h"
+#include "sc_msgids.h"
+#include "ds_msgids.h"
+#include "hk_msgids.h"
+
+#ifndef CFE_EDS_ENABLED
+#include "sbn_msgids.h"
+#endif
+
+
+/* clang-format: off */
+TO_LAB_Subs_t TO_LAB_Subs =
+{
+ .Subs = {
+ /* CFS App Subscriptions */
+ {CFE_SB_MSGID_WRAP_VALUE(TO_LAB_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(TO_LAB_DATA_TYPES_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CI_LAB_HK_TLM_MID), {0, 0}, 1},
+
+ /* cFE Core subscriptions */
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_ES_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_EVS_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_SB_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_TBL_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_TIME_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_TIME_DIAG_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_SB_STATS_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_TBL_REG_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_EVS_LONG_EVENT_MSG_MID), {0, 0}, 16},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_ES_APP_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CFE_ES_MEMSTATS_TLM_MID), {0, 0}, 1},
+
+ /* Other CFS apps */
+ {CFE_SB_MSGID_WRAP_VALUE(SAMPLE_APP_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CF_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CF_EOT_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(MD_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(HS_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(HK_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(MM_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(SC_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(FM_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(FM_FILE_INFO_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(FM_DIR_LIST_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(FM_OPEN_FILES_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(FM_MONITOR_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(DS_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(LC_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(CS_HK_TLM_MID), {0, 0}, 1},
+#ifndef CFE_EDS_ENABLED
+ {CFE_SB_MSGID_WRAP_VALUE(SBN_HK_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(SBN_HKNET_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(SBN_HKPEER_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(SBN_HKMYSUBS_TLM_MID), {0, 0}, 1},
+ {CFE_SB_MSGID_WRAP_VALUE(SBN_HKPEERSUBS_TLM_MID), {0, 0}, 1},
+#endif
+ /* TO_UNUSED entry to mark the end of valid MsgIds */
+ {CFE_SB_MSGID_RESERVED, {0, 0}, 0}
+ }
+};
+
+CFE_TBL_FILEDEF(TO_LAB_Subs, TO_LAB.Subscriptions, TO Lab Sub Tbl, to_lab_sub.tbl)
diff --git a/sample_defs/targets.cmake b/sample_defs/targets.cmake
new file mode 100644
index 000000000..fd7c9e670
--- /dev/null
+++ b/sample_defs/targets.cmake
@@ -0,0 +1,142 @@
+######################################################################
+#
+# Master config file for cFS target boards
+#
+# This file indicates the architecture and configuration of the
+# target boards that will run core flight software.
+#
+# The following variables are defined per board, where
+# is a specific name within MISSION_CPUNAMES list:
+#
+# MISSION_CPUNAMES : list of user-friendly cpu names. Should be simple
+# words with no punctuation. This MUST be specified.
+# _PROCESSORID : numerical identifier for the processor
+# _APPLIST : list of applications to build and install on the CPU.
+# These are built as dynamically-loaded applications and installed
+# as files in the non-volatile storage of the target, and loaded
+# at runtime via the startup script or commands.
+# _STATIC_APPLIST : list of applications to build and statically
+# link with the CFE executable. This is similar to the "APPLIST"
+# except the application is built with STATIC linkage, and it is
+# included directly when linking the CFE core executable itself.
+# No separate application file is generated for these apps.
+# _STATIC_SYMLIST : list of symbols to include in the OSAL static
+# symbol lookup table. Each entry is a comma-separated pair containing
+# the symbol name and virtual module/app name, such as
+# My_C_Function_Name,MY_APP
+# The first item must be a publicly-exposed C symbol name available to
+# the linker at static link time, generally the entry point/main function
+# of the module or library (see STATIC_APPLIST). The second item is the
+# module name that should match the name used in the CFE startup script
+# (4th parameter).
+# IMPORTANT: For this to work, the OS_STATIC_LOADER configuration option
+# must be specified in the osconfig.h for that CPU.
+# _PSP_MODULELIST : additional PSP "modules" to link into the
+# CFE executable for this target. These can be device drivers or
+# other bits of modular PSP functionality that provide I/O or other
+# low level functions.
+# _FILELIST : list of extra files to copy onto the target. No
+# modifications of the file will be made. In order to differentiate
+# between different versions of files with the same name, priority
+# will be given to a file named _ to be installed
+# as simply on that cpu (prefix will be removed). These
+# files are intended to be copied to the non-volatile storage on the
+# target for use during runtime.
+# _EMBED_FILELIST : list of extra files which are to be converted
+# into data arrays and linked with/embedded into the CFE executable,
+# so the content of the files can be available at runtime on systems
+# that do not have run time non-volatile storage. The format of each
+# list entry is a comma-separated pair of variable and file name:
+# VARIABLE_NAME,FILE_NAME
+# The binary contents of the file will subsequently be available as:
+# extern const char VARIABLE_NAME_DATA[] and
+# extern const unsigned long VARIABLE_NAME_SIZE
+# The same prefix-based filename mapping as used on FILELIST is also
+# employed here, allowing CPU-specific data files to be used.
+# _SYSTEM : the toolchain to use for building all code. This
+# will map to a CMake toolchain file called "toolchain-"
+# If not specified then it will default to "cpu" so that
+# each CPU will have a dedicated toolchain file and no objects
+# will be shared across CPUs.
+# Otherwise any code built using the same toolchain may be
+# copied to multiple CPUs for more efficient builds.
+# _PLATFORM : configuration for the CFE core to use for this
+# cpu. This determines the cfe_platform_cfg.h to use during the
+# build. Multiple files/components may be concatenated together
+# allowing the config to be generated in a modular fashion. If
+# not specified then it will be assumed as "default ".
+#
+
+# The MISSION_NAME will be compiled into the target build data structure
+# as well as being passed to "git describe" to filter the tags when building
+# the version string.
+SET(MISSION_NAME "SampleMission")
+
+# SPACECRAFT_ID gets compiled into the build data structure and the PSP may use it.
+# should be an integer.
+SET(SPACECRAFT_ID 0x42)
+
+# The "MISSION_CORE_MODULES" will be built and statically linked as part
+# of the CFE core executable on every target. These can be used to amend
+# or override parts of the CFE core on a mission-specific basis.
+#list(APPEND MISSION_CORE_MODULES mymodule)
+
+# The "MISSION_GLOBAL_APPLIST" is a set of apps/libs that will be built
+# for every defined target. These are built as dynamic modules
+# and must be loaded explicitly via startup script or command.
+# This list is effectively appended to every TGTx_APPLIST in targets.cmake.
+# Example:
+list(APPEND MISSION_GLOBAL_APPLIST sample_app sample_lib)
+
+LIST(APPEND MISSION_GLOBAL_APPLIST cf)
+LIST(APPEND MISSION_GLOBAL_APPLIST hs)
+LIST(APPEND MISSION_GLOBAL_APPLIST md)
+LIST(APPEND MISSION_GLOBAL_APPLIST mm)
+LIST(APPEND MISSION_GLOBAL_APPLIST cs)
+LIST(APPEND MISSION_GLOBAL_APPLIST fm)
+LIST(APPEND MISSION_GLOBAL_APPLIST lc)
+LIST(APPEND MISSION_GLOBAL_APPLIST sc)
+LIST(APPEND MISSION_GLOBAL_APPLIST ds)
+LIST(APPEND MISSION_GLOBAL_APPLIST hk)
+
+# Some apps do not have EDS support yet.
+# These should not be included by default when building with EDS.
+if (NOT CFE_EDS_ENABLED)
+ LIST(APPEND MISSION_GLOBAL_APPLIST sbn)
+ LIST(APPEND MISSION_GLOBAL_APPLIST sbn_udp)
+ LIST(APPEND MISSION_GLOBAL_APPLIST sbn_f_remap)
+endif()
+
+# The "MISSION_GLOBAL_STATIC_APPLIST" is similar to MISSION_GLOBAL_APPLIST
+# but the apps are statically linked.
+# This list is effectively appended to every TGTx_STATIC_APPLIST in targets.cmake.
+# Example:
+# list(APPEND MISSION_GLOBAL_STATIC_APPLIST my_static_app)
+
+# FT_INSTALL_SUBDIR indicates where the black box test data files (lua scripts) should
+# be copied during the install process.
+SET(FT_INSTALL_SUBDIR "host/functional-test")
+
+# Each target board can have its own HW arch selection and set of included apps
+SET(MISSION_CPUNAMES cpu1 cpu2)
+
+# The "cpu1" is a contrived example of a main processor, running
+# all the CFS apps. RISCV-64 is selected as the platform
+# to line up with expectations of next-gen flight hardware.
+SET(cpu1_PROCESSORID 1)
+
+# This is the traditional CFE basic framework
+SET(cpu1_APPLIST ci_lab to_lab sch_lab)
+
+SET(cpu1_FILELIST cfe_es_startup.scr)
+SET(cpu1_SYSTEM riscv64-poky-linux)
+
+# The "cpu2" is a contrived example of a helper system,
+# using a big-endian processor by default. This emulates
+# a heterogeneous deployment where a big- and little-
+# endian processor must work together in the same system.
+SET(cpu2_PROCESSORID 2)
+SET(cpu2_APPLIST ci_lab to_lab sch_lab)
+
+SET(cpu2_FILELIST cfe_es_startup.scr)
+SET(cpu2_SYSTEM mips32r2-poky-linux)
diff --git a/sample_defs/toolchain-aarch64-vx7dkm.cmake b/sample_defs/toolchain-aarch64-vx7dkm.cmake
new file mode 100644
index 000000000..6bc41551a
--- /dev/null
+++ b/sample_defs/toolchain-aarch64-vx7dkm.cmake
@@ -0,0 +1,28 @@
+#
+# Cross compiler toolchain file for aarch64 Raspberry Pi 4 VxWorks 7 DKM mode
+#
+
+#
+# This toolchain should work for both the Public SDKs and the Licensed VIP/VSB projects
+# It does not currently work with a generated SDK from the licensed installation.
+#
+# The toolchain depends on one environment variable for the public SDKs and
+# a few environment variables for the licensed VSB/VIP projects.
+#
+# See the file toolchain-common-vx7dkm.cmake for information about the environment variables
+# needed.
+#
+
+set(VXWORKS_DKM TRUE)
+set(CMAKE_SYSTEM_NAME VxWorks-CFE)
+set(CMAKE_SYSTEM_VERSION 7)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+
+add_definitions("-D__aarch64__")
+add_definitions("-DVXSDK_RPI4")
+
+# Common VxWorks DKM system configuration
+include("${CMAKE_CURRENT_LIST_DIR}/toolchain-common-vx7dkm.cmake" REQUIRED)
+
+MESSAGE("Toolchain Selected: aarch64-vx7dkm")
+MESSAGE("CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
diff --git a/sample_defs/toolchain-aarch64-vx7rtp.cmake b/sample_defs/toolchain-aarch64-vx7rtp.cmake
new file mode 100644
index 000000000..4ed93b71d
--- /dev/null
+++ b/sample_defs/toolchain-aarch64-vx7rtp.cmake
@@ -0,0 +1,28 @@
+#
+# Cross compiler toolchain file for aarch64 Raspberry Pi 4 VxWorks 7 RTP
+#
+
+#
+# This toolchain should work for both the Public SDKs and the Licensed VIP/VSB projects
+# It does not currently work with a generated SDK from the licensed installation.
+#
+# The toolchain depends on one environment variable for the public SDKs and
+# a few environment variables for the licensed VSB/VIP projects.
+#
+# See the file toolchain-common-vx7rtp.cmake for information about the environment variables
+# needed.
+#
+
+set(VXWORKS_RTP TRUE)
+set(CMAKE_SYSTEM_NAME VxWorks-CFE)
+set(CMAKE_SYSTEM_VERSION 7)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+
+add_definitions("-D__aarch64__")
+add_definitions("-DVXSDK_RPI4")
+
+# Common VxWorks RTP system configuration
+include("${CMAKE_CURRENT_LIST_DIR}/toolchain-common-vx7rtp.cmake" REQUIRED)
+
+MESSAGE("Toolchain Selected: aarch64-vx7rtp")
+MESSAGE("CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
diff --git a/sample_defs/toolchain-aarch64le-qnx-gnu.cmake b/sample_defs/toolchain-aarch64le-qnx-gnu.cmake
new file mode 100644
index 000000000..808ec5e08
--- /dev/null
+++ b/sample_defs/toolchain-aarch64le-qnx-gnu.cmake
@@ -0,0 +1,21 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use the QNX cross compiler for the 64-bit ARM processor (such as the
+# ARM Cortex-A72 processor on the "raspberry pi 4" development board).
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME QNX)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR aarch64le)
+SET(QNX_SDP_ARCH ${CMAKE_SYSTEM_PROCESSOR})
+
+# Basic QNX system configuration
+include("${CMAKE_CURRENT_LIST_DIR}/toolchain-qnx-sdp-init.cmake" REQUIRED)
+
+# The QNX toolchain relies on several environment variables,
+# which should be set already by an environment setup script.
+MESSAGE("Toolchain Selected: aarch64le-qnx")
+MESSAGE("CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
+MESSAGE("QNX_CONFIGURATION = $ENV{QNX_CONFIGURATION}")
diff --git a/sample_defs/toolchain-arm-cortexa8_neon-linux-gnueabi.cmake b/sample_defs/toolchain-arm-cortexa8_neon-linux-gnueabi.cmake
new file mode 100644
index 000000000..7ddbf2ba6
--- /dev/null
+++ b/sample_defs/toolchain-arm-cortexa8_neon-linux-gnueabi.cmake
@@ -0,0 +1,33 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use a cross compiler for the TI AM3359 processor which is used on
+# the "beaglebone black" development board (this is an ARM Cortex-A8
+# processor). The GCC toolchain is named accordingly and assumed
+# to be installed in "/opt/x-tools".
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR arm)
+
+# adjust these settings to where the cross compiler actually resides
+SET(CMAKE_C_COMPILER "/opt/x-tools/arm-cortexa8_neon-linux-gnueabi/bin/arm-cortexa8_neon-linux-gnueabi-gcc")
+SET(CMAKE_CXX_COMPILER "/opt/x-tools/arm-cortexa8_neon-linux-gnueabi/bin/arm-cortexa8_neon-linux-gnueabi-g++")
+
+# where is the target environment
+SET(CMAKE_FIND_ROOT_PATH "/opt/x-tools/arm-cortexa8_neon-linux-gnueabi/arm-cortexa8_neon-linux-gnueabi/sysroot")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+# Note that "pc-linux" works fine even though this is not technically a "pc"
+SET(CFE_SYSTEM_PSPNAME "pc-linux")
+SET(OSAL_SYSTEM_OSTYPE "posix")
diff --git a/sample_defs/toolchain-arm-rpi-linux.cmake b/sample_defs/toolchain-arm-rpi-linux.cmake
new file mode 100644
index 000000000..c4751a3cb
--- /dev/null
+++ b/sample_defs/toolchain-arm-rpi-linux.cmake
@@ -0,0 +1,49 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# Note this is based on the vendor-supplied ARM cross compiler
+# downloadable from here:
+# https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
+
+# Basic cross system configuration
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR arm)
+set(CMAKE_SYSTEM_VERSION 1)
+
+set(XTOOL_BASE_DIR "/opt")
+
+# specify the cross compiler - adjust accord to compiler installation
+SET(TOOLCHAIN_VARIANT "arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-gnueabihf"
+ CACHE STRING "Specific compiler variant to use from the tools repo")
+
+SET(TOOLCHAIN_TOP "${XTOOL_BASE_DIR}/${TOOLCHAIN_VARIANT}"
+ CACHE PATH "Location of the ARM cross toolchain to use")
+
+set(SDKHOSTBINDIR "${TOOLCHAIN_TOP}/bin")
+set(SDKTARGETSYSROOT "${TOOLCHAIN_TOP}/arm-none-linux-gnueabihf/libc")
+set(TARGETPREFIX "arm-none-linux-gnueabihf-")
+
+SET(CMAKE_C_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}gcc")
+SET(CMAKE_CXX_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}g++")
+#SET(CMAKE_LINKER "${SDKHOSTBINDIR}/${TARGETPREFIX}ld")
+SET(CMAKE_ASM_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}as")
+SET(CMAKE_STRIP "${SDKHOSTBINDIR}/${TARGETPREFIX}strip")
+SET(CMAKE_NM "${SDKHOSTBINDIR}/${TARGETPREFIX}nm")
+SET(CMAKE_AR "${SDKHOSTBINDIR}/${TARGETPREFIX}ar")
+SET(CMAKE_OBJDUMP "${SDKHOSTBINDIR}/${TARGETPREFIX}objdump")
+SET(CMAKE_OBJCOPY "${SDKHOSTBINDIR}/${TARGETPREFIX}objcopy")
+
+SET(CMAKE_FIND_ROOT_PATH ${SDKTARGETSYSROOT})
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME pc-linux)
diff --git a/sample_defs/toolchain-armv7le-qnx-gnu.cmake b/sample_defs/toolchain-armv7le-qnx-gnu.cmake
new file mode 100644
index 000000000..0cfbd4316
--- /dev/null
+++ b/sample_defs/toolchain-armv7le-qnx-gnu.cmake
@@ -0,0 +1,20 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use the QNX cross compiler for the ARMv7 Little Endian processor.
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME QNX)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR armv7le)
+SET(QNX_SDP_ARCH ${CMAKE_SYSTEM_PROCESSOR})
+
+# Basic QNX system configuration
+include("${CMAKE_CURRENT_LIST_DIR}/toolchain-qnx-sdp-init.cmake" REQUIRED)
+
+# The QNX toolchain relies on several environment variables,
+# which should be set already by an environment setup script.
+MESSAGE("Toolchain Selected: armv7le-qnx")
+MESSAGE("CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
+MESSAGE("QNX_CONFIGURATION = $ENV{QNX_CONFIGURATION}")
diff --git a/sample_defs/toolchain-common-vx7dkm.cmake b/sample_defs/toolchain-common-vx7dkm.cmake
new file mode 100644
index 000000000..a0e006f01
--- /dev/null
+++ b/sample_defs/toolchain-common-vx7dkm.cmake
@@ -0,0 +1,124 @@
+# Common Toolchain file to build cFS for VxWorks 7 Downloadable Kernel Module (DKM) model.
+#
+# This toolchain file is included by an architecture specific file, such as:
+# toolchain-aarch64-vx7dkm.cmake
+# toolchain-x86_64-vx7dkm.cmake
+#
+# The toolchain files can be used with the VxWorks Public SDKs or the licensed installations.
+#
+# Building with a licensed VxWorks installation (using a VSB and VIP project)
+# ---------------------------------------------------------------------------------
+# Normally, VxWorks installations require running an environment setup script to use the tools.
+# These toolchain files are compatible with those setup scripts, but you can also build with
+# a reduced set of environment variables. It does not seem possible to eliminate the use of
+# all environment variables when building with the licensed installation. The compiler stub
+# depends on specific environment variables, and it seems to change over releases.
+#
+# Environment variables needed for licensed VxWorks VSB/VIP builds:
+#
+# WIND_HOME - Points to the base directory of the VxWorks installation
+# WIND_BASE - Points to the VxWorks operating system directory within the installation
+# WIND_HOST_TYPE - currently x86-linux2
+# WIND_VX7_HOST_TYPE - currently x86-linux2
+# WIND_CC_SYSROOT - Needs to point to the base directory of the VxWorks Source Build (VSB) project
+#
+# Example bash script (note that the '#' chars are not comments in the bash script):
+#
+# export WIND_HOME=/tools/WindRiver/23.09
+# export WIND_BASE=$WIND_HOME/vxworks/23.09
+# export WIND_HOST_TYPE=x86-linux2
+# export WIND_VX7_HOST_TYPE=x86_64-linux
+# export WIND_CC_SYSROOT=$HOME/workspace/aarch64-vsb
+#
+# In the above example, the first 4 environment variables should be consistent, and the
+# WIND_CC_SYSROOT will point to the VxWorks Source Build (VSB) project root.
+#
+# If you wish to run the VxWorks provided env setup, you can use a script like the following:
+#
+# Example bash script (note that the '#' chars are not comments in the bash script):
+#
+# WR_ROOT=/tools/WindRiver/23.09
+# eval `$WR_ROOT/wrenv.linux -p vxworks -o print_env -f sh`
+# export WIND_WORKSPACE=$HOME/workspace
+# export VSB_ROOT=$WIND_WORKSPACE/aarch64-vsb
+# export WIND_CC_SYSROOT=$VSB_ROOT
+#
+# Building with a VxWorks Public SDK
+# ---------------------------------------------------------------------------------
+# These toolchain files can also be used with the public SDKs provided by VxWorks.
+# In order to build with the public SDK, you can either run an edited setup script
+# or export a single environment variable. It is possible that this will
+# change with future versions of the Public SDK.
+#
+# WIND_SDK_HOME - Points to the base directory of the Public SDK directory
+#
+# Example bash script (note that the '#' chars are not comments in the bash script):
+#
+# export WIND_SDK_HOME=$HOME/Tools/wrsdk-vxworks7-raspberrypi4b
+#
+# For the public SDK, once the build system has been generated, the environment variable is not needed.
+#
+# If you want to use the sdkenv.sh script provided in the Public SDK instead of
+# setting up the above environment variable, you must first comment out the line:
+# "# export CC=wr-cc".
+# When CC is redefined in the sdkenv.sh script, it causes the cFE utility elf2cfetbl
+# build to fail.
+# ---------------------------------------------------------------------------------
+#
+if(DEFINED ENV{WIND_HOME})
+ # WIND_HOME refers to the top-level product installation directory of the licensed VxWorks product
+ set(WIND_HOME "$ENV{WIND_HOME}" CACHE PATH "VxWorks Install Directory")
+ set(WIND_BASE "$ENV{WIND_BASE}" CACHE PATH "VxWorks Operating System Directory")
+ set(WIND_CC_SYSROOT "$ENV{WIND_CC_SYSROOT}" CACHE PATH "VxWorks SYSROOT")
+ set(VXWORKS_TOOLS_PREFIX "${WIND_BASE}/host/x86_64-linux" CACHE PATH "VxWorks Tools Prefix")
+elseif(DEFINED ENV{WIND_SDK_HOME})
+ # WIND_SDK_HOME refers to the top-level installation directory of the public VxWorks SDK
+ set(WIND_HOME "$ENV{WIND_SDK_HOME}" CACHE PATH "VxWorks SDK Install Directory")
+ set(WIND_CC_SYSROOT "${WIND_HOME}/vxsdk/sysroot" CACHE PATH "VxWorks SYSROOT")
+ set(VXWORKS_TOOLS_PREFIX "${WIND_HOME}/vxsdk/host/x86_64-linux" CACHE PATH "VxWorks Tools Prefix")
+else()
+ MESSAGE(FATAL_ERROR "WIND_HOME or WIND_SDK_HOME environment variable is not set.")
+endif()
+
+SET(CFE_SYSTEM_PSPNAME "generic-vxworks-dkm")
+
+# Add architecture defs
+ADD_DEFINITIONS(-D_WRS_KERNEL)
+
+set(VX_TARGET_TYPE DKM)
+
+# specify the cross compiler - adjust accord to compiler installation
+# This uses the compiler-wrapper toolchain that buildroot produces
+SET(SDKHOSTBINDIR "${VXWORKS_TOOLS_PREFIX}/bin")
+set(TARGETSUFFIX "${CMAKE_SYSTEM_PROCESSOR}")
+set(VXWORKS_BSP_C_FLAGS "-dkm")
+set(VXWORKS_BSP_CXX_FLAGS "-dkm")
+
+# set C/C++ compiler
+set(CMAKE_C_COMPILER ${SDKHOSTBINDIR}/wr-cc${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_CXX_COMPILER ${SDKHOSTBINDIR}/wr-c++${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_AR ${SDKHOSTBINDIR}/wr-ar${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_NM ${SDKHOSTBINDIR}/wr-nm${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_RANLIB ${SDKHOSTBINDIR}/wr-ranlib${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_OBJCOPY ${SDKHOSTBINDIR}/wr-objcopy${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_LINKER ${SDKHOSTBINDIR}/wr-ld${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_OBJDUMP ${SDKHOSTBINDIR}/wr-objdump${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_READELF ${SDKHOSTBINDIR}/wr-readelf${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_STRIP ${SDKHOSTBINDIR}/wr-strip${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_SIZE ${SDKHOSTBINDIR}/wr-size${CMAKE_HOST_EXECUTABLE_SUFFIX})
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
+
+# set RTP build flags to compiler
+set(CMAKE_C_FLAGS_INIT "-dkm")
+
+include_directories(${WIND_HOME}/vxsdk/sysroot/krnl/h/public)
+include_directories(${WIND_HOME}/vxsdk/sysroot/krnl/h/published/UTILS_UNIX)
+include_directories(${WIND_HOME}/vxsdk/sysroot/share/h)
diff --git a/sample_defs/toolchain-common-vx7rtp.cmake b/sample_defs/toolchain-common-vx7rtp.cmake
new file mode 100644
index 000000000..1ba09b359
--- /dev/null
+++ b/sample_defs/toolchain-common-vx7rtp.cmake
@@ -0,0 +1,126 @@
+# Common Toolchain file to build cFS for VxWorks 7 RTP model.
+#
+# This toolchain file is included by an architecture specific file, such as:
+# toolchain-aarch64-vx7rtp.cmake
+# toolchain-x86_64-vx7rtp.cmake
+#
+# The toolchain files can be used with the VxWorks Public SDKs or the licensed installations.
+#
+# Building with a licensed VxWorks installation (using a VSB and VIP project)
+# ---------------------------------------------------------------------------------
+# Normally, VxWorks installations require running an environment setup script to use the tools.
+# These toolchain files are compatible with those setup scripts, but you can also build with
+# a reduced set of environment variables. It does not seem possible to eliminate the use of
+# all environment variables when building with the licensed installation. The compiler stub
+# depends on specific environment variables, and it seems to change over releases.
+#
+# Environment variables needed for licensed VxWorks VSB/VIP builds:
+#
+# WIND_HOME - Points to the base directory of the VxWorks installation
+# WIND_BASE - Points to the VxWorks operating system directory within the installation
+# WIND_HOST_TYPE - currently x86-linux2
+# WIND_VX7_HOST_TYPE - currently x86-linux2
+# WIND_CC_SYSROOT - Needs to point to the base directory of the VxWorks Source Build (VSB) project
+#
+# Example bash script (note that the '#' chars are not comments in the bash script):
+#
+# export WIND_HOME=/tools/WindRiver/23.09
+# export WIND_BASE=$WIND_HOME/vxworks/23.09
+# export WIND_HOST_TYPE=x86-linux2
+# export WIND_VX7_HOST_TYPE=x86_64-linux
+# export WIND_CC_SYSROOT=$HOME/workspace/aarch64-rpi-vsb
+#
+# In the above example, the first 4 environment variables should be consistent, and the
+# WIND_CC_SYSROOT will point to the VxWorks Source Build (VSB) project root.
+#
+# If you wish to run the VxWorks provided env setup, you can use a script like the following:
+#
+# Example bash script (note that the '#' chars are not comments in the bash script):
+#
+# WR_ROOT=/tools/WindRiver/23.09
+# eval `$WR_ROOT/wrenv.linux -p vxworks -o print_env -f sh`
+# export WIND_WORKSPACE=$HOME/workspace
+# export VSB_ROOT=$WIND_WORKSPACE/aarch64-rpi4-vsb
+# export WIND_CC_SYSROOT=$VSB_ROOT
+#
+# Building with a VxWorks Public SDK
+# ---------------------------------------------------------------------------------
+# These toolchain files can also be used with the public SDKs provided by VxWorks.
+# In order to build with the public SDK, you can either run an edited setup script
+# or export a single environment variable. It is possible that this will
+# change with future versions of the Public SDK.
+#
+# WIND_SDK_HOME - Points to the base directory of the Public SDK directory
+#
+# Example bash script (note that the '#' chars are not comments in the bash script):
+#
+# export WIND_SDK_HOME=$HOME/Tools/wrsdk-vxworks7-raspberrypi4b
+#
+# For the public SDK, once the build system has been generated, the environment variable is not needed.
+#
+# If you want to use the sdkenv.sh script provided in the Public SDK instead of
+# setting up the above environment variable, you must first comment out the line:
+# "# export CC=wr-cc".
+# When CC is redefined in the sdkenv.sh script, it causes the cFE utility elf2cfetbl
+# build to fail.
+# ---------------------------------------------------------------------------------
+#
+if(DEFINED ENV{WIND_HOME})
+ # WIND_HOME refers to the top-level product installation directory of the licensed VxWorks product
+ set(WIND_HOME "$ENV{WIND_HOME}" CACHE PATH "VxWorks Install Directory")
+ set(WIND_BASE "$ENV{WIND_BASE}" CACHE PATH "VxWorks Operating System Directory")
+ set(WIND_CC_SYSROOT "$ENV{WIND_CC_SYSROOT}" CACHE PATH "VxWorks SYSROOT")
+ set(VXWORKS_TOOLS_PREFIX "${WIND_BASE}/host/x86_64-linux" CACHE PATH "VxWorks Tools Prefix")
+elseif(DEFINED ENV{WIND_SDK_HOME})
+ # WIND_SDK_HOME refers to the top-level installation directory of the public VxWorks SDK
+ set(WIND_HOME "$ENV{WIND_SDK_HOME}" CACHE PATH "VxWorks SDK Install Directory")
+ set(WIND_CC_SYSROOT "${WIND_HOME}/vxsdk/sysroot" CACHE PATH "VxWorks SYSROOT")
+ set(VXWORKS_TOOLS_PREFIX "${WIND_HOME}/vxsdk/host/x86_64-linux" CACHE PATH "VxWorks Tools Prefix")
+else()
+ MESSAGE(FATAL_ERROR "WIND_HOME or WIND_SDK_HOME environment variable is not set.")
+endif()
+
+SET(CFE_SYSTEM_PSPNAME "generic-vxworks-rtp")
+
+# Add architecture defs
+add_definitions("-DVX7_RTP")
+add_definitions("-DVXWORKS_RTP")
+
+set(VX_TARGET_TYPE RTP)
+
+# specify the cross compiler - adjust accord to compiler installation
+# This uses the compiler-wrapper toolchain that buildroot produces
+SET(SDKHOSTBINDIR "${VXWORKS_TOOLS_PREFIX}/bin")
+set(TARGETSUFFIX "${CMAKE_SYSTEM_PROCESSOR}")
+set(VXWORKS_BSP_C_FLAGS "-rtp")
+
+# set C/C++ compiler
+set(CMAKE_C_COMPILER ${SDKHOSTBINDIR}/wr-cc${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_CXX_COMPILER ${SDKHOSTBINDIR}/wr-c++${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_AR ${SDKHOSTBINDIR}/wr-ar${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_NM ${SDKHOSTBINDIR}/wr-nm${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_RANLIB ${SDKHOSTBINDIR}/wr-ranlib${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_OBJCOPY ${SDKHOSTBINDIR}/wr-objcopy${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_LINKER ${SDKHOSTBINDIR}/wr-ld${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_OBJDUMP ${SDKHOSTBINDIR}/wr-objdump${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_READELF ${SDKHOSTBINDIR}/wr-readelf${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_STRIP ${SDKHOSTBINDIR}/wr-strip${CMAKE_HOST_EXECUTABLE_SUFFIX})
+set(CMAKE_SIZE ${SDKHOSTBINDIR}/wr-size${CMAKE_HOST_EXECUTABLE_SUFFIX})
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
+
+# set RTP build flags to compiler
+set(CMAKE_C_FLAGS_INIT "-rtp")
+
+include_directories(${WIND_HOME}/vxsdk/sysroot/usr/h/published/UTILS_UNIX)
+include_directories(${WIND_HOME}/vxsdk/sysroot/share/h)
+include_directories(${WIND_HOME}/vxsdk/sysroot/usr/h)
+include_directories(${WIND_HOME}/vxsdk/sysroot/usr/h/system)
+include_directories(${WIND_HOME}/vxsdk/sysroot/usr/h/public)
diff --git a/sample_defs/toolchain-i686-linux-clang.cmake b/sample_defs/toolchain-i686-linux-clang.cmake
new file mode 100644
index 000000000..7b7aa96f0
--- /dev/null
+++ b/sample_defs/toolchain-i686-linux-clang.cmake
@@ -0,0 +1,23 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR i686)
+
+# Specify the cross compiler executables
+# Typically these would be installed in a home directory or somewhere
+# in /opt. However in this example the system compiler is used.
+SET(CMAKE_C_COMPILER "/usr/bin/clang")
+SET(CMAKE_CXX_COMPILER "/usr/bin/clang++")
+
+# Configure the find commands
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
+
+# These variable settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME "pc-linux")
+SET(OSAL_SYSTEM_OSTYPE "posix")
diff --git a/sample_defs/toolchain-i686-linux-gnu.cmake b/sample_defs/toolchain-i686-linux-gnu.cmake
new file mode 100644
index 000000000..3046a3a34
--- /dev/null
+++ b/sample_defs/toolchain-i686-linux-gnu.cmake
@@ -0,0 +1,23 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR i686)
+
+# Specify the cross compiler executables
+# Typically these would be installed in a home directory or somewhere
+# in /opt. However in this example the system compiler is used.
+SET(CMAKE_C_COMPILER "/usr/bin/gcc")
+SET(CMAKE_CXX_COMPILER "/usr/bin/g++")
+
+# Configure the find commands
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
+
+# These variable settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME "pc-linux")
+SET(OSAL_SYSTEM_OSTYPE "posix")
diff --git a/sample_defs/toolchain-i686-rtems4.11.cmake b/sample_defs/toolchain-i686-rtems4.11.cmake
new file mode 100644
index 000000000..81084137d
--- /dev/null
+++ b/sample_defs/toolchain-i686-rtems4.11.cmake
@@ -0,0 +1,92 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use a compiler for the RTEMS operating system targeting the "pc686" BSP
+
+# Note that to use this, the "RTEMS" platform module may need to be added
+# to the system-wide CMake installation as a default CMake does not yet
+# recognize RTEMS as a system name. An example of this is distributed with
+# the pc-rtems PSP.
+
+# Basic cross system configuration
+set(CMAKE_SYSTEM_NAME RTEMS)
+set(CMAKE_SYSTEM_PROCESSOR i386)
+set(CMAKE_SYSTEM_VERSION 4.11)
+
+# The RTEMS BSP that will be used for this build
+set(RTEMS_BSP "pc686")
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME pc-rtems)
+SET(OSAL_SYSTEM_BSPTYPE generic-rtems)
+SET(OSAL_SYSTEM_OSTYPE rtems)
+
+# This is for version specific RTEMS ifdefs needed by the OSAL and PSP
+ADD_DEFINITIONS(-DOS_RTEMS_4_DEPRECATED)
+
+# RTEMS_DYNAMIC_LOAD definition:
+# - Set to FALSE for platforms that create a RTEMS executable and link it
+# to the cFE core.
+# - Set to TRUE for platforms that expect the cFE core to to be dynamically
+# loaded into an existing runtime image.
+# This is tied to the OSAL-BSP and PSP implementation so generally cannot
+# be switched on a specific OSAL/PSP platform without modifications.
+set(RTEMS_DYNAMIC_LOAD FALSE)
+
+set(RTEMS_BSP_C_FLAGS "-march=i686 -mtune=i686 -fno-common")
+set(RTEMS_BSP_CXX_FLAGS ${RTEMS_BSP_C_FLAGS})
+set(RTEMS_BSP_SPECS_FLAGS "-specs bsp_specs")
+
+# This define is deprecated and will be removed
+ADD_DEFINITIONS(-D_RTEMS_411_)
+
+# Info regarding the RELOCADDR:
+#+--------------------------------------------------------------------------+
+#| Set the value of RELOCADDR to the address where you want your image to
+#| load. If you'll be using GRUB to load the images it will have to be >=
+#| 0x100000 (1024K). If you are using NetBoot to load the images it can be
+#| >= 0x10000 (64K) AND <= 0x97C00 (607K) OR >= 0x100000 (1024K). The memory
+#| top is of course another limit. Make sure there is enough space before the
+#| upper memory limits for the image and the memory allocated by it to fit.
+#| Make sure the value you choose is aligned to 4 bytes.
+#+--------------------------------------------------------------------------+
+set(RTEMS_RELOCADDR 0x00100000)
+
+# Exception handling is very iffy. These two options disable eh_frame creation.
+set(CMAKE_C_COMPILE_OPTIONS_PIC -fno-exceptions -fno-asynchronous-unwind-tables)
+
+#+---------------------------------------------------------------------------+
+#| Common RTEMS toolchain statements
+#+---------------------------------------------------------------------------+
+# The TOOLS and BSP are allowed to be installed in different locations.
+# If the README was followed they will both be installed under $HOME
+# By default it is assumed the BSP is installed to the same directory as the tools
+SET(RTEMS_TOOLS_PREFIX "$ENV{HOME}/rtems-${CMAKE_SYSTEM_VERSION}" CACHE PATH
+ "RTEMS tools install directory")
+SET(RTEMS_BSP_PREFIX "${RTEMS_TOOLS_PREFIX}" CACHE PATH
+ "RTEMS BSP install directory")
+
+# specify the cross compiler - adjust accord to compiler installation
+SET(SDKHOSTBINDIR "${RTEMS_TOOLS_PREFIX}/bin")
+set(TARGETPREFIX "${CMAKE_SYSTEM_PROCESSOR}-rtems${CMAKE_SYSTEM_VERSION}-")
+
+SET(CMAKE_C_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}gcc")
+SET(CMAKE_CXX_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}g++")
+SET(CMAKE_LINKER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ld")
+SET(CMAKE_ASM_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}as")
+SET(CMAKE_STRIP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}strip")
+SET(CMAKE_NM "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}nm")
+SET(CMAKE_AR "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ar")
+SET(CMAKE_OBJDUMP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objdump")
+SET(CMAKE_OBJCOPY "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objcopy")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
diff --git a/sample_defs/toolchain-i686-rtems5.cmake b/sample_defs/toolchain-i686-rtems5.cmake
new file mode 100644
index 000000000..6ff40ce92
--- /dev/null
+++ b/sample_defs/toolchain-i686-rtems5.cmake
@@ -0,0 +1,96 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use a compiler for the RTEMS operating system targeting the "pc686" BSP
+
+# Note that to use this, the "RTEMS" platform module may need to be added
+# to the system-wide CMake installation as a default CMake does not yet
+# recognize RTEMS as a system name. An example of this is distributed with
+# the pc-rtems PSP.
+
+# Basic cross system configuration
+set(CMAKE_SYSTEM_NAME RTEMS)
+set(CMAKE_SYSTEM_PROCESSOR i386)
+set(CMAKE_SYSTEM_VERSION 5)
+
+# The RTEMS BSP that will be used for this build
+set(RTEMS_BSP "pc686")
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME pc-rtems)
+SET(OSAL_SYSTEM_BSPTYPE pc-rtems)
+SET(OSAL_SYSTEM_OSTYPE rtems)
+
+# This is for version specific RTEMS ifdefs needed by the OSAL and PSP
+ADD_DEFINITIONS(-DOS_RTEMS_5)
+
+# RTEMS_DYNAMIC_LOAD definition:
+# - Set to FALSE for platforms that create a RTEMS executable and link it
+# to the cFE core.
+# - Set to TRUE for platforms that expect the cFE core to to be dynamically
+# loaded into an existing runtime image.
+# This is tied to the OSAL-BSP and PSP implementation so generally cannot
+# be switched on a specific OSAL/PSP platform without modifications.
+set(RTEMS_DYNAMIC_LOAD FALSE)
+
+set(RTEMS_BSP_C_FLAGS "-march=i686 -mtune=i686 -fno-common")
+set(RTEMS_BSP_CXX_FLAGS ${RTEMS_BSP_C_FLAGS})
+set(RTEMS_BSP_SPECS_FLAGS "-specs bsp_specs")
+
+# This define is deprecated and will be removed
+ADD_DEFINITIONS(-D_RTEMS_5_)
+
+# Info regarding the RELOCADDR:
+#+--------------------------------------------------------------------------+
+#| Set the value of RELOCADDR to the address where you want your image to
+#| load. If you'll be using GRUB to load the images it will have to be >=
+#| 0x100000 (1024K). If you are using NetBoot to load the images it can be
+#| >= 0x10000 (64K) AND <= 0x97C00 (607K) OR >= 0x100000 (1024K). The memory
+#| top is of course another limit. Make sure there is enough space before the
+#| upper memory limits for the image and the memory allocated by it to fit.
+#| Make sure the value you choose is aligned to 4 bytes.
+#+--------------------------------------------------------------------------+
+set(RTEMS_RELOCADDR 0x00100000)
+
+# Exception handling is very iffy. These two options disable eh_frame creation.
+set(CMAKE_C_COMPILE_OPTIONS_PIC -fno-exceptions -fno-asynchronous-unwind-tables)
+
+# Link libraries needed for a RTEMS 5+ executable
+# This was handled by the bsp_specs file in 4.11
+set(LINK_LIBRARIES "-lrtemsdefaultconfig -lrtemsbsp -lrtemscpu")
+
+#+---------------------------------------------------------------------------+
+#| Common RTEMS toolchain statements
+#+---------------------------------------------------------------------------+
+# The TOOLS and BSP are allowed to be installed in different locations.
+# If the README was followed they will both be installed under $HOME
+# By default it is assumed the BSP is installed to the same directory as the tools
+SET(RTEMS_TOOLS_PREFIX "/opt/rtems-${CMAKE_SYSTEM_VERSION}" CACHE PATH
+ "RTEMS tools install directory")
+SET(RTEMS_BSP_PREFIX "${RTEMS_TOOLS_PREFIX}" CACHE PATH
+ "RTEMS BSP install directory")
+
+# specify the cross compiler - adjust accord to compiler installation
+SET(SDKHOSTBINDIR "${RTEMS_TOOLS_PREFIX}/bin")
+set(TARGETPREFIX "${CMAKE_SYSTEM_PROCESSOR}-rtems${CMAKE_SYSTEM_VERSION}-")
+
+SET(CMAKE_C_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}gcc")
+SET(CMAKE_CXX_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}g++")
+SET(CMAKE_LINKER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ld")
+SET(CMAKE_ASM_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}as")
+SET(CMAKE_STRIP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}strip")
+SET(CMAKE_NM "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}nm")
+SET(CMAKE_AR "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ar")
+SET(CMAKE_OBJDUMP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objdump")
+SET(CMAKE_OBJCOPY "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objcopy")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
diff --git a/sample_defs/toolchain-i686-rtems6.cmake b/sample_defs/toolchain-i686-rtems6.cmake
new file mode 100644
index 000000000..2ad607128
--- /dev/null
+++ b/sample_defs/toolchain-i686-rtems6.cmake
@@ -0,0 +1,93 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use a compiler for the RTEMS operating system targeting the "pc686" BSP
+
+# Note that to use this, the "RTEMS" platform module may need to be added
+# to the system-wide CMake installation as a default CMake does not yet
+# recognize RTEMS as a system name. An example of this is distributed with
+# the pc-rtems PSP.
+
+# Basic cross system configuration
+set(CMAKE_SYSTEM_NAME RTEMS)
+set(CMAKE_SYSTEM_PROCESSOR i386)
+set(CMAKE_SYSTEM_VERSION 6)
+
+# The RTEMS BSP that will be used for this build
+set(RTEMS_BSP "pc686")
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME pc-rtems)
+SET(OSAL_SYSTEM_BSPTYPE generic-rtems)
+SET(OSAL_SYSTEM_OSTYPE rtems)
+
+# This is for version specific RTEMS ifdefs needed by the OSAL and PSP
+ADD_DEFINITIONS(-DOS_RTEMS_6)
+
+# RTEMS_DYNAMIC_LOAD definition:
+# - Set to FALSE for platforms that create a RTEMS executable and link it
+# to the cFE core.
+# - Set to TRUE for platforms that expect the cFE core to to be dynamically
+# loaded into an existing runtime image.
+# This is tied to the OSAL-BSP and PSP implementation so generally cannot
+# be switched on a specific OSAL/PSP platform without modifications.
+set(RTEMS_DYNAMIC_LOAD FALSE)
+
+set(RTEMS_BSP_C_FLAGS "-march=i686 -mtune=i686 -fno-common")
+set(RTEMS_BSP_CXX_FLAGS ${RTEMS_BSP_C_FLAGS})
+set(RTEMS_BSP_SPECS_FLAGS "")
+
+# Info regarding the RELOCADDR:
+#+--------------------------------------------------------------------------+
+#| Set the value of RELOCADDR to the address where you want your image to
+#| load. If you'll be using GRUB to load the images it will have to be >=
+#| 0x100000 (1024K). If you are using NetBoot to load the images it can be
+#| >= 0x10000 (64K) AND <= 0x97C00 (607K) OR >= 0x100000 (1024K). The memory
+#| top is of course another limit. Make sure there is enough space before the
+#| upper memory limits for the image and the memory allocated by it to fit.
+#| Make sure the value you choose is aligned to 4 bytes.
+#+--------------------------------------------------------------------------+
+set(RTEMS_RELOCADDR 0x00100000)
+
+# Exception handling is very iffy. These two options disable eh_frame creation.
+set(CMAKE_C_COMPILE_OPTIONS_PIC -fno-exceptions -fno-asynchronous-unwind-tables)
+
+# Link libraries needed for a RTEMS 5+ executable
+# This was handled by the bsp_specs file in 4.11
+set(LINK_LIBRARIES "-lrtemsdefaultconfig -lrtemsbsp -lrtemscpu")
+
+#+---------------------------------------------------------------------------+
+#| Common RTEMS toolchain statements
+#+---------------------------------------------------------------------------+
+# The TOOLS and BSP are allowed to be installed in different locations.
+# If the README was followed they will both be installed under $HOME
+# By default it is assumed the BSP is installed to the same directory as the tools
+SET(RTEMS_TOOLS_PREFIX "/opt/rtems-${CMAKE_SYSTEM_VERSION}" CACHE PATH
+ "RTEMS tools install directory")
+SET(RTEMS_BSP_PREFIX "${RTEMS_TOOLS_PREFIX}" CACHE PATH
+ "RTEMS BSP install directory")
+
+# specify the cross compiler - adjust accord to compiler installation
+SET(SDKHOSTBINDIR "${RTEMS_TOOLS_PREFIX}/bin")
+set(TARGETPREFIX "${CMAKE_SYSTEM_PROCESSOR}-rtems${CMAKE_SYSTEM_VERSION}-")
+
+SET(CMAKE_C_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}gcc")
+SET(CMAKE_CXX_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}g++")
+SET(CMAKE_LINKER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ld")
+SET(CMAKE_ASM_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}as")
+SET(CMAKE_STRIP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}strip")
+SET(CMAKE_NM "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}nm")
+SET(CMAKE_AR "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ar")
+SET(CMAKE_OBJDUMP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objdump")
+SET(CMAKE_OBJCOPY "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objcopy")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
diff --git a/sample_defs/toolchain-leon3-gaisler-rtems5.cmake b/sample_defs/toolchain-leon3-gaisler-rtems5.cmake
new file mode 100644
index 000000000..06745a11a
--- /dev/null
+++ b/sample_defs/toolchain-leon3-gaisler-rtems5.cmake
@@ -0,0 +1,100 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use a compiler for the RTEMS operating system targeting the "pc686" BSP
+
+# Note that to use this, the "RTEMS" platform module may need to be added
+# to the system-wide CMake installation as a default CMake does not yet
+# recognize RTEMS as a system name. An example of this is distributed with
+# the pc-rtems PSP.
+
+# This specific toolchain example is based on the off the RCC 1.3.2 toolchain
+# from Gaisler. It can be downloaded from here:
+# https://download.gaisler.com/anonftp/rcc/rcc-1.3/1.3.2/
+
+# Basic cross system configuration
+set(CMAKE_SYSTEM_NAME RTEMS)
+set(CMAKE_SYSTEM_PROCESSOR sparc)
+set(CMAKE_SYSTEM_VERSION 5)
+
+# The BSP that will be used for this build
+set(RTEMS_BSP "leon3")
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME pc-rtems)
+SET(OSAL_SYSTEM_BSPTYPE generic-rtems)
+SET(OSAL_SYSTEM_OSTYPE rtems)
+
+# This is for version specific RTEMS ifdefs needed by the OSAL and PSP
+ADD_DEFINITIONS(-DOS_RTEMS_5)
+
+# RTEMS_DYNAMIC_LOAD definition:
+# - Set to FALSE for platforms that create a RTEMS executable and link it
+# to the cFE core.
+# - Set to TRUE for platforms that expect the cFE core to be dynamically
+# loaded into an existing runtime image.
+# This is tied to the OSAL-BSP and PSP implementation so generally cannot
+# be switched on a specific OSAL/PSP platform without modifications.
+set(RTEMS_DYNAMIC_LOAD TRUE)
+set(RTEMS_INCLUDE_TARFS TRUE)
+set(RTEMS_NO_CMDLINE TRUE)
+
+# Default to no shell (flight like and batch testing) but allow override from make line
+# Example: make TARGET=devboard RTEMS_NO_SHELL=FALSE install
+if (NOT DEFINED ENV{RTEMS_NO_SHELL})
+ set(RTEMS_NO_SHELL TRUE)
+else ()
+ set(RTEMS_NO_SHELL $ENV{RTEMS_NO_SHELL})
+endif ()
+
+# TODO Only remaining dependency is for network setup, switch to osal network config and remove
+if (RTEMS_INCLUDE_TARFS)
+ ADD_DEFINITIONS(-DRTEMS_INCLUDE_TARFS)
+endif ()
+
+set(RTEMS_BSP_C_FLAGS "-mcpu=leon3 -fno-common")
+set(RTEMS_BSP_CXX_FLAGS ${RTEMS_BSP_C_FLAGS})
+set(RTEMS_BSP_SPECS_FLAGS "-qbsp=leon3")
+
+# Exception handling is very iffy. These two options disable eh_frame creation.
+set(CMAKE_C_COMPILE_OPTIONS_PIC -fno-exceptions -fno-asynchronous-unwind-tables)
+
+set(XTOOL_BASE_DIR "/opt")
+
+# specify the cross compiler - adjust accord to compiler installation
+SET(TOOLCHAIN_VARIANT "rcc-1.3.2-gcc"
+ CACHE STRING "Specific compiler variant to use")
+
+SET(RTEMS_TOOLS_PREFIX "${XTOOL_BASE_DIR}/${TOOLCHAIN_VARIANT}"
+ CACHE PATH "Location of the RCC cross toolchain to use")
+
+#+---------------------------------------------------------------------------+
+#| Common RTEMS toolchain statements
+#+---------------------------------------------------------------------------+
+
+# specify the cross compiler - adjust accord to compiler installation
+# This uses the compiler-wrapper toolchain that buildroot produces
+SET(SDKHOSTBINDIR "${RTEMS_TOOLS_PREFIX}/bin")
+set(TARGETPREFIX "${CMAKE_SYSTEM_PROCESSOR}-gaisler-rtems${CMAKE_SYSTEM_VERSION}-")
+
+SET(CMAKE_C_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}gcc")
+SET(CMAKE_CXX_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}g++")
+SET(CMAKE_LINKER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ld")
+SET(CMAKE_ASM_COMPILER "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}as")
+SET(CMAKE_STRIP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}strip")
+SET(CMAKE_NM "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}nm")
+SET(CMAKE_AR "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}ar")
+SET(CMAKE_OBJDUMP "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objdump")
+SET(CMAKE_OBJCOPY "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}objcopy")
+SET(CMAKE_SIZE "${RTEMS_TOOLS_PREFIX}/bin/${TARGETPREFIX}size")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
diff --git a/sample_defs/toolchain-mips32r2-poky-linux.cmake b/sample_defs/toolchain-mips32r2-poky-linux.cmake
new file mode 100644
index 000000000..9cd1363ad
--- /dev/null
+++ b/sample_defs/toolchain-mips32r2-poky-linux.cmake
@@ -0,0 +1,49 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 5.0.12)
+SET(CMAKE_SYSTEM_PROCESSOR mips)
+SET(POKY_SYSROOT_ID mips32r2-poky-linux)
+
+SET(TOOLCHAIN_TOP "/opt/poky/${CMAKE_SYSTEM_VERSION}"
+ CACHE PATH "Installation directory for toolchain, as produced from SDK")
+
+# specify the cross compiler - adjust accord to compiler installation
+# This uses the compiler-wrapper toolchain that buildroot produces
+set(SDKTARGETSYSROOT "${TOOLCHAIN_TOP}/sysroots/${POKY_SYSROOT_ID}")
+set(SDKHOSTBINDIR "${TOOLCHAIN_TOP}/sysroots/x86_64-pokysdk-linux/usr/bin/${CMAKE_SYSTEM_PROCESSOR}-poky-linux")
+set(TARGETPREFIX "${CMAKE_SYSTEM_PROCESSOR}-poky-linux-")
+set(CPUTUNEFLAGS "-meb -mabi=32 -mhard-float -march=mips32r2")
+
+SET(CMAKE_C_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}gcc")
+SET(CMAKE_CXX_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}g++")
+SET(CMAKE_LINKER "${SDKHOSTBINDIR}/${TARGETPREFIX}ld")
+SET(CMAKE_ASM_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}as")
+SET(CMAKE_STRIP "${SDKHOSTBINDIR}/${TARGETPREFIX}strip")
+SET(CMAKE_NM "${SDKHOSTBINDIR}/${TARGETPREFIX}nm")
+SET(CMAKE_AR "${SDKHOSTBINDIR}/${TARGETPREFIX}ar")
+SET(CMAKE_OBJDUMP "${SDKHOSTBINDIR}/${TARGETPREFIX}objdump")
+SET(CMAKE_OBJCOPY "${SDKHOSTBINDIR}/${TARGETPREFIX}objcopy")
+
+# where is the target environment
+SET(CMAKE_FIND_ROOT_PATH "${SDKTARGETSYSROOT}")
+#SET(CMAKE_SYSROOT "${SDKTARGETSYSROOT}")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# these settings are specific to cFE/OSAL and determines
+# which abstraction layers are built when this toolchain is used
+SET(CFE_SYSTEM_PSPNAME pc-linux)
+
+SET(CMAKE_C_FLAGS_INIT "${CPUTUNEFLAGS} --sysroot=${SDKTARGETSYSROOT}"
+ CACHE STRING "C Flags required by platform")
+
+SET(CMAKE_CXX_FLAGS_INIT "${CPUTUNEFLAGS} --sysroot=${SDKTARGETSYSROOT}"
+ CACHE STRING "C Flags required by platform")
diff --git a/sample_defs/toolchain-powerpc-440_softfp-linux-gnu.cmake b/sample_defs/toolchain-powerpc-440_softfp-linux-gnu.cmake
new file mode 100644
index 000000000..0043aa391
--- /dev/null
+++ b/sample_defs/toolchain-powerpc-440_softfp-linux-gnu.cmake
@@ -0,0 +1,36 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use a cross compiler for the PowerPC 440 processor which is used on
+# the IBM "Bamboo" development board. The GCC toolchain is named
+# accordingly and assumed to be installed in "/opt/x-tools".
+
+# Basic cross system configuration
+SET(PPC440_BR_TOP "$ENV{PPC440_BR_TOP}"
+ CACHE PATH "Top directory for Linux buildroot filesystem project")
+
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR powerpc)
+
+# specify the cross compiler - adjust accord to compiler installation
+# This uses the compiler-wrapper toolchain that buildroot produces
+SET(CMAKE_C_COMPILER "${PPC440_BR_TOP}/host/usr/bin/powerpc-440_softfp-linux-gnu-gcc")
+SET(CMAKE_CXX_COMPILER "${PPC440_BR_TOP}/host/usr/bin/powerpc-440_softfp-linux-gnu-g++")
+
+# where is the target environment
+SET(CMAKE_FIND_ROOT_PATH "/opt/x-tools/powerpc-440_softfp-linux-gnu/powerpc-440_softfp-linux-gnu/sysroot"
+ "${PPC440_BR_TOP}/staging")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# these settings are specific to cFE/OSAL and determines
+# which abstraction layers are built when this toolchain is used
+SET(CFE_SYSTEM_PSPNAME pc-linux)
+SET(OSAL_SYSTEM_OSTYPE posix)
diff --git a/sample_defs/toolchain-ppc-vxworks6.9.cmake b/sample_defs/toolchain-ppc-vxworks6.9.cmake
new file mode 100644
index 000000000..8c879c485
--- /dev/null
+++ b/sample_defs/toolchain-ppc-vxworks6.9.cmake
@@ -0,0 +1,61 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# Basic cross system configuration
+set(CMAKE_SYSTEM_NAME VxWorks-CFE)
+set(CMAKE_SYSTEM_PROCESSOR ppc)
+set(CMAKE_SYSTEM_VERSION 6.9)
+set(VXWORKS_GCC_VERSION 4.3.3)
+set(VXWORKS_HOST_VERSION x86-linux2)
+
+# The VxWorks toolchain relies on several environment variables,
+# which should be set already by an environment setup script.
+
+# WIND_HOME refers to the top-level installation directory
+set(WIND_HOME_DFL "$ENV{WIND_HOME}")
+if(NOT WIND_HOME_DFL)
+ set(WIND_HOME_DFL "/opt/WindRiver")
+endif(NOT WIND_HOME_DFL)
+set(WIND_HOME "${WIND_HOME_DFL}" CACHE PATH "Wind River top level installation directory")
+
+# WIND_BASE refers to the system-specific installation directory (e.g. vxworks-)
+set(WIND_BASE_DFL "$ENV{WIND_BASE}")
+if(NOT WIND_BASE_DFL)
+ set(WIND_BASE_DFL "${WIND_HOME}/vxworks-${CMAKE_SYSTEM_VERSION}")
+endif(NOT WIND_BASE_DFL)
+set(WIND_BASE "${WIND_BASE_DFL}" CACHE PATH "Wind River product installation directory")
+
+set(VXWORKS_TOOLS_PREFIX "${WIND_HOME}/gnu/${VXWORKS_GCC_VERSION}-vxworks-${CMAKE_SYSTEM_VERSION}/${VXWORKS_HOST_VERSION}")
+
+
+# specify the cross compiler - adjust accord to compiler installation
+# This uses the compiler-wrapper toolchain that buildroot produces
+SET(SDKHOSTBINDIR "${VXWORKS_TOOLS_PREFIX}/bin")
+set(TARGETSUFFIX "${CMAKE_SYSTEM_PROCESSOR}")
+#set(VXWORKS_BSP_C_FLAGS "-march=i686 -mtune=i686 -fno-common")
+#set(VXWORKS_BSP_CXX_FLAGS ${VXWORKS_BSP_C_FLAGS})
+
+SET(CMAKE_C_COMPILER "${SDKHOSTBINDIR}/cc${TARGETSUFFIX}")
+SET(CMAKE_CXX_COMPILER "${SDKHOSTBINDIR}/c++${TARGETSUFFIX}")
+SET(CMAKE_LINKER "${SDKHOSTBINDIR}/ld${TARGETSUFFIX}")
+SET(CMAKE_ASM_COMPILER "${SDKHOSTBINDIR}/as${TARGETSUFFIX}")
+SET(CMAKE_AR "${SDKHOSTBINDIR}/ar${TARGETSUFFIX}")
+SET(CMAKE_OBJDUMP "${SDKHOSTBINDIR}/objdump${TARGETSUFFIX}")
+SET(CMAKE_RANLIB "${SDKHOSTBINDIR}/ranlib${TARGETSUFFIX}")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_PREFIX_PATH /)
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME mcp750-vxworks)
+
+include_directories(${WIND_BASE}/target/h/wrn/coreip)
+include_directories(${WIND_BASE}/target/h)
+
diff --git a/sample_defs/toolchain-qnx-sdp-init.cmake b/sample_defs/toolchain-qnx-sdp-init.cmake
new file mode 100644
index 000000000..7bf2fb117
--- /dev/null
+++ b/sample_defs/toolchain-qnx-sdp-init.cmake
@@ -0,0 +1,63 @@
+# This toolchain file describes the QNX SDP 7.10/8.0 environment
+
+# QNX_CONFIGURATION indicates that the QNX environment is setup
+set(QNX_CONFIG_ENV "$ENV{QNX_CONFIGURATION}")
+if(NOT QNX_CONFIG_ENV)
+ MESSAGE(FATAL_ERROR "The QNX environment variables are not present, the env setup script is required, i.e.: source qnxsdp-env.sh")
+endif(NOT QNX_CONFIG_ENV)
+set(QNX_SDP_HOST "$ENV{QNX_HOST}")
+set(QNX_SDP_TARGET "$ENV{QNX_TARGET}")
+set(QNX_SDP_BSP "$ENV{BSP_ROOT_DIR}")
+
+MESSAGE("QNX_CONFIG_ENV = ${QNX_CONFIG_ENV}")
+MESSAGE("QNX_SDP_HOST = ${QNX_SDP_HOST}")
+MESSAGE("QNX_SDP_TARGET = ${QNX_SDP_TARGET}")
+MESSAGE("QNX_SDP_BSP = ${QNX_SDP_BSP}")
+MESSAGE("QNX_SDP_ARCH = ${QNX_SDP_ARCH}")
+
+# adjust these settings to where the cross compiler actually resides
+SET(CMAKE_C_COMPILER "qcc")
+SET(CMAKE_CXX_COMPILER "q++")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
+
+# Dump QCC Predefined Macros
+execute_process(COMMAND ${CMAKE_C_COMPILER} -E -dM -xc /dev/null OUTPUT_VARIABLE QCC_PREDEFINED_MACROS)
+
+# Extract QNX Version
+string(REGEX MATCH "__QNX__ ([0-9]+)" _match "${QCC_PREDEFINED_MACROS}")
+set(QCC_QNX_VERSION ${CMAKE_MATCH_1})
+MESSAGE("QCC_QNX_VERSION = ${QCC_QNX_VERSION}")
+
+# Set SDP Version (setting a target property based on the extracted value)
+if (QCC_QNX_VERSION VERSION_GREATER_EQUAL 800)
+ set(QNX_SDP_VERSION 800)
+else()
+ set(QNX_SDP_VERSION 710)
+endif()
+
+MESSAGE("QNX_SDP_VERSION = ${QNX_SDP_VERSION}")
+
+# these settings are specific to cFE/OSAL and determines which
+# abstraction layers are built when using this toolchain
+SET(CFE_SYSTEM_PSPNAME "generic-qnx")
+SET(OSAL_SYSTEM_BSPTYPE "generic-qnx")
+SET(OSAL_SYSTEM_OSTYPE "qnx")
+
+# This is for version specific QNX ifdefs needed by the OSAL and PSP
+ADD_DEFINITIONS(-DQNX_SDP)
+
+# Set QNX flags for unit test coverage options
+set(UT_COVERAGE_COMPILE_FLAGS -pg -Wc,-fprofile-arcs,-ftest-coverage)
+set(UT_COVERAGE_LINK_FLAGS -pg -Wl,-lgcov)
+
+# Update CFLAGS and CXXFLAGS with QNX specific definitions
+set(CMAKE_C_FLAGS "-Vgcc_nto${QNX_SDP_ARCH} ${CMAKE_C_FLAGS}" CACHE STRING "Set C Compiler Flags (Select QNX GCC Arch)" FORCE)
+set(CMAKE_CXX_FLAGS "-Vgcc_nto${QNX_SDP_ARCH}_cxx ${CMAKE_CXX_FLAGS}" CACHE STRING "Set C++ Compiler Flags (Select QNX GCC Arch)" FORCE)
+
+include_directories(${QNX_SDP_TARGET}/usr/include)
diff --git a/sample_defs/toolchain-riscv64-poky-linux.cmake b/sample_defs/toolchain-riscv64-poky-linux.cmake
new file mode 100644
index 000000000..306a4a122
--- /dev/null
+++ b/sample_defs/toolchain-riscv64-poky-linux.cmake
@@ -0,0 +1,48 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME Linux)
+SET(CMAKE_SYSTEM_VERSION 5.0.12)
+SET(CMAKE_SYSTEM_PROCESSOR riscv64)
+SET(POKY_SYSROOT_ID riscv64-poky-linux)
+
+SET(TOOLCHAIN_TOP "/opt/poky/${CMAKE_SYSTEM_VERSION}"
+ CACHE PATH "Installation directory for toolchain, as produced from SDK")
+
+# specify the cross compiler - adjust accord to compiler installation
+# This uses the compiler-wrapper toolchain that buildroot produces
+set(SDKTARGETSYSROOT "${TOOLCHAIN_TOP}/sysroots/${POKY_SYSROOT_ID}")
+set(SDKHOSTBINDIR "${TOOLCHAIN_TOP}/sysroots/x86_64-pokysdk-linux/usr/bin/${CMAKE_SYSTEM_PROCESSOR}-poky-linux")
+set(TARGETPREFIX "${CMAKE_SYSTEM_PROCESSOR}-poky-linux-")
+set(CPUTUNEFLAGS "") # none for now
+
+SET(CMAKE_C_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}gcc")
+SET(CMAKE_CXX_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}g++")
+SET(CMAKE_LINKER "${SDKHOSTBINDIR}/${TARGETPREFIX}ld")
+SET(CMAKE_ASM_COMPILER "${SDKHOSTBINDIR}/${TARGETPREFIX}as")
+SET(CMAKE_STRIP "${SDKHOSTBINDIR}/${TARGETPREFIX}strip")
+SET(CMAKE_NM "${SDKHOSTBINDIR}/${TARGETPREFIX}nm")
+SET(CMAKE_AR "${SDKHOSTBINDIR}/${TARGETPREFIX}ar")
+SET(CMAKE_OBJDUMP "${SDKHOSTBINDIR}/${TARGETPREFIX}objdump")
+SET(CMAKE_OBJCOPY "${SDKHOSTBINDIR}/${TARGETPREFIX}objcopy")
+
+# where is the target environment
+SET(CMAKE_FIND_ROOT_PATH "${SDKTARGETSYSROOT}")
+
+# search for programs in the build host directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+# these settings are specific to cFE/OSAL and determines
+# which abstraction layers are built when this toolchain is used
+SET(CFE_SYSTEM_PSPNAME pc-linux)
+
+SET(CMAKE_C_FLAGS_INIT "${CPUTUNEFLAGS} --sysroot=${SDKTARGETSYSROOT}"
+ CACHE STRING "C Flags required by platform")
+
+SET(CMAKE_CXX_FLAGS_INIT "${CPUTUNEFLAGS} --sysroot=${SDKTARGETSYSROOT}"
+ CACHE STRING "C Flags required by platform")
diff --git a/sample_defs/toolchain-x86_64-qnx-gnu.cmake b/sample_defs/toolchain-x86_64-qnx-gnu.cmake
new file mode 100644
index 000000000..c3939b1d3
--- /dev/null
+++ b/sample_defs/toolchain-x86_64-qnx-gnu.cmake
@@ -0,0 +1,20 @@
+# This example toolchain file describes the cross compiler to use for
+# the target architecture indicated in the configuration file.
+
+# In this sample application, the cross toolchain is configured to
+# use the QNX cross compiler for the x86_64 processor (64-bit).
+
+# Basic cross system configuration
+SET(CMAKE_SYSTEM_NAME QNX)
+SET(CMAKE_SYSTEM_VERSION 1)
+SET(CMAKE_SYSTEM_PROCESSOR x86_64)
+SET(QNX_SDP_ARCH ${CMAKE_SYSTEM_PROCESSOR})
+
+# Basic QNX system configuration
+include("${CMAKE_CURRENT_LIST_DIR}/toolchain-qnx-sdp-init.cmake" REQUIRED)
+
+# The QNX toolchain relies on several environment variables,
+# which should be set already by an environment setup script.
+MESSAGE("Toolchain Selected: x86_64-qnx")
+MESSAGE("CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
+MESSAGE("QNX_CONFIGURATION = $ENV{QNX_CONFIGURATION}")
diff --git a/sample_defs/toolchain-x86_64-vx7dkm.cmake b/sample_defs/toolchain-x86_64-vx7dkm.cmake
new file mode 100644
index 000000000..76b3e4f69
--- /dev/null
+++ b/sample_defs/toolchain-x86_64-vx7dkm.cmake
@@ -0,0 +1,28 @@
+#
+# Cross compiler toolchain file for x86_64 QEMU VxWorks 7 DKM Mode
+#
+
+#
+# This toolchain should work for both the Public SDKs and the Licensed VIP/VSB projects
+# It does not currently work with a generated SDK from the licensed installation.
+#
+# The toolchain depends on one environment variable for the public SDKs and
+# a few environment variables for the licensed VSB/VIP projects.
+#
+# See the file toolchain-common-vx7rtp.cmake for information about the environment variables
+# needed.
+#
+
+set(VXWORKS_DKM TRUE)
+set(CMAKE_SYSTEM_NAME VxWorks-CFE)
+set(CMAKE_SYSTEM_VERSION 7)
+set(CMAKE_SYSTEM_PROCESSOR x86_64)
+
+add_definitions("-D__x86_64__")
+add_definitions("-DX86QEMU")
+
+# Common VxWorks DKM system configuration
+include("${CMAKE_CURRENT_LIST_DIR}/toolchain-common-vx7dkm.cmake" REQUIRED)
+
+MESSAGE("Toolchain Selected: x86_64-vx7dkm")
+MESSAGE("CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
diff --git a/sample_defs/toolchain-x86_64-vx7rtp.cmake b/sample_defs/toolchain-x86_64-vx7rtp.cmake
new file mode 100644
index 000000000..dccef0bad
--- /dev/null
+++ b/sample_defs/toolchain-x86_64-vx7rtp.cmake
@@ -0,0 +1,28 @@
+#
+# Cross compiler toolchain file for x86_64 QEMU VxWorks 7 RTP
+#
+
+#
+# This toolchain should work for both the Public SDKs and the Licensed VIP/VSB projects
+# It does not currently work with a generated SDK from the licensed installation.
+#
+# The toolchain depends on one environment variable for the public SDKs and
+# a few environment variables for the licensed VSB/VIP projects.
+#
+# See the file toolchain-common-vx7rtp.cmake for information about the environment variables
+# needed.
+#
+
+set(VXWORKS_RTP TRUE)
+set(CMAKE_SYSTEM_NAME VxWorks-CFE)
+set(CMAKE_SYSTEM_VERSION 7)
+set(CMAKE_SYSTEM_PROCESSOR x86_64)
+
+add_definitions("-D__x86_64__")
+add_definitions("-DX86QEMU")
+
+# Common VxWorks RTP system configuration
+include("${CMAKE_CURRENT_LIST_DIR}/toolchain-common-vx7rtp.cmake" REQUIRED)
+
+MESSAGE("Toolchain Selected: x86_64-vx7rtp")
+MESSAGE("CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}")
diff --git a/simple.mk b/simple.mk
new file mode 120000
index 000000000..57e207e77
--- /dev/null
+++ b/simple.mk
@@ -0,0 +1 @@
+./cfe/cmake/Makefile.sample
\ No newline at end of file
diff --git a/simple_defs b/simple_defs
new file mode 120000
index 000000000..4d73bdcdf
--- /dev/null
+++ b/simple_defs
@@ -0,0 +1 @@
+cfe/cmake/sample_defs
\ No newline at end of file
diff --git a/target-configs.mk b/target-configs.mk
new file mode 100644
index 000000000..e278e5d78
--- /dev/null
+++ b/target-configs.mk
@@ -0,0 +1,120 @@
+#
+# Core Flight Software CMake / GNU make wrapper
+#
+# ABOUT THIS MAKEFILE:
+# This defines the configuration targets for the multi-target build
+# It is moved to a separate file to isolate this from the other logic
+#
+# This should reside in the same top-level directory as the main Makefile
+#
+
+
+# The config names is a complete list of configurations to build
+CONFIG_NAMES := native_std native_eds
+CONFIG_NAMES += pc686_rtems5 gr712_rtems5
+CONFIG_NAMES += rpi_vxworks7 rpi_linux
+CONFIG_NAMES += qemu_yocto_linux
+CONFIG_NAMES += osal edslib
+
+# The CFS config names is a subset of the CONFIG_NAMES which use CFS
+# Being in this list means the standard set of CFS options are applied
+NONCFS_CONFIG_NAMES := osal edslib
+CFS_CONFIG_NAMES := $(filter-out $(NONCFS_CONFIG_NAMES),$(CONFIG_NAMES))
+
+# Define the output dir (O) for each target group
+# this is required for everything listed in CONFIG_NAMES
+
+O_native_std = build-native_std
+O_native_eds = build-native_eds
+O_pc686_rtems5 = build-pc686_rtems5
+O_gr712_rtems5 = build-gr712_rtems5
+O_rpi_vxworks7 = build-rpi_vxworks7
+O_rpi_linux = build-rpi_linux
+O_qemu_yocto_linux = build-qemu_yocto_linux
+O_osal = build-osal
+O_edslib = build-edslib
+
+# Define the ARCH used for each target group
+# this is required for everything listed in CFS_CONFIG_NAMES
+ARCH_native_std = native
+ARCH_native_eds = native
+ARCH_pc686_rtems5 = i686-rtems5
+ARCH_gr712_rtems5 = leon3-gaisler-rtems5
+ARCH_rpi_vxworks7 = arm-rpi-vxworks7
+ARCH_rpi_linux = arm-rpi-linux
+ARCH_qemu_yocto_linux = riscv64-poky-linux
+
+# Define extra prep options for each target group
+
+##############
+# Native build (traditional standard development config)
+##############
+PREP_OPTS_native_std += -DENABLE_UNIT_TESTS=TRUE
+PREP_OPTS_native_std += -DSIMULATION=$(ARCH)
+PREP_OPTS_native_std += -DCFE_EDS_ENABLED=OFF
+PREP_OPTS_native_std += -DMISSIONCONFIG=sample
+PREP_OPTS_native_std += -DCMAKE_BUILD_TYPE=debug
+PLATFORM_native_std = default_cpu1
+
+##############
+# EDS build
+##############
+PREP_OPTS_native_eds += -DENABLE_UNIT_TESTS=TRUE
+PREP_OPTS_native_eds += -DSIMULATION=$(ARCH)
+PREP_OPTS_native_eds += -DCFE_EDS_ENABLED=ON
+PREP_OPTS_native_eds += -DEDSLIB_PYTHON_BUILD_STANDALONE_MODULE=ON
+PREP_OPTS_native_eds += -DCFE_MISSIONLIB_PYTHON_BUILD_STANDALONE_MODULE=ON
+PREP_OPTS_native_eds += -DMISSIONCONFIG=sample
+PREP_OPTS_native_eds += -DCMAKE_BUILD_TYPE=debug
+PLATFORM_native_eds = default_cpu1
+
+##############
+# RTEMS builds
+##############
+PREP_OPTS_pc686_rtems5 += -DENABLE_UNIT_TESTS=TRUE
+PREP_OPTS_pc686_rtems5 += -DSIMULATION=$(ARCH)
+PREP_OPTS_pc686_rtems5 += -DMISSIONCONFIG=sample
+PREP_OPTS_pc686_rtems5 += -DCMAKE_BUILD_TYPE=debug
+PLATFORM_pc686_rtems5 = default_cpu1
+PREP_OPTS_gr712_rtems5 += -DSIMULATION=$(ARCH)
+PREP_OPTS_gr712_rtems5 += -DMISSIONCONFIG=sample
+PREP_OPTS_gr712_rtems5 += -DCMAKE_BUILD_TYPE=release
+PLATFORM_gr712_rtems5 = default_cpu1
+
+##############
+# RPi builds
+##############
+PREP_OPTS_rpi_vxworks7 += -DENABLE_UNIT_TESTS=TRUE
+PREP_OPTS_rpi_vxworks7 += -DSIMULATION=$(ARCH)
+PREP_OPTS_rpi_vxworks7 += -DMISSIONCONFIG=sample
+PREP_OPTS_rpi_vxworks7 += -DCMAKE_BUILD_TYPE=release
+PLATFORM_rpi_vxworks7 = default_cpu1
+PREP_OPTS_rpi_linux += -DSIMULATION=$(ARCH)
+PREP_OPTS_rpi_linux += -DMISSIONCONFIG=sample
+PREP_OPTS_rpi_linux += -DCMAKE_BUILD_TYPE=release
+PLATFORM_rpi_linux = default_cpu1
+
+##############
+# Flight-like build (embedded yocto linux targets)
+##############
+PREP_OPTS_qemu_yocto_linux += -DMISSIONCONFIG=sample
+PREP_OPTS_qemu_yocto_linux += -DCMAKE_BUILD_TYPE=release
+PLATFORM_qemu_yocto_linux = default_cpu1
+
+##############
+# Standalone OSAL
+##############
+PREP_OPTS_osal += -DENABLE_UNIT_TESTS=TRUE
+PREP_OPTS_osal += -DOSAL_OMIT_DEPRECATED=TRUE
+PREP_OPTS_osal += -DOSAL_SYSTEM_BSPTYPE=generic-linux
+PREP_OPTS_osal += -DOSAL_CONFIG_DEBUG_PERMISSIVE_MODE=on
+PREP_OPTS_osal += -DOSAL_VALIDATE_API=on
+PREP_OPTS_osal += -DOSAL_USER_C_FLAGS='-Wall -Werror'
+PREP_OPTS_osal += -S "$(CURDIR)/osal"
+
+##############
+# Standalone Edslib
+##############
+PREP_OPTS_edslib += -DENABLE_UNIT_TESTS=TRUE
+PREP_OPTS_edslib += -DCMAKE_PREFIX_PATH=$(HOME)/code/local/lib/cmake
+PREP_OPTS_edslib += -S "$(CURDIR)/tools/eds"
diff --git a/target-rules.mk b/target-rules.mk
new file mode 100644
index 000000000..85a413a39
--- /dev/null
+++ b/target-rules.mk
@@ -0,0 +1,125 @@
+#
+# Core Flight Software CMake / GNU make wrapper
+#
+# ABOUT THIS MAKEFILE:
+# This is a helper makefile to execute the build for a single config
+# It should not be invoked directly, it is invoked from the main Makefile
+#
+
+include goal-configs.mk
+
+O ?= $(O_$(CFG))
+ARCH ?= $(ARCH_$(CFG))
+PREP_OPTS ?= $(PREP_OPTS_$(CFG))
+PLATFORM ?= $(PLATFORM_$(CFG))
+CPUNAME ?= $(CPUNAME_$(CFG))
+BUILDTYPE ?= $(BUILDTYPE_$(CFG))
+
+DESTDIR ?= $(CURDIR)/$(O)
+
+# Fallback/Default values for variables
+# Note that the above may have defined a variable to be the empty string,
+# so this needs to check for empty string and cannot use ?=
+ifeq ($(PLATFORM),)
+PLATFORM := default
+endif
+ifeq ($(CPUNAME),)
+CPUNAME := cpu1
+endif
+ifeq ($(BUILDTYPE),)
+BUILDTYPE := debug
+endif
+
+$(ALL_TARGETS): PREP_OPTS += -DCMAKE_EXPORT_COMPILE_COMMANDS=TRUE
+$(ALL_TARGETS): PREP_OPTS += -DCMAKE_BUILD_TYPE=$(BUILDTYPE)
+
+$(CFS_TARGETS): PREP_OPTS += -S "$(CURDIR)/cfe"
+$(CFS_TARGETS): PREP_OPTS += -DCMAKE_INSTALL_PREFIX=/exe
+$(CFS_TARGETS): SUBTGT_PREFIX ?= mission-
+$(CFS_TARGETS): TEST_SUBDIR = $(ARCH)/$(PLATFORM)
+
+export O
+export ARCH
+export PLATFORM
+export CPUNAME
+
+# A generic pattern rule to invoke CMake for the "prep" (makefile generation) step
+%/stamp.prep:
+ mkdir -p "$(O)"
+ cmake $(PREP_OPTS) -B "$(O)" $(PREP_SOURCE_DIR)
+ echo '$(PREP_OPTS)' > "$(@)"
+
+# A generic pattern rule to invoke a sub-make for the appliction compile only
+%/stamp.compile: %/stamp.prep
+ $(MAKE) --no-print-directory -C "$(O)" $(SUBTGT_PREFIX)all
+ touch "$(@)"
+
+# A generic pattern rule to invoke a sub-make for the appliction build/install to staging area
+%/stamp.install: %/stamp.prep
+ $(MAKE) --no-print-directory -C "$(O)" DESTDIR="$(DESTDIR)" $(SUBTGT_PREFIX)install
+ touch "$(@)"
+
+# custom-rules.mk should add dependencies to stamp.image and define the rules for building them
+%/stamp.image: %/stamp.install
+ touch "$(@)"
+
+# Check which tests exist
+# Extract the list of tests and associated commands from JSON
+%/stamp.checktest: %/stamp.install
+ (cd $(O)/$(TEST_SUBDIR) && ctest --show-only=json-v1) > "$(O)/test-list.json.tmp1"
+ jq '[.tests[] | { "name":.name, "command":.command[0], "workdir":(.properties[] | if .name == "WORKING_DIRECTORY" then .value else empty end) } ]' \
+ "$(O)/test-list.json.tmp1" > "$(O)/test-list.json.tmp2"
+ rm -f "$(O)/test-list.json.tmp1"
+ mv -v "$(O)/test-list.json.tmp2" "$(O)/test-list.json"
+ touch "$(@)"
+
+# A generic pattern rule to invoke a sub-make for running tests
+%/stamp.runtest: %/stamp.checktest
+ mkdir -p "$(O)/test-results"
+ jq -r '.[] | if .workdir then "$(O)/test-results/" + .name + ".log: WORKDIR=" + .workdir else empty end' "$(O)/test-list.json" > "$(O)/test-deps.mk.tmp"
+ jq -r '.[] | if .command then "$(O)/test-results/" + .name + ".log: " + .command else empty end' "$(O)/test-list.json" >> "$(O)/test-deps.mk.tmp"
+ jq -r '.[] | "TEST_OUTPUT_FILES += $(O)/test-results/" + .name + ".log"' "$(O)/test-list.json" >> "$(O)/test-deps.mk.tmp"
+ mv -v "$(O)/test-deps.mk.tmp" "$(O)/test-deps.mk"
+ $(MAKE) --no-print-directory -f $(CURDIR)/$(CFG)-test.mk all_tests
+ touch "$(@)"
+
+# A generic pattern rule to invoke a sub-make for running coverage analysis
+%/stamp.lcov: %/stamp.runtest
+ $(MAKE) --no-print-directory -f $(CFG)-test.mk all_lcov
+ touch "$(@)"
+
+# A generic pattern rule to invoke a sub-make for building detail design doc
+%/stamp.detaildesign: %/stamp.prep
+ $(MAKE) --no-print-directory -C "$(O)" mission-doc
+ touch "$(@)"
+
+# A generic pattern rule to invoke a sub-make for building user guide doc
+%/stamp.usersguide: %/stamp.prep
+ $(MAKE) --no-print-directory -C "$(O)" cfe-usersguide
+ touch "$(@)"
+
+# A generic pattern rule to invoke a sub-make for building osal guide doc
+%/stamp.osalguide: %/stamp.prep
+ $(MAKE) --no-print-directory -C "$(O)" osal-apiguide
+ touch "$(@)"
+
+# Do not delete intermediate stamp files
+.PRECIOUS: %/stamp.prep
+.PRECIOUS: %/stamp.compile
+.PRECIOUS: %/stamp.install
+.PRECIOUS: %/stamp.image
+.PRECIOUS: %/stamp.checktest
+.PRECIOUS: %/stamp.runtest
+.PRECIOUS: %/stamp.lcov
+.PRECIOUS: %/stamp.detaildesign
+.PRECIOUS: %/stamp.usersguide
+.PRECIOUS: %/stamp.osalguide
+
+.PHONY: all $(GOAL)
+
+all: $(GOAL)
+
+$(GOAL): $(STAMPFILE)
+
+# Any additional customization for certain targets can go here
+include custom-rules.mk
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 70d9560c3..ec6cd6f8b 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -1,7 +1,15 @@
# CMake snippet for building the host-side tools.
project(CFETOOLS C)
-add_subdirectory(cFS-GroundSystem/Subsystems/cmdUtil)
-add_subdirectory(elf2cfetbl)
add_subdirectory(tblCRCTool)
+add_subdirectory(commandline-tools)
+if (CFE_EDS_ENABLED)
+ # build the EDS tool set which is used later in the build
+ message(STATUS "Setting up EDS toolchain build...")
+ add_subdirectory(eds/edslib)
+ add_subdirectory(eds/tool)
+ add_subdirectory(eds/cfecfs)
+else(CFE_EDS_ENABLED)
+ add_subdirectory(elf2cfetbl)
+endif(CFE_EDS_ENABLED)
diff --git a/tools/cfs-cosmos-plugin b/tools/cfs-cosmos-plugin
new file mode 160000
index 000000000..101f6d7a6
--- /dev/null
+++ b/tools/cfs-cosmos-plugin
@@ -0,0 +1 @@
+Subproject commit 101f6d7a6d1a6a6b97e015bcd5db4b60473ac82a
diff --git a/tools/commandline-tools b/tools/commandline-tools
new file mode 160000
index 000000000..8f82634dc
--- /dev/null
+++ b/tools/commandline-tools
@@ -0,0 +1 @@
+Subproject commit 8f82634dc66cd21daef689000c016e7df4f43839
diff --git a/tools/eds b/tools/eds
new file mode 160000
index 000000000..680fe4573
--- /dev/null
+++ b/tools/eds
@@ -0,0 +1 @@
+Subproject commit 680fe4573cdc451852d4821579eee9dcff39aa8c