Open laokz opened 2 months ago
测试环境测过两个系统版本
经过验证,x86下可以正常运行,而riscv64则运行错误
riscv64
x86
调试发现,在riscv64下执行 sched_setscheduler() 的时候出现了错误,因此会将errno变量的数值置为1,并打印相关错误信息(函数详细见 https://www.man7.org/linux/man-pages/man2/sched_setscheduler.2.html).
为探究是否是函数本身的问题,在x86和riscv64下对函数单独进行了测试
结果riscv64下无法通过,会进入异常,而x86下则完美通过。
后面尝试修改函数的参数,发现riscv6在非即时调度策略的情况下可以通过。
非即时调度策略:
SCHED_OTHER: the standard round-robin time-sharing policy;
以下策略貌似openEuler不可用
SCHED_BATCH and SCHED_IDLE are Linux-specific.
SCHED_BATCH: for "batch" style execution of processes; and
SCHED_IDLE: for running very low priority background jobs.
对于上述每个策略,param->sched_priority必须为0。
实时调度策略
SCHED_FIFO: a first-in, first-out policy; and
SCHED_RR: a round-robin policy.
对于上述每个策略,param->scheed_priority指定线程的调度优先级。 这是使用指定策略调用sched_get_priority_min()和sched_get_priority_max()返回的范围内的一个数字。在Linux上,这些系统调用分别返回1到99。
初步分析,首先是该函数导致了样例无法通过,其次对于该函数的riscv64的架构可能不支持该函数的FIFO和RR这种RT策略,而其它策略则是可以使用,该函数可能需要完善一下.
调研的很仔细!
我用这个镜像试了下你写的程序,可以通过,是否镜像老旧原因?https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/testing/20240519/v0.1/QEMU/
是的,我换了您给的镜像,首先发现这个样例的程序和我写的这个可以运行了,如下 其次我使用
./runltp -s time-schedule01
发现可以通过样例了,可能这个问题就是存在于低版本镜像上
包括trace_sched01也可能是这个问题,更换成您的版本后通过
https://github.com/openEuler-RISCV/QA/tree/main/testreport/24.03/round1/performance-test/ltp_function