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


    一、背景:

            应用实时性:应用程序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

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. struct sched_attr {
    11. uint32_t size;
    12. uint32_t sched_policy;
    13. uint64_t sched_flags;
    14. /* SCHED_NORMAL, SCHED_BATCH */
    15. int32_t sched_nice;
    16. /* SCHED_FIFO, SCHED_RR */
    17. uint32_t sched_priority;
    18. /* SCHED_DEADLINE (nsec) */
    19. uint64_t sched_runtime;
    20. uint64_t sched_deadline;
    21. uint64_t sched_period;
    22. };
    23. int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags)
    24. {
    25. return syscall(__NR_sched_setattr, pid, attr, flags);
    26. }
    27. pthread1_main()
    28. {
    29. struct sched_attr attr;
    30. attr.size = sizeof(attr);
    31. attr.sched_flags = 0;
    32. attr.sched_nice = 0;
    33. attr.sched_priority = 0;
    34. /* This creates a 300us/500us reservation */
    35. attr.sched_policy = SCHED_DEADLINE;
    36. attr.sched_runtime = 300 * 1000;
    37. attr.sched_period = attr.sched_deadline = 500 * 1000;
    38. tid = syscall(SYS_gettid);
    39. ret = sched_setattr(tid, &attr, 0);
    40. if (ret != 0)
    41. {
    42. perror("sched_setattr");
    43. printf("exit!\n");
    44. exit(-1);
    45. }
    46. while(1)
    47. {
    48. ..........
    49. sched_yield();
    50. }
    51. }

            4、系统接口:

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

    三、场景复杂性:

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

  • 相关阅读:
    paddleocr识别模型训练记录
    aarch64架构CPU的docker中ubuntu18.04,20.04,22.04等系统apt update均报错的原因
    Django高级之-分页器
    zabbix
    Centos7.6安装FTP
    Java将Word转换成PDF-aspose
    路由跟踪命令 tracert 命令详解
    Linux的Jdk安装教程
    【云计算学习笔记】Docker(一)
    Java之System.getProperty()的作用及使用说明
  • 原文地址:https://blog.csdn.net/luwei860123/article/details/133646005