rtems中指针的指针

11 views
Skip to first unread message

loveQ

unread,
Jul 8, 2009, 3:14:29 AM7/8/09
to RTEMS Chinese User Group
RTEMS文档中
rtems_status_code rtems_task_variable_add(
rtems_id tid,
void **task_variable,
void (*dtor)(void *)
);
这个函数用来添加一个单任务变量,这里的任务变量为什么要用void **而不用void *呢,可能我C语言没有学好,希望大家给我讲解一下。
还有这个析构函数指针,是在任务退出时将这个单任务变量的值传出来么?

julyon

unread,
Jul 8, 2009, 8:31:02 AM7/8/09
to RTEMS Chinese User Group
1.RTEMS的任务变量必须是指针类型的,替换的是指针本身,所以void **而不用void *,可以参考以前的帖子,要是传入的是void
*,那只能等到指针指向的数据。
2.析构函数一般是rtems_task_variable_delete的时候调用的,因为当调用rtems_task_variable_add的
时候,需要调用malloc为指针分配空间,因此析构函数提供了一个接口让用户free掉。当然可以提供其他的用途,这就看需求了。
3.似乎大家都对这个任务变量很感兴趣。我觉得大多数是由于这个任务变量涉及的函数比较多,譬如
_RTEMS_tasks_Switch_extension,所以大家有点晕吧。

xu ray

unread,
Jul 8, 2009, 8:50:12 AM7/8/09
to rtems-chines...@googlegroups.com
函数传入参数是 **类型的, 十有八九是在函数中需要分配内存,否则,普通处理用不了这么复杂。
建议Julyon写一个关于任务变量的文档,造福大家,哈哈。

2009/7/8 julyon <jul...@126.com>



--
Thanks & Best Regards!

Ray, Xu

loveQ

unread,
Jul 8, 2009, 9:08:35 PM7/8/09
to RTEMS Chinese User Group
我不知道这样理解对不对:
在这个单任务变量添加函数中会在这个任务的堆上分配存储这个变量值的空间,然后将这个单任务变量的值赋给这个存储区,函数退出的时候不至于丢失这个地
址,就把这个新分配空间的地址赋给这个指针的指针,代码可以这样表示
void *p=malloc(...);
(*p)=**task_variable; //task_variable是单任务变量的指针的指针
(*task_variable)=p;

> Ray, Xu- Hide quoted text -
>
> - Show quoted text -

Ziyu Yu

unread,
Jul 8, 2009, 10:12:29 PM7/8/09
to rtems-chines...@googlegroups.com
既然是void类型的.那内核怎么知道变量的长度是多少呢?只能是固定大小?

xu ray

unread,
Jul 9, 2009, 6:11:46 AM7/9/09
to rtems-chines...@googlegroups.com
per task variable 建议大家看看例子SP28。里面有详细的如何使用per task variable(tv)的说明,同时运行一下这个例子可以看看结果。
void **的说明julyon说的非常明了,可以仔细体味一下。

rtems_task_variable_add只为tv控制体分配内存,对于复杂结构的taskvariable, 可以参考libmisc/shell/shell.c的代码。结构复杂的task var就需要 dtor来帮忙释放。

此外,需要注意的一点是tv对于实时系统的实时性来说,是有一定影响的。每次任务切换都需要遍历整个tv链表,所以如果tv太多,势必增加遍历时间,影响实时性。个人认为tv相关的API是整个系统中用的比较少的API,大家不用太关注。





2009/7/9 Ziyu Yu <yuziy...@gmail.com>
既然是void类型的.那内核怎么知道变量的长度是多少呢?只能是固定大小?


Reply all
Reply to author
Forward
0 new messages