【Linux系统满足产品实时性需求】

本文探讨了如何在Linux系统中保证应用和驱动的实时性,涉及rt_preempt补丁、SCHED_DEADLINE调度策略、驱动使用工作队列、系统接口共享内存等方面,以降低CPU负载并避免系统性能问题。

一、背景:

        应用实时性:应用程序1以固定周期执行实时算法;

                             应用程序2以固定周期,执行串口收发;

        驱动实时性:驱动sdio接口,实现与FPGA数据交互,实现串口数据收发。

二、实时性保证:

       1、linux系统:

                打上rt_preempt补丁,早起的内核版本支持CONFIG_RT_BASE内核配置,后来的内核版本直接去掉了,只存在CONFIG_RT_FULL内核配置;前者表示只把中断函数线程化,后者表示原子锁互斥化+中断函数线程化。

                被线程化的中断函数,使用一个内核线程来实现中断下半部处理,调度策略为RR,优先级为50。

        2、linux驱动:

                sdio以工作队列方式发起sdio请求,工作队列选取hi优先级,绑定固定core3;并且通过bootargs参数中增加isolate=8方式隔离core3。然后通过中断和workqueue绑定到core3,以保证底层的数据收发不被应用干扰。

        3、linux应用:

                deadline调度策略,保证应用程序的实时调度。

                sysctl -w kernel.sched_rt_runtime_us=-1

#include <linux/sched.h>
#include <sys/types.h>
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sched.h>
#include <linux/sched.h>
#include <sys/types.h>


struct sched_attr {
    uint32_t size;

    uint32_t sched_policy;
    uint64_t sched_flags;

    /* SCHED_NORMAL, SCHED_BATCH */
    int32_t sched_nice;

    /* SCHED_FIFO, SCHED_RR */
    uint32_t sched_priority;

    /* SCHED_DEADLINE (nsec) */
    uint64_t sched_runtime;
    uint64_t sched_deadline;
    uint64_t sched_period;
};

int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags)
{
   return syscall(__NR_sched_setattr, pid, attr, flags);
}

pthread1_main()
{
	struct sched_attr attr;
	attr.size = sizeof(attr);
    attr.sched_flags = 0;
    attr.sched_nice = 0;
    attr.sched_priority = 0;

	/* This creates a 300us/500us reservation */
    attr.sched_policy = SCHED_DEADLINE;
    attr.sched_runtime = 300 * 1000;
    attr.sched_period = attr.sched_deadline = 500 * 1000;
	tid = syscall(SYS_gettid);
	ret = sched_setattr(tid, &attr, 0);
    if (ret != 0) 
	{
        perror("sched_setattr");
        printf("exit!\n");
        exit(-1);
    }
	while(1)
	{
		..........
        sched_yield();
	}
}

        4、系统接口:

                使用异步接口,mmap方式共享内核内存。

三、场景复杂性:

        实时的应用程序占用CPU会比较高,特别是应用中的实时任务比较多,会占用CPU大概到60%左右,导致系统负载过大。基于RT_FULL的kernel_patch,甚至会导致cpu stall现象出现。

内容概要:本文档详细介绍了Rockchip Linux系统实时性能问题的排查方法与优化方案,重点围绕RK3588与MCU通过UART通信时出现的数据读取延迟问题展开分析。文档系统性地梳理了从问题描述、测试拓扑、影响分析到具体的排查思路和优化措施,涵盖中断延迟、调度延迟、实时线程配置、CPU频率与亲和性设置等多个维度,并结合Trace工具、cyclictest性能测试及内核配置调整等手段进行深入诊断。最终提出包括开启内核抢占、提高HZ值、中断与实时线程绑定独立CPU核心、应用与内核线程改造为实时线程等一系列综合优化策略,以提升系统实时响应能力。; 适合人群:嵌入式系统工程师、Linux驱动开发工程师、技术支持工程师及从事实时性要求较高的软硬件开发人员;具备一定的Linux系统知识、内核机制和嵌入式开发经验者更佳。; 使用场景及目标:①解决串口通信等外设数据采集中的高延迟问题;②优化Linux系统实时响应性能,适用于工业控制、机器人、音视频处理等对时间敏感的应用场景;③掌握Linux实时性问题的系统化排查流程与工具使用方法。; 阅读建议:建议结合实际硬件平台动手实践文档中提供的配置修改、补丁应用和工具使用步骤,重点关注Trace数据分析与实时线程调度行为,理解各优化项之间的关联性,并在安全可控环境下进行内核参数调整与实时线程部署,避免因高优先级线程滥用导致系统不稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值