SylixOS嵌入式操作系统|论坛

 找回密码
 注册
搜索
查看: 12692|回复: 10
打印 上一主题 下一主题

RM的测试例子

[复制链接]

2

主题

5

帖子

68

积分

注册会员

Rank: 2

积分
68
跳转到指定楼层
楼主
发表于 2015-5-14 19:45:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Hi!最近我们实验室正在研究RM算法的实现,看到SylixOS已经实现了该算法,自然过来学习学习下!目前已经在qemu上成功跑上了sylixos!也跑通了example里面的一些例程!不知道是否能提供下RM相关代码的测试例子吗?
回复

使用道具 举报

2

主题

5

帖子

68

积分

注册会员

Rank: 2

积分
68
沙发
 楼主| 发表于 2015-5-14 20:02:18 | 只看该作者
能否提供下内核模块测试的demo呢?
回复 支持 反对

使用道具 举报

4

主题

9

帖子

151

积分

版主

Rank: 7Rank: 7Rank: 7

积分
151
板凳
发表于 2015-5-18 11:14:35 | 只看该作者
内核模块测试的demo在examples工程内, hello_module子工程就是了
回复 支持 反对

使用道具 举报

2

主题

5

帖子

68

积分

注册会员

Rank: 2

积分
68
地板
 楼主| 发表于 2015-5-18 12:28:38 | 只看该作者
这仅仅是一个最简单的demo,有rm调度算法的demo吗?
回复 支持 反对

使用道具 举报

17

主题

81

帖子

1173

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1173
5#
发表于 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 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;
}


回复 支持 反对

使用道具 举报

2

主题

5

帖子

68

积分

注册会员

Rank: 2

积分
68
6#
 楼主| 发表于 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吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

17

主题

81

帖子

1173

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1173
7#
发表于 2015-6-17 17:58:36 | 只看该作者
RMS 控制块只存在于用户进程,相当于一个全局变量,所以不存在销毁问题。

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

使用道具 举报

0

主题

2

帖子

20

积分

新手上路

Rank: 1

积分
20
8#
发表于 2016-8-6 16:57:21 | 只看该作者
我下载的试用版本的环境,新建一个工程时,向导提示指定base

E:\图片\042.jpg
回复 支持 反对

使用道具 举报

0

主题

2

帖子

20

积分

新手上路

Rank: 1

积分
20
9#
发表于 2016-8-6 16:58:38 | 只看该作者
我没有示例项目,找不到那个文件夹
回复 支持 反对

使用道具 举报

2

主题

7

帖子

188

积分

注册会员

Rank: 2

积分
188
10#
发表于 2016-8-30 12:19:41 | 只看该作者
SylixOS的进程是怎么切换的啊?切换的时间是多少呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|Acoinfo Inc. All Rights Reserved. ( 京ICP备15059934号

GMT+8, 2024-12-4 02:12 , Processed in 0.028613 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表