外观
实时性方案
2025-09-19
本文将详细介绍睿擎平台实时性方案,以及如何提升系统的实时性。帮助读者掌握实时性优化方法,实现高精度定时任务的开发。
一、实时性系统概述
实时性系统是指能够在严格时间限制内对外部事件做出响应的计算机系统,广泛应用于工业控制、机器人、自动驾驶等领域。睿擎实时性开发平台为企业级应用提供了高性能、低延迟的解决方案。
二、睿擎平台实时性方案
1. 实时性方案示意图
睿擎平台采用创新的多核隔离架构,通过硬件资源划分实现实时性保障:

2. CPU 隔离
CPU0、CPU1 作为非实时核,CPU2 作为实时核。
- 非实时核:CPU0、CPU1 运行普通应用程序
- 实时核:CPU2 专用于实时任务处理,确保关键任务的执行不受干扰
3. 中断隔离
- 常规外设中断(UART、NET、I2C、SPI、TIMER0/1/2 等)绑定到 CPU0
- 实时定时器中断(TIMER3/4/5)专属于 CPU2
4. 线程隔离
- 新线程默认绑定 CPU0,避免系统动态负载均衡对 CPU2 的潜在干扰。
- 实时线程绑定到实时核 CPU2
三、实时性编程实践
1. 实时中断
硬件定时器(hwtimer)是基于硬件计数器实现的高精度定时设备,硬件定时器是实现精确时间管理和实时控制的重要组件,具有以下特性:
- 在预设时间间隔自动触发中断或回调函数
- 不受系统调度影响,响应延迟极低
- 支持周期性任务调度和精确延时控制
硬件定时器中断绑核
通过修改设备树文件rc3506j.dtsi,将硬件定时器 0/1/2 绑定到非实时核 CPU0,硬件定时器 3/4/5 绑定到实时核 CPU2。
&rktimer {
interrupt-affinity = <&cpu0>, <&cpu0>, <&cpu0>, <&cpu2>, <&cpu2>, <&cpu2>;
};初始化硬件定时器并安装中断回调函数
static rt_device_t timer = RT_NULL;
static rt_err_t tmr_callback(rt_device_t dev, rt_size_t size)
{
return RT_EOK;
}
static rt_err_t hwtimer_init(const char *name, uint32_t us)
{
rt_hwtimer_mode_t mode = HWTIMER_MODE_PERIOD;
rt_hwtimerval_t timeout = {0};
timer = rt_device_find(name);
if (timer == RT_NULL)
{
rt_kprintf("Cannot find timer device: %s", name);
return -RT_ERROR;
}
rt_device_open(timer, RT_DEVICE_FLAG_RDWR);
rt_device_set_rx_indicate(timer, tmr_callback);
rt_device_control(timer, HWTIMER_CTRL_MODE_SET, (void *)&mode);
timeout.sec = us / 1000000;
timeout.usec = us % 1000000;
if (rt_device_write(timer, 0, &timeout, sizeof(timeout)) == 0)
{
rt_kprintf("timer write failed");
}
return RT_EOK;
}125us 周期性实时中断
使能实时核 CPU2 上的硬件定时器 3/4/5,通过以下设置就可以得到 125us 周期性中断:
hwtimer_init("timer3", 125);实时线程
创建信号量
用于实时中断和实时线程通讯。
static struct rt_semaphore testsem;
static int smp_125us(int argc, char **argv)
{
rt_sem_init(&testsem, "sem", 0, RT_IPC_FLAG_FIFO);
}
MSH_CMD_EXPORT(smp_125us, smp 125us);创建线程并绑定到实时核 CPU2
实时线程中永久等待信号量。
static void realtest(void *para)
{
while (1)
{
rt_sem_take(&testsem, RT_WAITING_FOREVER);
}
}
static int smp_125us(int argc, char **argv)
{
rt_thread_t thread = RT_NULL;
rt_sem_init(&testsem, "sem", 0, RT_IPC_FLAG_FIFO);
thread = rt_thread_create("real", realtest, RT_NULL, 0x1000,4,20);
if(thread != RT_NULL)
{
/* 绑定到实时核 CPU2 */
rt_thread_control(thread, RT_THREAD_CTRL_BIND_CPU, (void*)2);
rt_thread_startup(thread);
}
}
MSH_CMD_EXPORT(smp_125us, smp 125us);高精度定时器中断中发送信号量
用于产生周期性时间,并在定时器中断中给实时线程发送信号量。
static rt_err_t tmr_callback(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&testsem);
return RT_EOK;
}3. 完整的示例代码
#include <rtthread.h>
#include <rtdevice.h>
static rt_device_t timer = RT_NULL;
static struct rt_semaphore testsem;
static volatile rt_uint32_t timer_count = 0, thread_count = 0;
static rt_err_t tmr_callback(rt_device_t dev, rt_size_t size)
{
timer_count++;
rt_sem_release(&testsem);
return RT_EOK;
}
static rt_err_t hwtimer_init(const char *name, uint32_t us)
{
rt_hwtimer_mode_t mode = HWTIMER_MODE_PERIOD;
rt_hwtimerval_t timeout = {0};
timer = rt_device_find(name);
if (timer == RT_NULL)
{
rt_kprintf("Cannot find timer device: %s", name);
return -RT_ERROR;
}
rt_device_open(timer, RT_DEVICE_FLAG_RDWR);
rt_device_set_rx_indicate(timer, tmr_callback);
rt_device_control(timer, HWTIMER_CTRL_MODE_SET, (void *)&mode);
timeout.sec = us / 1000000;
timeout.usec = us % 1000000;
if (rt_device_write(timer, 0, &timeout, sizeof(timeout)) == 0)
{
rt_kprintf("timer write failed");
}
return RT_EOK;
}
static void realtest(void *para)
{
while (1)
{
rt_sem_take(&testsem, RT_WAITING_FOREVER);
thread_count++;
}
}
static int smp_125us(int argc, char **argv)
{
rt_thread_t thread = RT_NULL;
rt_err_t ret;
thread_count = 0;
timer_count = 0;
rt_sem_init(&testsem, "sem", 0, RT_IPC_FLAG_FIFO);
thread = rt_thread_create("real", realtest, RT_NULL, 0x1000,4,20);
if(thread != RT_NULL)
{
/* 绑定到实时核 CPU2 */
rt_thread_control(thread, RT_THREAD_CTRL_BIND_CPU, (void*)2);
rt_thread_startup(thread);
}
ret = hwtimer_init("timer3", 125);
if (ret != RT_EOK)
{
rt_sem_detach(&testsem);
return -RT_ERROR;
}
return 0;
}
MSH_CMD_EXPORT(smp_125us, smp 125us);
static void print_count(void)
{
rt_kprintf("thread_count:%d timer_count:%d\n", thread_count,
timer_count);
}
MSH_CMD_EXPORT(print_count, print_count);4. 演示

四、结语
睿擎实时性开发平台通过精心设计的架构和丰富的工具链,使开发者能够构建满足严格时序要求的应用系统。遵循本指南的原则和实践,可以充分发挥平台潜力,开发出高性能、实时应用。
五、FAQ
Q:如何验证系统的实时性能?
A:可通过测量最坏情况下的中断响应时间和任务抖动延迟来评估。睿擎平台提供了专用的实时性测试工具集(rt_perf)。
Q:实时核上可以运行多个实时线程吗?
A:可以,但建议将时间要求最严格的线程设置为最高优先级,并确保低优先级线程不影响实时线程。
Q:非实时任务如何与实时任务通信?
A:推荐使用无锁环形缓冲区,避免阻塞实时任务执行。
