linux--实时性优化
linux--实时性优化
- 1 介绍
- 2 实时性需求
- 3 代表性实时系统
- 4 嵌入式系统
- 嵌入式软件系统结构
- 处理器时钟节拍
- 多任务机制
- 任务调度方式
- 任务调度算法
- 时间片调度算法
- 优先级调度算法
- 基于优先级的时间片调度算法
- 5 cyclictest 测试工具
- 命令说明
- 命令分析
- 参数含义
- 6 linux 实时性改进
- 某版本上发布实时补丁或者内核改造
- 打补丁【RT-patch】
- 双内核【RT-Linux、RTAI、Xenomai】
- 时钟精度调整
- 中断调整
- 进程调度算法
- 其他策略,绑核
- 参考
1 介绍
Linux本身为分时操作系统,其系统目标为较好的平均响应时间和较高的吞吐量,而实时系统则主要考虑任务的按量完成、尽量降低进程运行的不可预测性等。
2 实时性需求
AGV、机械臂等机器人,在控制伺服,读取雷达、PGV等传感器数据时,需要一定的实时性。如伺服控制周期要在 10ms 甚至更低,这就需要相应线程工作时,能稳定在相应周期内。
3 代表性实时系统
| 实时系统 | 开源/商业 | 地区 |
|---|---|---|
| μc/os-III | 商业 | 国外 |
| FreeRTOS | 开源 | 国外 |
| Vxworks | 商业 | 国外 |
| RT-Thread | 开源 | 国内 |
| Liteos | 开源 | 国内 |
4 嵌入式系统
嵌入式软件系统结构
目前常见的嵌入式软件结构可以分为轮询系统、前后台系统和多任务系统。
ISR是Interrupt Service Routines的缩写,即中断服务程序。

| 模型 | 事件响应 | 事件处理 | 特点 |
|---|---|---|---|
| 轮询系统 | 主程序 | 主程序 | 轮询响应事件,轮询处理事件 |
| 前后台系统 | 前台多个中断程 | 后台单个主程序 | 实时响应事件,轮询处理事件 |
| 多任务系统 | 多个中断程序 | 多个任务 | 实时响应事件,实时处理事件 |
处理器时钟节拍

多任务机制

在上图中,任务 A 和任务 B 按照等长时间轮流占用处理器,在单处理器上造成多
个任务同时运行的假象。
任务调度方式
任务调度方式可分为可抢占调度和不可抢占式调度两类。
基于优先级的可抢占式调度的实时性好,任何优先级高的任务只要具备了运行的条
件,即进入了就绪态,就可以立即得到调度和运行。任务在运行过程中都随时可能被比它优先级高的任务抢占。这种方式的任务调度保证了系统的实时性。

上图演示了不可抢占内核中的任务执行情况。例子中有三个任务需要运行。系统的
执行流程如下:
- T0 时刻任务 C 得到处理器,它开始执行。在它执行过程中,任务 B 和任务 C 就
绪,但是因为内核不支持抢占式调度,所以它们只好等待机会。 - T1 时刻任务 C 完成操作,主动让出处理器。内核选择任务 B 来运行
- T2 时刻任务 B 完成操作,主动让出处理器。内核选择任务 A 来运行
- T3 时刻任务 A 完成操作,主动让出处理器。内核再次选择任务 C 来运行
任务调度算法
时间片调度算法
指的是内核先让某个任务运行一个时间片(多个时钟节拍),然后再切换给另一个
任务。
缺点:在任务占有处理器的时间段内,即是有更紧急任务就绪,也不能立刻执行它。

优先级调度算法
指的是内核总是让具有最高优先级的就绪任务优先运行。这种内核最大的提升了系统的实时性。
缺点:当最高优先级任务在运行时,它将持续占有处理器直到任务结束或者阻塞,否则其它任务无法获得运行的机会。

基于优先级的时间片调度算法
吸收了以上两种算法的优点,同时又解决了它们的不足。
这种算法为每个任务都安排了优先级和时间片。在不同优先级的任务间采用优先级调度算法,在相同优先级的任务间使用时间片轮转调度算法。任务调度策略首先考虑任务的优先级,优先级高的任务必定会抢占低优先级的任务。相同优先级的任务则按照时间片长度比例共享处理器时间。
这样既保证了能够尽快响应紧急任务,又保证相优先级的任务都有机会轮流占有处理器。

5 cyclictest 测试工具
可以在centos,ubuntu,加补丁的linux中使用。
命令说明
(base) root@orangepiaipro:/opt/worthsen/rt-tests# ./cyclictest --help
cyclictest V 1.00
Usage:
cyclictest <options>-a [NUM] --affinity run thread #N on processor #N, if possiblewith NUM pin all threads to the processor NUM
-A USEC --aligned=USEC align thread wakeups to a specific offset
-b USEC --breaktrace=USEC send break trace command when latency > USEC
-B --preemptirqs both preempt and irqsoff tracing (used with -b)
-c CLOCK --clock=CLOCK select clock0 = CLOCK_MONOTONIC (default)1 = CLOCK_REALTIME
-C --context context switch tracing (used with -b)
-d DIST --distance=DIST distance of thread intervals in us, default=500
-D --duration=TIME specify a length for the test run.Append 'm', 'h', or 'd' to specify minutes, hours or days.--latency=PM_QOS write PM_QOS to /dev/cpu_dma_latency
-E --event event tracing (used with -b)
-f --ftrace function trace (when -b is active)
-F --fifo=<path> create a named pipe at path and write stats to it
-h --histogram=US dump a latency histogram to stdout after the runUS is the max latency time to be be tracked in microsecondsThis option runs all threads at the same priority.
-H --histofall=US same as -h except with an additional summary column--histfile=<path> dump the latency histogram to <path> instead of stdout
-i INTV --interval=INTV base interval of thread in us default=1000
-I --irqsoff Irqsoff tracing (used with -b)
-l LOOPS --loops=LOOPS number of loops: default=0(endless)--laptop Save battery when running cyclictestThis will give you poorer realtime resultsbut will not drain your battery so quickly
-m --mlockall lock current and future memory allocations
-M --refresh_on_max delay updating the screen until a new maxlatency is hit. Userful for low bandwidth.
-n --nanosleep use clock_nanosleep--notrace suppress tracing
-N --nsecs print results in ns instead of us (default us)
-o RED --oscope=RED oscilloscope mode, reduce verbose output by RED
-O TOPT --traceopt=TOPT trace option
-p PRIO --priority=PRIO priority of highest prio thread
-P --preemptoff Preempt off tracing (used with -b)--policy=NAME policy of measurement thread, where NAME may be oneof: other, normal, batch, idle, fifo or rr.--priospread spread priority levels starting at specified value
-q --quiet print a summary only on exit
-r --relative use relative timer instead of absolute
-R --resolution check clock resolution, calling clock_gettime() manytimes. List of clock_gettime() values will bereported with -X--secaligned [USEC] align thread wakeups to the next full secondand apply the optional offset
-s --system use sys_nanosleep and sys_setitimer
-S --smp Standard SMP testing: options -a -t -n andsame priority of all threads--spike=<trigger> record all spikes > trigger--spike-nodes=[num of nodes]These are the maximum number of spikes we can record.The default is 1024 if not specified
-t --threads one thread per available processor
-t [NUM] --threads=NUM number of threads:without NUM, threads = max_cpuswithout -t default = 1--tracemark write a trace mark when -b latency is exceeded
-T TRACE --tracer=TRACER set tracing functionconfigured tracers: hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop
-u --unbuffered force unbuffered output for live processing
-v --verbose output values on stdout for statisticsformat: n:c:v n=tasknum c=count v=value in us
-w --wakeup task wakeup tracing (used with -b)
-W --wakeuprt rt task wakeup tracing (used with -b)--dbg_cyclictest print info useful for debugging cyclictest
(base) root@orangepiaipro:/opt/worthsen/rt-tests#
命令分析
| 参数 | 完整参数 | 参数含义 |
|---|---|---|
| 常用的基本选项 | ||
| -a | –affinity | 设置测试线程的亲核性,或设置线程的cpuset |
| -A | –aligned=USEC | align thread wakeups to a specific offset |
| -d | –distance=DIST | 当每个CPU上只有一个线程时,建议将它设置为0。若CPU上有多个实时线程,需要设置一个distance用来隔开线程唤醒的时间,distance会累加到interval的值上,默认是500us |
| -D | –duration=TIME --latency=PM_QOS | 指定测试持续事件,可以加单位 ‘m’ ‘h’ ‘d’ 分钟 小时 天 write PM_QOS to /dev/cpu_dma_latency |
| -F | –fifo= | 在指定路径下创建一个管道,用来向它写stats |
| -i | –interval=INTV | 线程睡眠的时间,默认是1000us,即实时线程1000us被唤醒一次 |
| -l | –loops=LOOPS --laptop | 循环次数,默认次数是0(无数次),cyclictest运行的时间等于interval×loops,或是–duration=TIME 省电模式运行cyclictest,得到的结果相对不那么realtime。 |
| -m | –mlockall | 将当前和接下来的内存通过mlock锁定,防止发生swap影响测试 |
| -n | –nanosleep --notrace | 使用精度更高的纳秒睡眠api:clock_nanosleep 抑制追踪的行为(因为ftrace会有一定的overhead) |
| -p | –priority=PRIO | 指定实时线程的优先级 |
| 关于timer和时间的选项 | ||
| -c | –clock=CLOCK | 选择时钟类型。默认是=0 0代表CLOCK_MONOTONIC 1代表CLOCK_REALTIME |
| -N | –nsecs | 测试结果使用精度更高的ns显示(默认是us) |
| -r | –relative | 使用相对时间的timer来代替绝对时间的timer |
| -R | –resolution --secaligned [USEC] | check clock resolution. align thread wakeups to the next full second |
| -s | –system | 使用sys_nanosleep()和sys_setitimer()设置定时器 |
| -t | –threads --tracemark | 每个处理器分配一个线程 write a trace mark when -b latency is exceeded |
| -t | –threads=NUM | 指定总线程数,若不指定,线程数等于max_cpus;若不使用-t参数,则线程数为1。 |
| -S | –smp --smi | 标准smp架构测试,所有的线程将使用相同的-a -t -n和优先级 Enable SMI counting |
| 关于输出打印的选项 | ||
| -h | –histogram=US | 测试完成后输出一个直方图,并输出延时小于US的次数统计。 |
| -H | –histofall=US --histfile= | 类似于-h,输出一个柱状图 指定输出文件的路径 |
| -M | –refresh_on_max | delay updating the screen until a new max latency is hit. Userful for low bandwidth. |
| -q | –quiet | 测试结束后再输出结果 |
| -o | –oscope=RED | 使用’示波器’模式,以减少RED冗长的输出信息 |
| -u | –unbuffered | force unbuffered output for live processing |
| -v | -verbose | 把测试信息输出到stdout |
| tracing相关的选项 | ||
| -b | –breaktrace=USEC | 当出现大于USEC的延时后,立即退出测试 |
| -O | –traceopt=TOPT | trace option |
| -T | –tracer=TRACER | (同-b一起使用)用来指定ftrace的tracer类型,例如:function_graph function nop blk |
| -B | –preemptirqs | (同-b一起使用)追踪preempt和irqoff |
| -E | –event | (同-b一起使用)进行event tracing |
| -I | –irqsoff | (同-b一起使用)追踪irqsoff |
| -P | –preemptoff --policy=NAME --priospread | (同-b一起使用)追踪Preempt off 设置实时进程的调度策略:other, normal, batch, idle, fifo or rr. spread priority levels starting at specified value |
| -w | –wakeup | (同-b一起使用)追踪wakeup |
| -f | –ftrace | (同-b一起使用)使用ftrace |
| -C | –context | (同-b一起使用)追踪context switch |
| -W | –wakeuprt --dbg_cyclictest | (同-b一起使用)追踪wakeuprt。 打印cyclictest的调试信息。 |
参数含义
| T | 线程 |
|---|---|
| P | 线程优先级 |
| C | 计数器。线程的时间间隔每达到一次,计数器加1 |
| I | 时间间隔(us) |
| Min | 最小延时(us) |
| Act | 最近一次的延时(us) |
| Avg | 平均延时(us) |
| Max | 最大延时(us) |
6 linux 实时性改进
目前影响Linux内核实时性因素主要有时钟精度、系统中断、进程调度算法和内核可抢占性等。
某版本上发布实时补丁或者内核改造
| 性能 | 直接修改内核 | 直接修改内核 | 双内核 | 双内核 | 双内核 |
|---|---|---|---|---|---|
| RT-patch | 其他 | RT-Linux | RTAI | xenomai | |
| 实时性 | 好 | 差 | 好 | 较好 | 较好 |
| 硬件支持 | 较好 | 好 | 一般 | 一般 | 较好 |
| API | 丰富 | 一般 | 一般 | 一般 | 丰富 |
| 维护难度 | 易 | 易 | 难 | 难 | 难 |
| 社区活跃度 | 较好 | 差 | 较差 | 一般 | 良好 |
| 用户态实时任务 | 支持 | 支持 | 不支持 | 支持 | 支持 |
| 内核实时任务 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
打补丁【RT-patch】
双内核【RT-Linux、RTAI、Xenomai】
代表有RT-Linux、RTAI(Real-Time Application Interface)和Xenomai。

-
RT-Linux(Real-Time Linux)【停止更新】
采用了双内核的做法。简单理解就是系统中存在两个内核,实时核和非实时核。底层硬件资源和实时的内核打交道绕开非实时核,来自硬件的中断源由实时核全面接管, -
Xenomai【更新中】
借鉴了RT-Linux的双内核做法,内部也有实时核和非实时核。但不同的是Xenomai在底层硬件和两个内核之间还加了一层硬件抽象层ADEOS(Adoptive Domain Environment for Operating System),实时核和非实时核作为硬件抽象层的两个域而存在,Xenomai内核属于实时域,Linux内核属于非实时域。ADEOS在系统的关键路径中对中断进行拦截,优先响应Xenomai实时域的中断,当没有实时任务和中断需要处理的时候才会轮到Linux内核执行。两者对比如下。

-
RTAI
同样借鉴RT-Linux。
时钟精度调整
提升时钟精度,系统中的调度会加快,优点是进程的响应提高,缺点进程切换开销增加,要根据具体使用场景来评估合理性。
中断调整
RTOS和Linux中,硬件中断的响应优先级永远是最高的。
OrangePi AIpro(8T) 开发板【昇腾310B4】查看系统的所有中断
cat /proc/interrupts
(base) root@orangepiaipro:~# cat /proc/interruptsCPU0 CPU1 CPU2 CPU39: 0 0 0 0 GICv3 25 Level vgic11: 0 0 0 0 GICv3 30 Level kvm guest ptimer12: 0 0 0 0 GICv3 27 Level kvm guest vtimer13: 4728702 1741435 1607592 1272102 GICv3 26 Level arch_timer14: 1 0 0 0 GICv3 201 Level uart-pl01115: 0 0 0 0 GICv3 298 Level c42e0000.watchdog18: 0 0 0 0 GICv3 23 Level arm-pmu19: 1 0 0 0 GICv3 319 Edge APEI:HED20: 0 0 0 0 GICv3 177 Level gpio21: 0 0 0 0 GICv3 178 Level gpio22: 0 0 0 0 GICv3 179 Level gpio23: 0 0 0 0 GICv3 181 Level gpio24: 0 0 0 0 GICv3 182 Level gpio25: 0 0 0 0 GICv3 183 Level gpio26: 0 0 0 0 GICv3 249 Edge hns3-a7100000.xge0-TxRx-027: 0 0 0 0 GICv3 250 Edge hns3-a7100000.xge0-TxRx-228: 0 0 0 0 GICv3 251 Edge hns3-a7100000.xge0-TxRx-429: 0 0 0 0 GICv3 252 Edge hns3-a7100000.xge0-TxRx-642: 0 0 0 0 GICv3 265 Level hnsplf-abn-a7100000.xge043: 1 0 0 0 GICv3 269 Level hnsplf-mac-a7100000.xge044: 0 0 0 0 GICv3 241 Level hnsplf-rtc-a7100000.xge054: 5 0 0 0 GICv3 133 Level dvpp_ipcm055: 0 0 0 0 GICv3 134 Level dvpp_ipcm156: 0 0 0 0 GICv3 135 Level dvpp_ipcm258: 0 0 0 0 GICv3 286 Level MIPI_RX59: 0 0 0 0 GICv3 291 Level SLVS_EC60: 8 0 0 0 GICv3 290 Level tc_ns_client61: 0 0 0 0 GICv3 279 Level hisi-i2c62: 0 0 0 0 GICv3 280 Level hisi-i2c63: 0 0 0 0 GICv3 281 Level hisi-i2c64: 0 0 0 0 GICv3 282 Level hisi-i2c65: 158 0 0 0 GICv3 185 Level hisi-i2c66: 0 0 0 0 GICv3 186 Level hisi-i2c67: 0 0 0 0 GICv3 187 Level hisi-i2c68: 27 0 0 0 GICv3 188 Level hisi-i2c69: 448 0 0 0 GICv3 189 Level hisi-i2c70: 0 0 0 0 GICv3 192 Level hisi-i2c71: 0 0 0 0 GICv3 193 Level 82020000.spi072: 0 0 0 0 GICv3 194 Level 82030000.spi173: 0 0 0 0 GICv3 283 Level 3001b0000.spi374: 0 0 0 0 GICv3 284 Level 3001c0000.spi475: 0 0 0 0 GICv3 195 Level c40b0000.spi580: 0 0 0 0 ITS-pMSI 75776 Edge arm-smmu-v3-evtq81: 0 0 0 0 ITS-pMSI 75777 Edge arm-smmu-v3-gerror82: 0 0 0 0 ITS-pMSI 77824 Edge arm-smmu-v3-evtq83: 0 0 0 0 ITS-pMSI 77825 Edge arm-smmu-v3-gerror84: 0 0 0 0 ITS-pMSI 79872 Edge arm-smmu-v3-evtq85: 0 0 0 0 ITS-pMSI 79873 Edge arm-smmu-v3-gerror86: 0 0 0 0 ITS-pMSI 81920 Edge arm-smmu-v3-evtq87: 0 0 0 0 ITS-pMSI 81921 Edge arm-smmu-v3-gerror88: 0 0 0 0 ITS-pMSI 83968 Edge arm-smmu-v3-evtq89: 0 0 0 0 ITS-pMSI 83969 Edge arm-smmu-v3-gerror90: 0 0 0 0 ITS-pMSI 86016 Edge arm-smmu-v3-evtq91: 0 0 0 0 ITS-pMSI 86017 Edge arm-smmu-v3-gerror92: 0 0 0 8 mbigen-v2 916 Level mmc093: 48205 0 0 0 mbigen-v2 917 Level mmc195: 0 1 0 0 ITS-MSI 0 Edge PCIe PME, aerdrv, pciehp96: 0 0 0 0 mbigen-v2 699 Level mailbox-0-lp-rx-acpu097: 0 0 0 3089 mbigen-v2 700 Level mailbox-1-lp-rx-acpu198: 69 0 0 0 mbigen-v2 701 Level mailbox-2-lp-rx-acpu299: 0 5 0 0 mbigen-v2 702 Level mailbox-3-lp-rx-acpu3
100: 0 0 0 0 mbigen-v2 628 Level ts_ipc_done_interrupt
101: 0 0 0 0 mbigen-v2 629 Level ts_ipc_done_interrupt
102: 0 0 0 0 mbigen-v2 630 Level ts_ipc_done_interrupt
103: 0 0 0 0 mbigen-v2 631 Level ts_ipc_done_interrupt
104: 0 0 0 0 mbigen-v2 632 Level ts_ipc_done_interrupt
105: 0 0 0 0 mbigen-v2 633 Level ts_ipc_done_interrupt
106: 0 0 0 0 mbigen-v2 634 Level ts_ipc_done_interrupt
107: 0 0 0 0 mbigen-v2 635 Level ts_ipc_done_interrupt
108: 0 0 0 0 mbigen-v2 636 Level mailbox-8-ts-rx-acpu0
109: 0 0 0 0 mbigen-v2 637 Level mailbox-9-ts-rx-acpu1
110: 0 0 0 0 mbigen-v2 638 Level mailbox-10-ts-rx-acpu2
111: 0 5 0 0 mbigen-v2 639 Level mailbox-11-ts-rx-acpu3
112: 0 0 0 0 mbigen-v2 594 Level irq_route_to_ts
113: 0 0 0 0 mbigen-v2 595 Level irq_route_to_ts
114: 0 0 0 0 mbigen-v2 596 Level irq_route_to_ts
115: 0 0 0 0 mbigen-v2 597 Level irq_route_to_ts
116: 0 0 0 0 mbigen-v2 598 Level irq_route_to_ts
117: 0 0 0 0 mbigen-v2 599 Level irq_route_to_ts
118: 0 0 0 0 mbigen-v2 600 Level irq_route_to_ts
119: 0 0 0 0 mbigen-v2 601 Level irq_route_to_ts
120: 0 0 0 0 mbigen-v2 602 Level irq_route_to_ts
121: 0 0 0 0 mbigen-v2 603 Level irq_route_to_ts
122: 0 0 0 0 mbigen-v2 604 Level irq_route_to_ts
123: 0 0 0 0 mbigen-v2 605 Level irq_route_to_ts
124: 0 0 0 0 mbigen-v2 606 Level irq_route_to_ts
125: 0 0 0 0 mbigen-v2 607 Level irq_route_to_ts
126: 0 0 0 0 mbigen-v2 608 Level sq_trigger
127: 15 0 0 0 mbigen-v2 609 Level trs-mbox-0-0
128: 1551 0 0 0 mbigen-v2 610 Level maint_cq
132: 0 0 0 0 mbigen-v2 614 Level cqe_done
138: 0 0 0 0 mbigen-v2 620 Level topic_sched_ccpu
141: 0 0 0 0 mbigen-v2 623 Level topic_sched_aicpu
146: 0 0 0 0 mbigen-v2 934 Level VI_CAP0
147: 0 0 0 0 mbigen-v2 935 Level VI_PROC0
148: 0 0 0 0 mbigen-v2 936 Level VPSS
155: 0 0 0 0 mbigen-v2 663 Level VEDU_0
156: 0 0 0 0 mbigen-v2 665 Level VEDU_1
160: 0 0 0 0 mbigen-v2 831 Level VGS
161: 0 0 0 0 mbigen-v2 830 Level GDC
162: 0 0 0 0 mbigen-v2 590 Level asp_dma_irq
163: 0 0 0 0 mbigen-v2 918 Level xhci-hcd:usb1
164: 0 695298 0 0 mbigen-v2 922 Level xhci-hcd:usb3
165: 0 0 1152 0 mbigen-v2 926 Level xhci-hcd:usb5
166: 0 190 0 0 mbigen-v2 930 Level xhci-hcd:usb7
167: 0 0 0 0 gpio-dwapb 2 Edge drv_power_off
168: 0 0 568143 0 mbigen-v2 910 Level DRM_0
IPI0: 753334 324877 530484 343726 Rescheduling interrupts
IPI1: 1424 6291 6018 12370 Function call interrupts
IPI2: 0 0 0 0 CPU stop interrupts
IPI3: 0 0 0 0 CPU stop (for crash dump) interrupts
IPI4: 0 0 0 0 Timer broadcast interrupts
IPI5: 0 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 CPU wake-up interrupts
IPI7: 0 0 0 0 User function call interrupts
Err: 0
(base) root@orangepiaipro:~#

将某中断绑定到某CPU
echo "1" > /proc/irq/30/smp_affinity
进程调度算法
Linux系统目前默认采用的是完全公平调度算法(CFS),它按照各个进程的权重来分配运行时间。
使用CFS的情况下,我们可以给有实时性需求的进程分配更高的优先级和权重。
Linux内核目前支持的调度类有:stop、deadline、realtime、CFS、idle。、它们的优先级依次由高到底排序。
deadline调度类包含如下调度策略:
- SCHED_DEADLINE
realtime调度类包含如下调度策略:
- SCHED_FIFO
- SCHED_RR
CFS调度类包含如下调度策略:
- SCHED_NORMAI
- SCHED_BATCH
- SCHED_IDLE
其他策略,绑核
如果核多,可以将实时性要求高的进程绑核。
参考
1、深入理解与实现 RTOS
2、FreeRTOS–中断管理
3、嵌入式Linux实时系统的特点和Linux内核在实时应用方面的不足
4、浅谈Linux内核的实时性优化
5、xenomai内核解析之嵌入式实时linux概述
6、开源IgH EtherCAT主站方案,基于IMX8、ZYNQ、AM335x、T3等平台
7、树莓派:给内核打上实时补丁(RT-patch)
8、关于RK3568 Linux内核打实时补丁RT Preempt介绍
9、Linux RT补丁/分析/性能测试(@Ubuntu)
10、cyclictest的交叉编译、原理与测试
相关文章:
linux--实时性优化
linux--实时性优化 1 介绍2 实时性需求3 代表性实时系统4 嵌入式系统嵌入式软件系统结构处理器时钟节拍多任务机制任务调度方式任务调度算法时间片调度算法优先级调度算法基于优先级的时间片调度算法 5 cyclictest 测试工具命令说明命令分析参数含义 6 linux 实时性改进某版本上…...
React-基础样式控制
组件基础样式方案 React组件基础的样式控制有两种方式 1、行内样式(不推荐) 属性名是多个单词的需要使用驼峰写法 也可以把样式都提取到一个变量里,再赋值到style里 2、class类名控制 classnames优化类名控制 classnames是一个简单的JS库&…...
制作ChatPDF之前端Vue搭建(二)
前端界面 接上篇: 制作ChatPDF之Elasticsearch8.13.4搭建(一) 为了实现一个基于 Vue.js 的前端应用,用户可以上传 PDF 文件,输入查询,并在输出框中显示查询结果,你需要以下步骤: 初始化 Vue …...
汽车IVI中控开发入门及进阶(二十一):DAB和FM 收音机
前言: 在过去的十年里,数字收音机对车载娱乐产生了重大影响。现在,几乎每辆新车都标配了这项技术,这也是我们60%以上的人收听收音机的方式。甚至有传言称,在不久的将来,将永久关闭调频发射机,使许多车载收音机过时。但一些相对年轻的汽车在工厂里仍然没有安装DAB,而且…...
智能sql LLM
DB-GPT:彻底改变数据库与私有LLM技术的交互 智能SQL生成:后端技术与LLM的完美结合 智能SQL生成:后端技术与LLM的完美结合_llm sql-CSDN博客 GitHub - eosphoros-ai/DB-GPT: AI Native Data App Development framework with AWEL(Agentic Wor…...
大聪明教你学Java | 深入浅出聊 Stream.parallel()
前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言Ǵ…...
图解大模型分布式并行各种通信原语
背景 在分布式集群上执行大模型任务时候,往往使用到数据并行,流水线并行,张量并行等技术,这些技术本质上也就是对数据进行各种方案的切分,然后放到不同的节点上运算。不同节点在计算的过程中需要对数据分发或者同步等…...
张大哥笔记:下一个风口是什么?
我们经常会问,下一个风口是什么?我们可以大胆预测一下,2024年的风口是什么呢? 40年前,如果你会开车,那就是响当当的铁饭碗; 30年前,如果你会英语和电脑,那也绝对是个人才…...
AI去衣技术中的几何着色:揭秘数字时尚的魔法
在数字化时代,人工智能(AI)正以前所未有的速度改变我们的生活,从智能家居到自动驾驶汽车,再到个性化医疗。然而,AI的影响远不止于此。它正在重塑我们对艺术、设计和时尚的理解。特别是在数字时尚领域&#…...
Leecode---技巧---只出现一次的数字 / 多数元素
题解: 利用异或运算 a⊕a 0 的性质,可用来消除所有出现了两次的元素,最后剩余的即为所得。 class Solution { public:int singleNumber(vector<int>& nums){// 初始化为0int ans 0;for(int x: nums){// 异或操作ans ^ x;}retur…...
为图片设置经纬度信息
一、java实现 小编看了很多技术博客,但是测试要么下载的jar包中的api和博客对不上,要么就是不对,总之没实现 Java 读取图片信息 java 写入 exif 信息 使用Java读取和修改图片的Exif信息 java获取图片的GPS信息 https://drewnoakes.com/code/e…...
密码和密钥的联系与区别
密码和密钥是两个非常重要的概念,但容易混淆这两者,以下内容介绍了它们的联系和区别: 一、定义 密码(Password),在日常语境中,通常指的是个人为了验证自己的身份而设置的一段秘密的字符序列&am…...
C++编程法则365天一天一条(323)main函数执行之前和之后的动作
在C和C程序中,main 函数之前和之后执行的函数是由编译器、链接器和运行时环境共同决定的。以下是一些通常会在这些阶段执行的关键函数: 在 main 函数之前执行的函数 启动代码(Start-up Code): 这是由编译器提供的一段代码&#…...
阿里云短信服务使用(Java)
文章目录 一、流程1.打开短信服务2.提交材料申请资质3.资质通过后,申请短信签名并设置短信模板4.右上角设置AccessKey5.充值 二、参考官方文档调用API1.引入maven依赖2.调用API补充 一、流程 1.打开短信服务 登陆注册阿里云 搜索“短信服务”,点击“免…...
C++17之std::void_t
目录 1.std::void_t 的原理 2.std::void_t 的应用 2.1.判断成员存在性 2.1.1.判断嵌套类型定义 2.1.2 判断成员是否存在 2.2 判断表达式是否合法 2.2.1 判断是否支持前置运算符 2.2.3 判断两个类型是否可做加法运算 3.std::void_t 与 std::enable_if 1.std::void_t 的…...
零基础入门篇①⑥ Python可变序列类型--字典
Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…...
C语言面试题1-10
C语言中的内存管理及相关问题探讨 在C语言编程中,内存管理是一个至关重要的概念,掌握内存的分布及其操作不仅能够提高代码效率,还能避免常见的内存泄漏等问题。本文将详细介绍C语言中内存的分布、堆区和栈区的区别、标识符的命名规则、定义和…...
Qt Designer工具如何修改MainWindow窗口的标题
Qt Designer工具如何修改MainWindow窗口的标题 在MainWindow的属性编辑器中选择“windowTitle”后面一栏修改成期望的窗口标题名称即可。 按住“ctrlR”即可查看可视化界面的窗口标题...
车辆前向碰撞预警系统性能要求和测试规程
前言 本文整理《GB/T 33577-2017 智能运输系统-车辆前向碰撞预警系统性能要求和测试规程》国标文件关键信息,FCW系统性能和测试右给深层次的认识。 术语和定义 车辆前向碰撞预警系统 forward vehicle collision warning system自车 subject vehicle(SV)目标车辆 target ve…...
C#实现winform中渲染图的展示
在WinForms中实现图形的渲染展示,可以使用GDI绘图技术。下面是一个简单的示例,演示如何在WinForms中展示一个圆形图形,并根据用户输入的半径动态改变圆的大小: 请在Visual Studio中创建一个WinForms应用程序,并将以下…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
