소스 정보
- 저장소
- JohnNuwan/EVA_CORE
- 최근 소스 활동
- 2026년 7월 21일 23:22
- 감지된 SKILL.md 언어
- 프랑스어
- 스타
- 0
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/JohnNuwan/EVA_CORE --skill arm-embedded명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
SOC 직업 분류 기준
| 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