RM的测试例子
Hi!最近我们实验室正在研究RM算法的实现,看到SylixOS已经实现了该算法,自然过来学习学习下!目前已经在qemu上成功跑上了sylixos!也跑通了example里面的一些例程!不知道是否能提供下RM相关代码的测试例子吗?能否提供下内核模块测试的demo呢? 内核模块测试的demo在examples工程内, hello_module子工程就是了 这仅仅是一个最简单的demo,有rm调度算法的demo吗? 你说的是 RMS 调度器?
如果是,测试程序可以这样写:
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <sched_rms.h>
sched_rms_t rms;
#define __TIMEVAL_NSEC_MAX 1000000000
static void timespecSub (struct timespec*ptv1, const struct timespec*ptv2)
{
ptv1->tv_sec-= ptv2->tv_sec;
ptv1->tv_nsec -= ptv2->tv_nsec;
if (ptv1->tv_nsec >= __TIMEVAL_NSEC_MAX) {
ptv1->tv_sec++;
ptv1->tv_nsec -= __TIMEVAL_NSEC_MAX;
} else if (ptv1->tv_nsec < 0) {
ptv1->tv_sec--;
ptv1->tv_nsec += __TIMEVAL_NSEC_MAX;
}
}
int main (int argc, char **argv)
{
struct timespecperiod = {0, 5 * 1000 * 1000};
struct timespeclast = {0, 0};
struct timespecnow, diff;
volatile int a;
if (argc >= 2) {
period.tv_nsec = atoi(argv) * 1000 * 1000;
}
sched_rms_init(&rms, pthread_self());
clock_gettime(CLOCK_MONOTONIC, &last);
while (1) {
sched_rms_period(&rms, &period); // 设置单调执行周期
clock_gettime(CLOCK_MONOTONIC, &now);
diff = now;
timespecSub(&diff, &last);
last = now;
for (a = 0; a < 1000; a++); // 这个地方可以放一个随机延迟函数来模拟程序代码执行所花的时间,可以是随机的, 但不能超过 rms 周期时间
printf("diff is %8lld sec %09ld nsec\n", diff.tv_sec, diff.tv_nsec);
}
return 0;
}
eclipse调试应用程序
本帖最后由 ffddybz 于 2015-6-4 16:31 编辑根据你们给的例子现在跑通了RMS的例子,并且可以用gdb单步调试了
看了下sched_rms_period的实现,执行以下流程:
1)任务未被激活时,会去更新时间,改变任务运行状态
2)任务被激活了,会去判断该周期的任务是否超时,如果否的话会一直休眠到下一个周期的到来。
而在sched_rms_destory中,做的是改变rms状态的动作,我想问的是真正的rms对象的删除是在哪里发生的?
如果说在删除rms任务后就有一个新的rms任务被激活了,该任务能立马运行,这可能会带来一些问题,如下图所示:
另外可以提供多线程多个rms任务的例子吗?(由于是新手,多线程都不会写)
另外的另外,发现了代码中有一些注释错误,能够提供git账号发pull request吗?
RMS 控制块只存在于用户进程,相当于一个全局变量,所以不存在销毁问题。
一个 RMS 只能服务一个线程,但一个线程可以有多个 RMS, 这样可以实现多周期调度。 我下载的试用版本的环境,新建一个工程时,向导提示指定base
E:\图片\042.jpg 我没有示例项目,找不到那个文件夹 SylixOS的进程是怎么切换的啊?切换的时间是多少呢?
页:
[1]
2