在Linux上构建实时应用程序需要特殊的编译和链接配置,以下是关键CMake配置要点:
# 设置实时优先级调度策略
add_compile_options(-D_REENTRANT -D_GNU_SOURCE)
# 设置实时扩展支持
add_compile_options(-D_POSIX_C_SOURCE=200112L)
add_compile_options(-D_POSIX_RLIMIT_RTPRIO)
# 检查实时调度支持
include(CheckSymbolExists)
check_symbol_exists(SCHED_FIFO "sched.h" HAVE_SCHED_FIFO)
check_symbol_exists(SCHED_RR "sched.h" HAVE_SCHED_RR)
if(HAVE_SCHED_FIFO AND HAVE_SCHED_RR)
add_definitions(-DHAVE_REAL_TIME_SCHEDULING)
endif()
# 检查内存锁定支持
check_symbol_exists(mlockall "sys/mman.h" HAVE_MLOCKALL)
if(HAVE_MLOCKALL)
add_definitions(-DHAVE_MLOCKALL)
find_library(RT_LIBRARY rt)
if(RT_LIBRARY)
target_link_libraries(your_target PRIVATE ${RT_LIBRARY})
endif()
endif()
# 检查线程优先级支持
check_symbol_exists(pthread_attr_setschedparam "pthread.h" HAVE_PTHREAD_SCHEDPARAM)
check_symbol_exists(pthread_attr_setaffinity_np "pthread.h" HAVE_PTHREAD_AFFINITY)
if(HAVE_PTHREAD_SCHEDPARAM)
add_definitions(-DHAVE_THREAD_PRIORITY)
endif()
if(HAVE_PTHREAD_AFFINITY)
add_definitions(-DHAVE_THREAD_AFFINITY)
endif()
# 检查高精度时钟
check_symbol_exists(CLOCK_MONOTONIC "time.h" HAVE_CLOCK_MONOTONIC)
check_symbol_exists(clock_gettime "time.h" HAVE_CLOCK_GETTIME)
if(HAVE_CLOCK_MONOTONIC AND HAVE_CLOCK_GETTIME)
add_definitions(-DHAVE_HIGH_RES_CLOCK)
endif()
# 检查是否使用PREEMPT_RT补丁的内核
execute_process(
COMMAND uname -r
OUTPUT_VARIABLE KERNEL_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(KERNEL_VERSION MATCHES "rt")
message(STATUS "Building for PREEMPT_RT real-time kernel")
add_definitions(-DPREEMPT_RT_KERNEL)
endif()
cmake_minimum_required(VERSION 3.10)
project(RealTimeApp C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
# 检查实时功能
include(CheckSymbolExists)
check_symbol_exists(SCHED_FIFO "sched.h" HAVE_SCHED_FIFO)
check_symbol_exists(mlockall "sys/mman.h" HAVE_MLOCKALL)
check_symbol_exists(pthread_attr_setschedparam "pthread.h" HAVE_PTHREAD_SCHEDPARAM)
# 添加实时定义
add_definitions(-D_REENTRANT -D_GNU_SOURCE)
add_definitions(-D_POSIX_C_SOURCE=200112L)
if(HAVE_SCHED_FIFO)
add_definitions(-DHAVE_REAL_TIME_SCHEDULING)
endif()
if(HAVE_MLOCKALL)
add_definitions(-DHAVE_MLOCKALL)
endif()
if(HAVE_PTHREAD_SCHEDPARAM)
add_definitions(-DHAVE_THREAD_PRIORITY)
endif()
# 查找实时库
find_library(RT_LIBRARY rt)
find_library(PTHREAD_LIBRARY pthread)
# 添加可执行文件
add_executable(rt_app src/main.c)
# 链接库
if(RT_LIBRARY)
target_link_libraries(rt_app PRIVATE ${RT_LIBRARY})
endif()
if(PTHREAD_LIBRARY)
target_link_libraries(rt_app PRIVATE ${PTHREAD_LIBRARY})
endif()
# 设置编译器优化
if(CMAKE_BUILD_TYPE STREQUAL "Release")
target_compile_options(rt_app PRIVATE -O2 -fomit-frame-pointer)
endif()
# 设置堆栈保护
target_compile_options(rt_app PRIVATE -fstack-protector-strong)
构建选项:
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
部署前检查:
/etc/security/limits.conf
中的实时优先级限制setcap
赋予可执行文件必要的能力而非root权限性能调优:
-march=native
优化目标架构-flto
进行链接时优化通过以上CMake配置,您可以构建出适合Linux实时环境的高性能应用程序,充分利用系统的实时调度、内存锁定和线程优先级等功能。