相同入口函数启动任务的问题

2 views
Skip to first unread message

高航

unread,
Jun 8, 2009, 3:09:27 AM6/8/09
to RTEMS Chinese User Group
以相同的入口函数创建启动两个任务,这两个任务的代码段、数据段是不是独立的,两个任务交替并发运行时,会不会发生访问变量冲突?请大家帮忙解答一下。

yuziyu

unread,
Jun 8, 2009, 3:15:43 AM6/8/09
to rtems-chines...@googlegroups.com
这个入口函数应该是可重入的吧。如果访问公共资源,肯定要用某种互斥机制,如
信号量

高航 写道:

高航

unread,
Jun 8, 2009, 9:17:01 AM6/8/09
to RTEMS Chinese User Group
多谢。
我就是想知道rtems中的每个任务是否有独立的数据区,若有,不同任务访问同名局部变量就不会冲突了。

yuziyu

unread,
Jun 8, 2009, 11:04:54 AM6/8/09
to rtems-chines...@googlegroups.com
就我理解,rtems的任务就是线程。你指的独立数据区是不是per task variable?


你看下RTEMS C User's Guide


5.4.16: TASK_VARIABLE_ADD - Associate per task variable

高航 写道:

高航

unread,
Jun 18, 2009, 10:53:06 PM6/18/09
to RTEMS Chinese User Group
任务变量(per task variable)主要解决的是多个任务调用相同函数时访问全局变量存在冲突的问题,而我想的问题是多个任务以相同的入口
函数启动会不会存在函数内局部变量的访问冲突。例如,函数my_func中声明一个变量,并在后续的操作中访问这个变量(即Int x; x=a
+b;)。不同的任务都以my_func为入口函数时,都会访问x,这样存在冲突吗?我怎样才能知道任务运行时其数据区的位置(看过rtems源码,但
没找到)?若存在这样的冲突,我的想法是为每个任务复制一个数据区,不知可行否。

冯强

unread,
Jun 18, 2009, 11:10:04 PM6/18/09
to rtems-chines...@googlegroups.com

不存在冲突 我觉得
--- 09年6月19日,周五, 高航 <hangg...@gmail.com> 写道:

发件人: 高航 <hangg...@gmail.com>
主题: Re: 相同入口函数启动任务的问题
收件人: "RTEMS Chinese User Group" <rtems-chines...@googlegroups.com>
日期: 2009年6月19日,周五,上午10:53

Zhongjie

unread,
Jun 18, 2009, 11:28:46 PM6/18/09
to rtems-chines...@googlegroups.com
这个是C语言的问题,不是rtems的问题,对于局部变量,需要看编译器是怎么处理的,
你可以查查你看的CPU的ABI是怎么定要的,gcc应该都是按这些abi处理的

julyon

unread,
Jun 19, 2009, 4:05:43 AM6/19/09
to RTEMS Chinese User Group
这确实一个C语言的问题。一般来说,对于局部变量是在栈里面,所以是不会有冲突的。而对于全局变量,或者静态变量,就会有影响。所以,RTEMS为我们
提供了任务变量,这样的话,当操作这些变量时,其他任务的操作不会影响到这个任务它所看到的全局变量,因为每次等到它去操作的时候,所操作的只是一个属
于它所有的副本而已。

yuanyou_2005

unread,
Jun 19, 2009, 7:41:17 PM6/19/09
to rtems-chinese-user-group

高航

unread,
Jun 19, 2009, 10:23:54 PM6/19/09
to RTEMS Chinese User Group
十分感谢大家不吝赐教。
局部变量的值在栈里吗?我就是想确认这一点,但这个说法有确切的证据吗?怎么能知道栈中到底放些什么内容?大家有好主意吗?

Ziyu Yu

unread,
Jun 19, 2009, 10:50:08 PM6/19/09
to rtems-chines...@googlegroups.com
c语言中,局部变量的值放在栈里面.
用gdb查看栈信息:
http://hi.baidu.com/wg_wang/blog/item/4ea66ea75a0acb90d14358a4.html

高航 写道:

高航

unread,
Jun 20, 2009, 2:36:34 AM6/20/09
to RTEMS Chinese User Group
经查,局部变量位于栈中,这点由编译器决定,c语言编译器都是把局部变量分配在栈中的。多谢大家。
还有一个问题,per task variable是一个二级指针,其指向的指针指向的内存才是真正的数据,这个数据所在区域是否要有用户现实的调用
malloc或者别的内存分配函数申请?

Zhongjie

unread,
Jun 20, 2009, 11:56:30 AM6/20/09
to rtems-chines...@googlegroups.com
事实上也不一定在栈中,如果cpu的寄存器很多,而变量不多的话可能就直接用寄
存器了,
而不会用栈,这个和编译器的实现有关,但有一点可以肯定,局部变量一定是每次
函数调用
都不一样的,除非你把他声明为static,per task variable是rtems实现的,编译
的时候
其实还是只有一个,对所有任务都是一样的,在做任务切换时rtems会根据不同的
任务存的
私有的值把他重新复值,这样当任务切换完成后,函数访问这个变量时就是这个任
务中他
所用的值了,可以参考看一下rtems的任务切换函数和per task variable 相关的
函数实现

高航

unread,
Jun 22, 2009, 3:02:20 AM6/22/09
to RTEMS Chinese User Group
有一点我觉得不对劲,rtems中的任务变量操作中没有任何申请新空间的操作,难道只是复制指针的值就可以实现全局变量的私有化吗?例如,t_val和
g_val不是始终指向同一块内存吗?要是这样,怎么对全局变量实现私有化?

> > malloc或者别的内存分配函数申请?- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Ziyu Yu

unread,
Jun 22, 2009, 3:05:18 AM6/22/09
to rtems-chines...@googlegroups.com
我的理解:rtems在进行任务切换的时候,把所有的pertask variable存在context
中,切换回去的时候再恢复

高航 写道:

Zhongjie

unread,
Jun 22, 2009, 3:15:30 AM6/22/09
to rtems-chines...@googlegroups.com
正解
-----Original Message-----
From: Ziyu Yu <yuziy...@gmail.com>
Reply-To: rtems-chines...@googlegroups.com
To: rtems-chines...@googlegroups.com
Subject: Re: 相同入口函数启动任务的问题

julyon

unread,
Jun 22, 2009, 7:52:08 AM6/22/09
to RTEMS Chinese User Group
我没记错的话,以前已经讨论过这个问题了,可以看一下以前你发的帖子!
Reply all
Reply to author
Forward
0 new messages