POSA_LEAKSMS/firmware/config/FreeRTOSConfig.h
유창욱 90f121e14c chore: import codebase with security hardening
SHT30 온습도 모니터링 시스템 전체 소스(서버 PHP, STM32 펌웨어, SQL, 테스트).
전체 코드리뷰에서 도출된 보안 하드닝 10건 반영:
- 요청 서명 HMAC-SHA256 전환(펌웨어 sig.c/서버 config.php/호스트 패리티 동시)
- 재전송 방어 + 기본 API_KEY fail-closed + 디바이스 문자열 정제(api/sensor_data.php)
- 오프라인 SMS 중복 발송 경합 제거(cron_heartbeat.php, 원자적 선점)
- CSV 수식 주입 방지(monthly_report.php), 감사로그 회전 락(retention_cleanup.php)
- 브루트포스 카운터 원자화(login.php), 예시 TOTP 비밀키 무효화, 마이그레이션 멱등화

_backup/(하드코딩 실 비밀값 포함)·config.local.php·런타임 상태는 .gitignore 제외.
2026-06-20 09:37:40 +09:00

173 lines
9.7 KiB
C

/* =============================================================================
* FreeRTOSConfig.h - STM32F407VGT6 (Cortex-M4F @168MHz) 용 FreeRTOS 커널 설정
*
* 누수감지/SHT30 노드 펌웨어. 네이티브 FreeRTOS API(task/queue/timers/semphr)
* 만 사용한다(CMSIS-RTOS 미사용).
*
* 핵심 결정 사항:
* - configCPU_CLOCK_HZ = 168MHz (bsp.c SystemClock_Config: HSE 8MHz -> PLL).
* - Tick = 1kHz (1ms). vTaskDelay/타이머 분해능 1ms.
* - heap_4 사용. 힙 64KB. (필요 시 linker 로 CCM/SRAM 배치 가능 — 단, LwIP/HAL
* DMA 디스크립터는 CCM 에 두지 말 것. 일반 동적할당은 SRAM heap_4 로 충분.)
* - FPU(Cortex-M4F) 사용: 포트가 lazy-stacking 으로 부동소수 컨텍스트 저장.
* - NVIC: STM32 는 4 우선순위 비트(configPRIO_BITS=4). HAL/EXTI 등 *FromISR
* API 를 호출하는 ISR 은 반드시 MAX_SYSCALL 이하(=수치상 크거나 같은)
* 우선순위(=논리적으로 낮은 선점도)를 가져야 한다.
*
* HAL 타임베이스 주의:
* vPortSVCHandler/xPortPendSVHandler/xPortSysTickHandler 를 CMSIS 벡터명
* (SVC_Handler/PendSV_Handler/SysTick_Handler)으로 매핑한다(아래 #define).
* 따라서 SysTick 은 FreeRTOS 전용이 되며, HAL 의 HAL_GetTick() 타임베이스는
* SysTick 과 충돌하면 안 된다. -> bsp 가 HAL_InitTick() 을 override 하여 HAL
* 타임베이스를 TIM6 으로 둔다(stm32f4xx_hal_conf.h 의 TICK 우선순위 참고).
* ===========================================================================*/
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
/* -----------------------------------------------------------------------------
* 어셈블러에서 인클루드될 때는 C 전용 선언을 숨긴다.
* (portasm 등에서 본 헤더를 포함할 수 있음)
* ---------------------------------------------------------------------------*/
#ifndef __IASMARM__
#include <stdint.h>
extern uint32_t SystemCoreClock; /* CMSIS system_stm32f4xx.c 가 갱신 */
#endif
/* =============================================================================
* 스케줄러 기본 동작
* ===========================================================================*/
#define configUSE_PREEMPTION 1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 /* Cortex-M CLZ 기반 선택 */
#define configUSE_TICKLESS_IDLE 0 /* IWDG/주기보고가 있어 미사용 */
/* CPU/틱 클럭. SystemClock_Config 가 168MHz 로 설정. */
#define configCPU_CLOCK_HZ ( 168000000UL )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 7 )
#define configMINIMAL_STACK_SIZE ( ( uint16_t ) 128 ) /* words(=512B) */
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_TASK_NOTIFICATIONS 1
#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3
#define configUSE_MUTEXES 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_COUNTING_SEMAPHORES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configUSE_QUEUE_SETS 0
#define configUSE_TIME_SLICING 1
#define configUSE_NEWLIB_REENTRANT 0
#define configENABLE_BACKWARD_COMPATIBILITY 0
#define configSTACK_DEPTH_TYPE uint16_t
#define configMESSAGE_BUFFER_LENGTH_TYPE size_t
/* =============================================================================
* 메모리 할당
* - 동적/정적 둘 다 지원. 정적: idle/timer 태스크 메모리는 rtos_hooks.c 제공.
* - heap_4(coalescing first-fit) 사용 권장. 빌드 시스템이 heap_4.c 를 링크.
* - 64KB. LwIP+mbedTLS TLS 핸드셰이크/세션은 메모리를 많이 쓰므로 여유 확보.
* (mbedTLS 자체 버퍼는 보통 calloc/정적으로 잡지만, 태스크 스택/큐/세마포어
* 등 커널 객체 + 애플리케이션 동적할당을 모두 이 힙에서 충당.)
* ===========================================================================*/
#define configSUPPORT_STATIC_ALLOCATION 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 64 * 1024 ) )
#define configAPPLICATION_ALLOCATED_HEAP 0 /* heap_4 내부 ucHeap[] 사용 */
#define configKERNEL_PROVIDED_STATIC_MEMORY 1
/* =============================================================================
* 후크(Hook) 함수 - 구현은 common/rtos_hooks.c
* ===========================================================================*/
#define configUSE_IDLE_HOOK 1 /* IWDG refresh / 저전력 hint */
#define configUSE_TICK_HOOK 0
#define configUSE_MALLOC_FAILED_HOOK 1 /* vApplicationMallocFailedHook */
#define configCHECK_FOR_STACK_OVERFLOW 2 /* method 2: 스택 패턴 검사 */
#define configUSE_DAEMON_TASK_STARTUP_HOOK 0
/* =============================================================================
* 소프트웨어 타이머 (누수 입력 디바운스 타이머에 사용)
* ===========================================================================*/
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
#define configTIMER_QUEUE_LENGTH 10
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )
/* =============================================================================
* 런타임/디버그 통계 (기본 비활성 — 필요 시 bsp 타이머로 ConfigureForRunTimeStats)
* ===========================================================================*/
#define configGENERATE_RUN_TIME_STATS 0
#define configUSE_TRACE_FACILITY 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 0
#define configRECORD_STACK_HIGH_ADDRESS 1
/* =============================================================================
* assert() — 개발 중에는 reason 을 잡고 정지, 운영 중엔 IWDG 가 리셋.
* vAssertCalled 는 rtos_hooks.c 에 구현(인터럽트 끄고 디버그 정지).
* ===========================================================================*/
#ifndef __IASMARM__
void vAssertCalled( const char *pcFile, unsigned long ulLine );
#define configASSERT( x ) \
if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )
#endif
/* =============================================================================
* 포함할 API (INCLUDE_*)
* ===========================================================================*/
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_xTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
#define INCLUDE_xTaskGetIdleTaskHandle 1
#define INCLUDE_eTaskGetState 1
#define INCLUDE_xTimerPendFunctionCall 1
#define INCLUDE_xTaskAbortDelay 1
#define INCLUDE_xQueueGetMutexHolder 1
#define INCLUDE_xSemaphoreGetMutexHolder 1
#define INCLUDE_xTaskGetHandle 1
#define INCLUDE_xTaskResumeFromISR 1
/* =============================================================================
* Cortex-M4F 인터럽트 우선순위 설정 (NVIC)
*
* STM32F4 는 우선순위 4비트(16단계). 숫자가 작을수록 높은 선점도.
* - LOWEST : 15 (가장 낮은 선점도)
* - MAX_SYSCALL : 5 — 이보다 *높은 선점도(숫자 < 5)* 의 ISR 에서는 FreeRTOS
* API 를 호출하면 안 된다. ETH/I2C/EXTI/UART 등 *FromISR 을 부르는 HAL IRQ 는
* NVIC 우선순위를 5..15 범위(숫자 ≥ 5)로 설정해야 한다.
* - 부팅 직후 NVIC_SetPriorityGrouping(0) (4비트 전부 preempt, sub 0)를 HAL_Init
* 이 설정함을 전제.
* ===========================================================================*/
#define configPRIO_BITS 4
/* 가장 낮은 선점도(= 가장 큰 숫자). */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15
/* RTOS-aware ISR(=FromISR 사용 ISR)이 가질 수 있는 최고 선점도(=가장 작은 숫자). */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
/* 커널이 PendSV/SysTick 에 쓰는 raw 우선순위 (LOWEST << (8-PRIO_BITS)). */
#define configKERNEL_INTERRUPT_PRIORITY \
( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )
/* basepri 마스크 임계값 (MAX_SYSCALL << shift). taskENTER_CRITICAL 등에서 사용. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY \
( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )
/* =============================================================================
* Cortex-M 포트 핸들러 -> CMSIS 벡터명 매핑
* startup_stm32f407xx.s 의 벡터 테이블은 SVC_Handler/PendSV_Handler/
* SysTick_Handler 를 참조한다. FreeRTOS 의 핸들러를 그 이름으로 alias.
* SysTick 은 FreeRTOS 전용 — HAL 타임베이스는 TIM6 (bsp 가 HAL_InitTick override).
* ===========================================================================*/
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#endif /* FREERTOS_CONFIG_H */