这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 更新-任务五:互斥体。FDZ组的进程贴

共22条 2/3 1 2 3 跳转至
高工
2013-07-16 10:36:12     打赏
11楼

直接点击右下角的:回复本帖 就成,就像我现在回复你的……

要是还是不明白,那么LZ 请看具体使用方法!

http://forum.eepw.com.cn/thread/231293/1


菜鸟
2013-07-16 11:12:05     打赏
12楼
我试试。。

菜鸟
2013-07-17 10:00:42     打赏
13楼

实验三学习心得:

事件标志:事件标志是一个用来实现同步的对象,由多个位组成,用作指示对应事件存在的标志。相关的函数包括:建立和删除一个事件标志、事件标志的设置和清除、事件标志的等待和事件标志状态的查询。事件标志是一个通过ID 号(被称为事件标志ID)来识别的对象。

除了有用来指示对应事件存在的位模式(bit pattern)外,事件标志还有一个等待事件标志的任务队列。事件标志模式有时简称为事件标志。

事件标志的数据结构:

typedef    struct t_cflg {

         VP                  exinf;                         /* Extended information */

         ATR                 flgatr;                        /* Event flag attribute */

         UINT                iflgptn;                 /* Event flag initial value */

         UB                  dsname[8];               /* Object name */

} T_CFLG;

事件标志处理程序将一个字的位作为一组进行处理。全部操作都以一个字为单位进行。

 

 

tk_set_flg(flgID,setptn);

为了便于表达,假设flgID就是一个事件标志的指针。执行tk_set_flg(flgID,setptn);后,发生的是这样的变化:flgID->iflgptn = flgID->iflgptn | setptn.

而如果是执行tk_clr_flg(flgID,setptn);则是这样:

flgID->iflgptn = flgID->iflgptn & setptn.

注意:这里的flgID本身并不是一个地址,他的原型是一个16位有符号数。这里当做指针指示便于表达。

通过这两个系统调用函数(SVC),我们就可以随意的指定改变事件标致的值,从而做到与其他任务进行通信的功能。

至于其他的函数,查看内核规范就可以很好的理解。


高工
2013-07-17 10:01:02     打赏
14楼
LZ 把其它楼层写的重要的东西最好在头帖做下链接体现下!

菜鸟
2013-07-17 10:05:03     打赏
15楼

任务四学习心得:


邮箱是一个通过在系统(共享)内存空间传递消息来实现同步和通信的对象。相关的函数包括:建立

和删除一个邮箱,发送消息到邮箱中,接收邮箱中的消息以及查询邮箱的状态。邮箱是一个通过ID 号(被

称为邮箱ID)来识别的对象。

每个邮箱都包含一个用来发送消息的消息队列和一个用于等待接收消息的任务队列。在消息发送端

(发出事件通知(event notification),被发送的消息进入消息队列。在消息接收端(等待事件通知),

任务从消息队列中取出一条消息。如果没有排队等待的消息,则任务进入一个等待接收邮箱中消息的状态,

直至下条消息被发送。等待从邮箱中接收到消息的任务被放置到该邮箱的任务队列。


多个任务是可以查询等待一个邮箱的。当执行一次tk_rcv_mbx()函数,一个邮件便被取出,也就是说任务队列的头部的信息被下一封邮件的信息取代。相对于信号量和事件标志,邮箱可以很方便的直接发送字符串信息。

问题:Tk_sta_tsk,第二个参数是干嘛的呢?我在内核规范中并没有查到。



菜鸟
2013-07-17 10:05:33     打赏
16楼
好的,这就去改。

菜鸟
2013-07-17 11:27:49     打赏
17楼

实验五分析:

互斥体:对系统资源进行排他访问。

互斥体的用途:

互斥体是一个互斥锁,使各任务交替独占访问临界资源,互斥体用来实现使用共享资源的任务之间的互斥控制

支持优先级继承和优先级顶置协议,可作为在互斥控制中解决优先级反转问题的工具。

优先级反转:

优先级反转问题是高优先级的任务等待属于被低优先级任务占有系统资源,

而形成高优先级任务等待低优先级任务运行的反常情况。如果低优先级在运行时又

被其他任务所抢占,则系统运行情况将更糟。

uTenux解决优先级反转的方法:(具体的介绍请参看悠龙提供的讲义,以下是我个人的理解)

uTenux提供的两种解决方法都是通过暂时修改使用互斥体的任务的优先级,一种是设置到固定的优先级(优先级置顶协议),另外一种是设置到与等待任务序列中任务优先级最高的任务的优先级相同(优先级继承协议)。

当任务释放互斥体时,优先级恢复

互斥体操作函数有5个,

tk_cre_mtx - Create Mutex

tk_del_mtx - Delete Mutex

tk_loc_mtx - Lock Mutex

tk_unl_mtx - Unlock Mutex

tk_ref_mtx - Refer Mutex Status

相对于T-kernel,并没有tk_loc_mtx_u - Lock Mutex (in microseconds)

这个SVC。这个缺少的函数和tk_loc_mtx函数的区别主要在于tk_loc_mtx_u提供的传入参数可以是64位的数据。

 

关于任务状态的转换:当tk_loc_mtx执行时,如果互斥体可以被立即锁定,则发出该系统调用的任务继续执行而不进入WAIT状态,互斥体进入锁定状态。如果互斥体不能被锁定,则发出该系统调用的任务就进入WAIT状态,即任务被放置到该互斥体的队列中。

至于实验的代码,我觉着理解了这些概念,看代码就很容易就理解啦,主要涉及的就是任务状态的转换,所以就不在详述代码啦,嘿嘿。

个人感觉,悠龙提供的内核规范关于任务状态的描述如果可以换成大写的英文就更清晰了。


菜鸟
2013-07-19 12:40:24     打赏
18楼
要折腾40多个小时回学校。。

菜鸟
2013-07-19 14:23:32     打赏
19楼

暑假已经结束了么?


菜鸟
2013-07-30 20:21:39     打赏
20楼

回学校以后就一直在忙着考研,这个进程贴也就忽略了,说一下我的感想吧:

    我是第一次使用嵌入式操作系统,真的很感谢悠龙和EEPW公司能提供这样一个机会,让我来亲身实践嵌入式操作系统,并且是在一个价值不菲的开发板上。

    对于这个操作系统的学习路线,我更多的是去学习这个操作系统的特点,各类SVC的使用,以及任务的生命周期,任务的通信这些抽象的概念,至于开发板的硬件电路,也都是在抽象层面上去理解,没有去深究,毕竟此次的学习目的是操作系统。

    我归纳的一些学习使用中要注意的问题(悠龙提供的内核规范是学习使用这个系统的必备之物):

    1,任务的运行状态,这是很重要的概念,尤其是不同的SVC会使任务发生怎样的状态变化。

    2,任务调度机制,任务分派的发生。

    3,任务间的通信

    再说一下我学习的过程:

    1,运行悠龙提供的实验程序,验证结果是否正确。

    2,阅读程序代码,理解每个涉及到的SVC的概念,使用说明,以及注意事项.

    3,对任务的切换,任务的状态改变,一一对照内核规范的提供的信息,进行验证。

    4,自己修改代码,一一验证各类特性。

我的学习过程很慢,但是可以很好的理解这些概念。

   之后可能没有机会去更新进程贴了,板子也要还给悠龙公司了。说真的,对悠龙公司我心里很愧疚,悠龙提供了一次这么好的学习机会,但我没有好好珍惜,好不容易考完试放了暑假,我还跑去玩了好几天才来学习这个操作系统,然后没几天又回到学校开始上考研的课程。真是愧疚。。。

我准备考一个计算机专业的研究生,但是还不知道该考哪所学校或是研究所。。。各位前辈可以给一下意见吗?顺便求研友。。。



    


共22条 2/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]