用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/JohnNuwan/EVA_CORE --skill arm-embedded命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Concevoir et maintenir un watchdog auto-correcteur pour services HTTP — checks de santé, auto-restart, état persistant, rapports et pièges bash.
Serveur de messagerie sécurisé auto-hébergé (Signal-like) avec Flask + WebSocket + AES-256-GCM + pont EVA
ADAM-SENTINEL — Veilleur technologique 24h/24h. Scanne 10 domaines, cree des rapports, met a jour les skills, alerte sur les CVE et breaking changes.
基于 SOC 职业分类
正在显示 SKILL.md
| name | arm-embedded |
| description | Architecture ARM embarquée — Cortex-M/R/A, programmation, debug, optimisation |
| category | edge-ai |
| author | E.V.A |
| version | 1.0.0 |
Guide complet pour le développement sur architectures ARM en contexte embarqué (bare-metal, RTOS, Linux embarqué).
// Registre de contrôle (CONTROL) — Cortex-M
// nPRIV : 0=Thread privilégié, 1=Thread non privilégié
// SPSEL : 0=SP_main, 1=SP_process
// FPCA : 0=pas de frame FP actif
// Changement de mode via MSR (nécessite privilège)
__asm volatile("MSR CONTROL, %0" : : "r" (val) : "memory");
__asm volatile("ISB");
Étages : Fetch → Decode → Issue → Execute → Memory → Writeback
Branches : 2 cycles de pénalité (prédicteur BTB 512 entrées)
Load-use : 1 cycle de bulle (résolu par forwarding)
// Exemple : placer ISR en RAM
void __attribute__((section(".ramfunc"))) TIM2_IRQHandler(void) {
// Code critique 0 wait-state
}
/* Régions mémoire typiques Cortex-M4 */
MEMORY {
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
}
SECTIONS {
.vector_table : ALIGN(4) {
LONG(ORIGIN(RAM) + LENGTH(RAM)); /* SP initial */
LONG(Reset_Handler); /* Reset */
LONG(NMI_Handler);
/* ... vecteurs ... */
} > FLASH
.text : {
_stext = .;
*(.text*)
*(.rodata*)
_etext = .;
} > FLASH
.data : ALIGN(4) {
_sdata = .;
*(.data*)
_edata = .;
} > RAM AT > FLASH
_sidata = LOADADDR(.data);
.bss : ALIGN(4) {
_sbss = .;
*(.bss*)
*(COMMON)
_ebss = .;
} > RAM
}
.syntax unified
.cpu cortex-m4
.thumb
.global Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
/* Copier .data de FLASH vers RAM */
ldr r0, =_sidata
ldr r1, =_sdata
ldr r2, =_edata
subs r2, r1
ble .L_zero_bss
.L_copy_data:
ldrb r4, [r0], #1
strb r4, [r1], #1
subs r2, #1
bgt .L_copy_data
.L_zero_bss:
ldr r1, =_sbss
ldr r2, =_ebss
subs r2, r1
ble .L_call_main
movs r3, #0
.L_zero_bss_loop:
str r3, [r1], #4
subs r2, #4
bgt .L_zero_bss_loop
.L_call_main:
bl main
bkpt #0
Offset 0x00 : SP initial
Offset 0x04 : Reset
Offset 0x08 : NMI
Offset 0x0C : HardFault
Offset 0x10 : MemManage
Offset 0x14 : BusFault
Offset 0x18 : UsageFault
Offset 0x1C : (réservé)
...
Offset 0x40+ : IRQ 0..N (exceptions périphériques)
// Priorités — 4 bits (16 niveaux) sur M4
NVIC_SetPriority(USART1_IRQn, 0); // Plus haute
NVIC_SetPriority(TIM2_IRQn, 10); // Moyenne
NVIC_EnableIRQ(USART1_IRQn);
NVIC_EnableIRQ(TIM2_IRQn);
// PendSV — priorité minimale, déclenché par l'OS
NVIC_SetPriority(PendSV_IRQn, 15);
void HardFault_Handler(void) {
/* Lecture du CFSR (Configurable Fault Status Register) */
uint32_t cfsr = SCB->CFSR;
uint32_t hfsr = SCB->HFSR;
uint32_t mmfar = SCB->MMFAR;
uint32_t bfar = SCB->BFAR;
if (cfsr & (1 << 0)) /* IACCVIOL — instruction fetch */
if (cfsr & (1 << 8)) /* MSTKERR — stacking error */
if (cfsr & (1 << 24)) /* DIVBYZERO — division par zéro */
/* Sauvegarder le contexte pour debug */
__asm volatile("TST LR, #4\n\t"
"ITE EQ\n\t"
"MRSEQ R0, MSP\n\t"
"MRSNE R0, PSP\n\t"
: : : "r0");
// R0 pointe vers le frame empilé (R0-R3, R12, LR, PC, xPSR)
while(1);
}
/* Activer FPU dans CPACR */
SCB->CPACR |= (3 << 20) | (3 << 22); // CP10 et CP11 full access
__asm volatile("DSB; ISB");
/* Modes FPU */
// LSPEN : Lazy stacking (par défaut — frame FP empilé seulement si utilisé)
// ASPEN : Automatic stacking (toujours empiler FP)
FPU->FPCCR |= (1 << 20); // ASPEN=1, LSPEN=0
// Forcer l'utilisation de FPU dans une ISR
__attribute__((cmse_nonsecure_call)) void fpu_isr(void);
// Ou marquer la fonction avec attribut
__attribute__((__target__("fpu=fpv5-d16")))
/* Configuration MPU — 8 régions, sous-régions */
void MPU_Config(void) {
// Désactiver MPU
MPU->CTRL = 0;
// Région 0 : Flash (RO, privilégié seulement)
MPU->RNR = 0;
MPU->RBAR = 0x08000000;
MPU->RASR = (0x1F << 1) | // 512KB
(0x1 << 16) | // Full access (privilégié)
(0x1 << 18) | // XN: execute never
(0x1 << 28); // Enable
// Région 1 : RAM (RW, user + privilégié)
MPU->RNR = 1;
MPU->RBAR = 0x20000000;
MPU->RASR = (0x17 << 1) | // 128KB
(0x3 << 16) | // RW full
(0x1 << 28);
// Activer MPU, background region = fault
MPU->CTRL = (1 << 0) | (1 << 2); // Enable + HFNMIENA
__asm volatile("DSB; ISB");
}
// SAU — Security Attribution Unit
void SAU_Config(void) {
SAU->CTRL = 0; // Désactiver pendant config
// Flash en non-sécurisé
SAU->RNR = 0;
SAU->RBAR = 0x08000000;
SAU->RLAR = (0x0807FFFF) | 1; // NS
// RAM partagée
SAU->RNR = 1;
SAU->RBAR = 0x20000000;
SAU->RLAR = (0x2001FFFF) | 1;
// Périmètres sécurisés par défaut
SAU->CTRL = 1;
}
/* Timer 24-bit pour tick RTOS */
void SysTick_Config(uint32_t reload) {
SysTick->LOAD = reload - 1; // 1ms à 168MHz = 167999
SysTick->VAL = 0;
SysTick->CTRL = (1 << 0) | // ENABLE
(1 << 1) | // TICKINT
(1 << 2); // CLKSOURCE = core clock
}
void SysTick_Handler(void) {
/* Incrémenter tick OS */
uwTick++;
}
# Lancer OpenOCD
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
# GDB
arm-none-eabi-gdb build/firmware.elf
(gdb) target remote :3333
(gdb) monitor reset halt
(gdb) load
(gdb) continue
// Activer ITM (Instrumentation Trace Macrocell)
ITM->LAR = 0xC5ACCE55; // Unlock
ITM->TCR = (1 << 0) | // ITM Enable
(1 << 2) | // SWO Enable
(1 << 3); // DWT Enable
ITM->TER[0] = 1; // Port 0
// Envoyer caractère
void ITM_SendChar(char c) {
while(!(ITM->STIM[0] & 1));
ITM->STIM[0] = c;
}
volatile