Rhapsody 中不兼容的 OSAL 接口
Incompatible OSAL interfaces in Rhapsody
我正在尝试为 FreeRTOS 创建 OSAL(操作系统抽象层)适配器,但与提供的接口混淆。
例如RiCOSTask的init函数在文档中定义如下:
RiCBoolean RiCOSTask_init (RiCOSTask *const me,
RiCOSTaskEndCallBack tfunc, void *param,
const char *name, const long stackSize);
但是 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);
...........
}
我想我的配置有问题。我在 Rhapsody 8.1.3 中使用 SMXF。
另一个问题是,我的测试 class 的初始化函数调用 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);
.......
}
但是如果我设置 class 的 属性,例如。 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 模型不匹配吗?
- 如果我设置 class 的 属性 为什么 RiCTaskEM_init 方法会以不同的方式调用?第二个版本似乎是正确的,但提供的 RiCTaskEM_init 方法与那个不兼容。
- 我是否必须以某种方式修改 RiCTaskEM 的功能?我猜不是,因为它属于框架,而不是适配器,OSAL 适配器指南没有提及任何相关内容。但是目前的实现根本不适合。
文档是为 OXF 编写的,而不是为 SMXF 框架编写的。据我所知,没有关于调整 SMXF 的真实文档,但是……SMXF 作为模型存在(检查您的 /LangC/smxf 目录)
这应该可以更容易地创建适配器。
您真的需要 SMXF 还是 OXF 就足够了(甚至是 RXF 之类的其他框架?
沃尔特
我正在尝试为 FreeRTOS 创建 OSAL(操作系统抽象层)适配器,但与提供的接口混淆。
例如RiCOSTask的init函数在文档中定义如下:
RiCBoolean RiCOSTask_init (RiCOSTask *const me,
RiCOSTaskEndCallBack tfunc, void *param,
const char *name, const long stackSize);
但是 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);
...........
}
我想我的配置有问题。我在 Rhapsody 8.1.3 中使用 SMXF。
另一个问题是,我的测试 class 的初始化函数调用 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);
.......
}
但是如果我设置 class 的 属性,例如。 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 模型不匹配吗?
- 如果我设置 class 的 属性 为什么 RiCTaskEM_init 方法会以不同的方式调用?第二个版本似乎是正确的,但提供的 RiCTaskEM_init 方法与那个不兼容。
- 我是否必须以某种方式修改 RiCTaskEM 的功能?我猜不是,因为它属于框架,而不是适配器,OSAL 适配器指南没有提及任何相关内容。但是目前的实现根本不适合。
文档是为 OXF 编写的,而不是为 SMXF 框架编写的。据我所知,没有关于调整 SMXF 的真实文档,但是……SMXF 作为模型存在(检查您的 /LangC/smxf 目录) 这应该可以更容易地创建适配器。 您真的需要 SMXF 还是 OXF 就足够了(甚至是 RXF 之类的其他框架?
沃尔特