实时系统优先级设置与修改

发布于:2025-03-16 ⋅ 阅读:(10) ⋅ 点赞:(0)

实时系统优先级设置与修改

当我想使用sched_setscheduler,直接在驱动中修改实时线程的优先级时,我发现会报一个错误,ERROR: modpost: “sched_setscheduler” [/home/orangepi/gpio/interrupt/interrupt.ko] undefined!
我去查找/lib/modules/6.1.43/build/kerbel/sched/下面只有一个Makefile,sched_setscheduler的具体实现应该是在该目录下有一个core.c里才有,但是这个文件并未出现,经过我的查找,宋宝华的这篇文章内核优先级设置中写了,有个大神为了避免有人瞎设置内核优先级,他将这些接口全部删掉了,只保留了三个。
sched_set_fifo§
sched_set_fifo_low§
sched_set_normal(p, nice)
但是sched_set_fifo只能设置默认实时优先级为50,sched_set_fifo_low设置为1,sched_set_normal只能设置为普通策略,不能是实时策略,所以我们先选择将优先级设置成50,然后再用命令去修改。
当然我还找到了解决方案:
解决方案
I modify the file “kernel/sched/core.c” to add EXPORT_SYMBOL_GPL(sched_setscheduler) to test.
我修改了文件 “kernel/sched/core.c” 以添加 EXPORT_SYMBOL_GPL(sched_setscheduler) 进行测试。
Rebuild the kernel image then rebuild the driver, it did work.
但是这个我没试过。
重建内核镜像,然后重建驱动程序,它确实有效。
如果不想重新编译内核或者是想随时修改这个优先级,那么可以用下面的方法,参考沐多大神的文章添加链接描述,在你设置了默认中断优先级为50后。
临时去修改实时优先级的命令可以使用

gpio_interrupt是中断名称

ps -eLf | grep gpio_interrupt

在这里插入图片描述
然后会显示中断的进程号,查看中断优先级

chrt -p 12586

在这里插入图片描述
修改中断优先级

chrt -f -p 60 12586

在这里插入图片描述
可以看到你的优先级已经被修改到了60。
上面的是在命令行中修改,你也可以用rtirq去修改
安装rtirq
sudo apt install rtirq-init
默认会生成脚本/etc/default/rtirq,修改这个脚本

# IRQ thread service names
# (space separated list, from higher to lower priority).
# RTIRQ_NAME_LIST="rtc snd usb i8042" # old
RTIRQ_NAME_LIST="gpio_interrupt1 gpio_interrupt2" #这里写你的中断名称

# Highest priority.
RTIRQ_PRIO_HIGH=90   

# Priority decrease step.
RTIRQ_PRIO_DECR=5

# Lowest priority.
RTIRQ_PRIO_LOW=51

# Whether to reset all IRQ threads to SCHED_OTHER.
RTIRQ_RESET_ALL=0

# On kernel configurations that support it,
# which services should be NOT threaded 
# (space separated list).
RTIRQ_NON_THREADED="rtc snd"

# Process names which will be forced to the
# highest realtime priority range (99-91)
# (space separated list, from highest to lower priority).
# RTIRQ_HIGH_LIST="timer"

保存后选择执行

/etc/init.d/rtirq start 

在这里插入图片描述
优先级会按照最高优先级减步长递减到设置的中断名称上。
保存后以后会开机自启动。
附带我的驱动代码资源可以到资源里下载。
参考文章:
宋宝华文章
如何修改内核文章
沐多大神文章