Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Correct the target template to describe how the framework actually works by fdesbiens · Pull Request #52 · eclipse-threadx/samplex · GitHub
Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct the target template to describe how the framework actually works by fdesbiens · Pull Request #52 · eclipse-threadx/samplex · GitHub
Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct the target template to describe how the framework actually works by fdesbiens · Pull Request #52 · eclipse-threadx/samplex · GitHub
Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Correct the target template to describe how the framework actually works by fdesbiens · Pull Request #52 · eclipse-threadx/samplex · GitHub
Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct the target template to describe how the framework actually works by fdesbiens · Pull Request #52 · eclipse-threadx/samplex · GitHub
Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Correct the target template to describe how the framework actually works by fdesbiens · Pull Request #52 · eclipse-threadx/samplex · GitHub
Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Correct the target template to describe how the framework actually works by fdesbiens · Pull Request #52 · eclipse-threadx/samplex · GitHub
Skip to content

Correct the target template to describe how the framework actually works - #52

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality
Aug 31, 2026
Merged

Correct the target template to describe how the framework actually works#52
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/template-matches-reality

Conversation

@fdesbiens

@fdesbiensfdesbiens commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Correct the target template to describe how the framework actually works

The problem

templates/target/ documented a structure the repository does not have, and following it produced a build that could not configure. Its app/CMakeLists.txt compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory and never has been. The first thing a new contributor hits is a CMake error on a path that does not exist.

Of the three shared root directories the template declared governed, only one was real:

DeclaredReality
/bsp✅ Real. Both framework targets implement board.h, led.h, console.h
/cmake❌ Dead. cmake/utilities.cmake was referenced by nothing; all four targets carry their own copy, and the root file was byte-identical to the NUCLEO one apart from a license URL typo (licenses/MIT vs license/mit)
/apps❌ Absent. Referenced by the template, by docs/architecture.md, and by the template's own CMake, but never created

What changed

The template now says what the framework does: applications and toolchain files live with their target.

The claim that applications have "no compile-time dependency on vendor-specific HALs, SDKs, or hardware registers" is retired rather than restated, because neither existing demo satisfies it — both include their board_config.h for memory sizing and vendor headers for board-specific startup self-tests. A portable shared application layer stays documented as a goal, explicitly labelled as one, rather than as a feature that exists.

templates/target/app/main.c is added, because the template now points at it. It depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread stacks, so it avoids needing the board's memory extents and will compile for any target implementing the interfaces. It is a starting point to grow in place, not a shared application.

Also cleaned up in the template:

  • Removed the dead SHARED_APP_DIR.
  • Removed the guarded include of ${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake — a file that was never added, so if(EXISTS ...) meant it silently never fired.
  • The BSP CMake now uses SHARED_BSP_DIR instead of a five-level relative path, matching what both real targets do.
  • CMAKE_C_STANDARD 11 → 99, per AGENTS.md.

On deleting cmake/utilities.cmake

It was referenced by nothing in this state. Leaving a duplicate that looks authoritative invites edits that have no effect — someone changing the root copy would see no result, because every target loads its own. It is recoverable from history if the intent was for it to become the shared location; say so in review and I will restore it and wire the targets to it instead.

What this does not do

This does not make applications portable. That is a design change, not a cleanup, and it is deliberately out of scope here:

  • The two demos are different applications, not variants — PolarFire is a 328-line LM75 condition monitor (3 threads, queue, event flags, static stacks); NUCLEO is a 653-line RTOS showcase (9 threads, byte pool and block pool, mutex, semaphore, timer). Neither is a subset of the other.
  • Startup self-tests are irreducibly board-specific: _heap_limit vs __end, PLIC vs NVIC, CSR reads vs HAL_GetTick().
  • Memory strategy differs — NUCLEO derives its byte pool from BSP_RAM_END; PolarFire uses static arrays.

Doing it properly needs at least two new generic BSP interfaces, roughly bsp_self_test() and bsp_ram_region(&base, &size), which changes the shared contract both targets implement and would require rehoming the self-tests added in #51. Worth a separate discussion.

Verification

Documentation and template files only; no target consumes them, and templates/ is inert until copied (there is no root CMakeLists.txt). Confirmed anyway that nothing regressed:

  • NUCLEO-F401RE builds clean under Arm GNU Toolchain 14.2.Rel1 with -Werror: 22068 B ROM, 6000 B RAM — unchanged.
  • Its Renode suite still passes, exit 0.
  • Verified by grep that no target, script, doc, or workflow referenced the removed file.

…works
templates/target/ documented a structure the repository does not have, and
following it produced a build that could not configure. Its app/CMakeLists.txt
compiled ../../../../apps/threadx_demo/main.c, but there is no apps/ directory
and never has been, so the first thing a new contributor hit was a CMake error
on a path that does not exist.
Of the three shared root directories the template declared governed, only one
was real:
/bsp real - both framework targets implement board.h, led.h, console.h
/cmake dead - cmake/utilities.cmake was referenced by nothing. All four
targets carry their own copy, and the root file was byte-identical
to the NUCLEO one apart from a license URL typo
/apps absent - referenced by the template, docs/architecture.md, and the
template's own CMake, but never created
The template now says what the framework does: applications and toolchain
files live with their target. The claim that applications have no compile-time
dependency on vendor headers is retired rather than restated, because neither
existing demo satisfies it - both include their board_config.h for memory
sizing and vendor headers for board-specific startup self-tests. A portable
shared application layer stays documented as a goal, labelled as one.
templates/target/app/main.c is added because the template now points at it. It
depends only on <tx_api.h> and the <bsp/...> contracts and uses static thread
stacks, so it avoids needing the board's memory extents and will compile for
any target implementing the interfaces. It is a starting point to grow in
place, not a shared application.
Also removed the template's dead SHARED_APP_DIR and its guarded include of
${SHARED_CMAKE_DIR}/gcc-arm-none-eabi.cmake, a file that was never added, so
the include silently never fired. The template's BSP CMake now uses
SHARED_BSP_DIR instead of a five-level relative path, matching what both real
targets do, and CMAKE_C_STANDARD moves from 11 to 99 per AGENTS.md.
The deleted cmake/utilities.cmake is recoverable from history if the intent
was for it to become the shared location; nothing referenced it in this state,
and leaving a duplicate that looks authoritative invites edits that have no
effect.
Verified the NUCLEO target still builds clean (22068 B ROM, 6000 B RAM) and
its Renode suite still passes; neither target used the removed file.
Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fdesbiens
fdesbiensforce-pushed the fix/template-matches-reality branch from 479ca43 to 0e89927CompareAugust 31, 2026 16:05
@fdesbiens
fdesbiens merged commit 4143776 into eclipse-threadx:devAug 31, 2026
5 checks passed
@fdesbiens
fdesbiens deleted the fix/template-matches-reality branch August 31, 2026 16:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@fdesbiens