1

我正在尝试为 FreeRTOS 创建 OSAL(操作系统抽象层)适配器,但与提供的接口混淆。

例如,RiCOSTask 的 init 函数在文档中定义如下:

RiCBoolean RiCOSTask_init (RiCOSTask *const me,
    RiCOSTaskEndCallBack tfunc, void *param,
    const char *name, const long stackSize);

https://www.ibm.com/support/knowledgecenter/SSB2MU_8.1.3/com.ibm.rhp.reference.doc/topics/rhp_r_fw_init_ricostask.html

但是 RiCTaskEM 像下面这样调用这个函数:

RiCBoolean RiCTaskEM_init(RiCBoolean wrapTask,RiCThread * const 
itsThread,RiCBoolean isThread,const RiCOSTaskEntryCallBack cbkFunc,const 
RhpAddress cbkParam,RhpPositive initStaticPeriod)
{
        ..........

        (RhpVoid) RiCOSTask_init(&(itsThread->osTask), cbkFunc, cbkParam, initStaticPeriod);

        ...........
}

我想我的配置有问题。我将 SMXF 与 Rhapsody 8.1.3 一起使用。

另一个问题是,我的测试类的 init 函数调用 RiCTaskEM_init 方法,如下所示:

void smxfTestClass_Init(smxfTestClass* const me, RiCTaskEM * p_task) {
    RiCTaskEM_init(&(me->ric_task), RiCFALSE, &(me->ric_thread), RiCTRUE,
        (RiCOSTaskEntryCallBack)smxfTestClass_doExecute, me, 0U);
    .......
}

但是如果我设置我的班级的一个属性,例如。ActiveThreadName,对 RiCTaskEM_Init 函数的调用更改如下:

void smxfTestClass_Init(smxfTestClass* const me, RiCTaskEM * p_task) {
    RiCTaskEM_Init(&(me->ric_task), "Test", RiCOSDefaultThreadPriority,
        RiCOSDefaultStackSize, RiCOSDefaultMessageQueueSize, RiCFALSE, NULL);
    ......
}

并且编译失败是因为 RiCTaskEM_Init 的原型与上面的调用不兼容。它是这样定义的:

RiCBoolean RiCTaskEM_init(RiCBoolean wrapTask,RiCThread * const
    itsThread,RiCBoolean isThread,const RiCOSTaskEntryCallBack cbkFunc,const
    RhpAddress cbkParam,RhpPositive initStaticPeriod)
  • 怎么了 ?我使用的 Rhapsody 版本和 SMXF 模型是否不匹配?
  • 如果我设置我的类的属性,为什么以不同的方式调用 RiCTaskEM_init 方法?第二个版本似乎是正确的,但提供的 RiCTaskEM_init 方法与它不兼容。
  • 我是否必须以某种方式修改 RiCTaskEM 的功能?我猜不,因为它属于框架,而不是适配器和 OSAL 适配器指南没有提到任何关于它的内容。但是当前的实现根本不适合。
4

1 回答 1

0

该文档是为 OXF 编写的,而不是为 SMXF 框架编写的。据我所知,没有适用于 SMXF 的真正文档,但是.. SMXF 作为模型存在(检查您的 /LangC/smxf 目录),这应该可以更轻松地创建适配器。您真的需要 SMXF 还是 OXF 就足够了(甚至是像 RXF 这样的其他框架?

沃尔特

于 2017-04-10T11:56:28.590 回答