ffddybz 发表于 2015-5-14 19:45:09

RM的测试例子

Hi!最近我们实验室正在研究RM算法的实现,看到SylixOS已经实现了该算法,自然过来学习学习下!目前已经在qemu上成功跑上了sylixos!也跑通了example里面的一些例程!不知道是否能提供下RM相关代码的测试例子吗?

ffddybz 发表于 2015-5-14 20:02:18

能否提供下内核模块测试的demo呢?

风城少主 发表于 2015-5-18 11:14:35

内核模块测试的demo在examples工程内, hello_module子工程就是了

ffddybz 发表于 2015-5-18 12:28:38

这仅仅是一个最简单的demo,有rm调度算法的demo吗?

sylixos 发表于 2015-5-19 17:24:19

你说的是 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;
}


ffddybz 发表于 2015-6-4 16:29:31

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吗?

sylixos 发表于 2015-6-17 17:58:36

RMS 控制块只存在于用户进程,相当于一个全局变量,所以不存在销毁问题。

一个 RMS 只能服务一个线程,但一个线程可以有多个 RMS, 这样可以实现多周期调度。

yanteng 发表于 2016-8-6 16:57:21

我下载的试用版本的环境,新建一个工程时,向导提示指定base

E:\图片\042.jpg

yanteng 发表于 2016-8-6 16:58:38

我没有示例项目,找不到那个文件夹

wxfzy 发表于 2016-8-30 12:19:41

SylixOS的进程是怎么切换的啊?切换的时间是多少呢?
页: [1] 2
查看完整版本: RM的测试例子