SylixOS嵌入式操作系统|论坛

标题: RM的测试例子 [打印本页]

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

作者: ffddybz    时间: 2015-5-14 20:02
能否提供下内核模块测试的demo呢?
作者: 风城少主    时间: 2015-5-18 11:14
内核模块测试的demo在examples工程内, hello_module子工程就是了
作者: ffddybz    时间: 2015-5-18 12:28
这仅仅是一个最简单的demo,有rm调度算法的demo吗?
作者: sylixos    时间: 2015-5-19 17:24
你说的是 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 timespec  period = {0, 5 * 1000 * 1000};
        struct timespec  last   = {0, 0};
        struct timespec  now, diff;
        volatile int a;
       
        if (argc >= 2) {
                period.tv_nsec = atoi(argv[1]) * 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
标题: eclipse调试应用程序
本帖最后由 ffddybz 于 2015-6-4 16:31 编辑

根据你们给的例子现在跑通了RMS的例子,并且可以用gdb单步调试了
看了下sched_rms_period的实现,执行以下流程:
1)任务未被激活时,会去更新时间,改变任务运行状态
2)任务被激活了,会去判断该周期的任务是否超时,如果否的话会一直休眠到下一个周期的到来。

而在sched_rms_destory中,做的是改变rms状态的动作,我想问的是真正的rms对象的删除是在哪里发生的?
如果说在删除rms任务后就有一个新的rms任务被激活了,该任务能立马运行,这可能会带来一些问题,如下图所示:
[attach]233[/attach]

另外可以提供多线程多个rms任务的例子吗?(由于是新手,多线程都不会写)

另外的另外,发现了代码中有一些注释错误,能够提供git账号发pull request吗?

作者: sylixos    时间: 2015-6-17 17:58
RMS 控制块只存在于用户进程,相当于一个全局变量,所以不存在销毁问题。

一个 RMS 只能服务一个线程,但一个线程可以有多个 RMS, 这样可以实现多周期调度。
作者: yanteng    时间: 2016-8-6 16:57
我下载的试用版本的环境,新建一个工程时,向导提示指定base

E:\图片\042.jpg
作者: yanteng    时间: 2016-8-6 16:58
我没有示例项目,找不到那个文件夹
作者: wxfzy    时间: 2016-8-30 12:19
SylixOS的进程是怎么切换的啊?切换的时间是多少呢?
作者: lixiaocheng    时间: 2016-9-8 09:45
sylixos 切换时线程级的,即所有进程的线程按照 优先级自动进行调度, sylixos的进程类似vxworks的vproc, 所有进程里的地址空间是共享的,其他的fd和内核对象是独立的,进程间线程切换和进程内线程切换消耗时间基本一样, 具体时间可以参考官方 提供的实时测试数据报告。




欢迎光临 SylixOS嵌入式操作系统|论坛 (https://bbs.sylixos.com/) Powered by Discuz! X3.2