这个是头一次接触的概念。比较不好理解。内核规范中的说明就要20页!

看了王总写的uTenux内核规范之后,有那么一点明白了但理解不深。

集合点端口就像每次工作前的收集情况会。首长下达收集情况指令,各个部门聆听。当给某个部门下达指令之后,这个部门开始工作。并返回信息。所有部门都会报完信息之后,首长心里就有数了:今天天气不错,昨天的机器故障排除了,原料到位。可以开工了!于是,一天的生产工作就此开始。各个部门反馈完情况,就自由活动了。没事唠嗑都行。。

这里的首长,就是创建这个集合点端口的任务。各个部门就是被集合点召集的任务。他们反馈的情况就是被调用任务的反馈。反馈完情况的任务,进入下一个循环周期。

先按照这个理解做了实验再说!

【实验描述】

创建两个任务一个集合点端口PorID。之后启动TaskA。

在TaskA中启动TaskB,进入循环。

循环体开始时候,TaskA调用集合点端口,准备创建集合点。由于条件不满足,TaskA进入休眠,TaskB开始执行

TaskB,首先接受集合点端口调用,然后回复调用信息。

此时TaskA创建集合点条件满足,继续执行。将接收到的信息输出。

【代码及输出】

#include "PorSample.h"

void PorSampleTaskA(W stacd,VP exinf);
void PorSampleTaskB(W stacd,VP exinf);
void PorSamplePutPor(void);
static ID TaskID_A;
static ID TaskID_B;
static ID PorID; EXPORT ER PorSample( void )
{
T_CPOR cpor;
T_CTSK ctsk; //创建两个任务
ctsk.bufptr = NULL;
ctsk.exinf = (VP)NULL;
ctsk.itskpri = 20;
ctsk.stksz = 512;
ctsk.task = PorSampleTaskA;
ctsk.tskatr = TA_HLNG | TA_RNG0;
TaskID_A = tk_cre_tsk(&ctsk); ctsk.task = PorSampleTaskB;
TaskID_B = tk_cre_tsk(&ctsk); //创建集合点端口
cpor.exinf = NULL;
cpor.maxcmsz = 50; //最大发送消息数目
cpor.maxrmsz =50; //最大接收消息数目
cpor.poratr = TA_TFIFO; //属性,FIFO模式排队
PorID = tk_cre_por(&cpor); tk_sta_tsk(TaskID_A,5);
return E_OK;
} void PorSampleTaskA(W stacd,VP exinf)
{
B calmsg[] = "I am from TaskA ,i am now calling rendevons port\n";
B len = strlen(calmsg);
tk_sta_tsk(TaskID_B,0);
while(1)
{
tm_putstring((UB*)"TaskA调用集合点端口\n");
tm_putstring((UB*)calmsg);
tm_putstring((UB*)" \n");
tk_cal_por(PorID,0x02,(VP)calmsg,strlen(calmsg),-1);
tm_putstring((UB*)"I am in task a,the rpl msg is:\n");
tm_putstring((UB*)calmsg);
tm_putstring((UB*)" \n");
Delay(0x1000000);
}
} void PorSampleTaskB(W stacd,VP exinf)
{
B rcvmsg[] = "I am from Task B ,i am now accept rendevons port\n";
B len = strlen(rcvmsg);
RNO rdvno;
B calmsg[50],rplmsg[50];
calmsg[0] = '\0';
rplmsg[0] = '\0';
while(1)
{
tm_putstring((UB*)"i am in task b\n the cal msg is :\n");
tk_acp_por(PorID,0x02,&rdvno,(VP)calmsg,-1);
tm_putstring((UB*)calmsg);
tm_putstring((UB*)" \n");
tk_rpl_rdv(rdvno,rcvmsg,strlen(rcvmsg));
}
} void PorSamplePutPor(void)
{
B info[10];
T_RPOR rpor; tm_putstring((UB*)"Now rendevons port infor is wtsk atsk maxcmsz maxrmsz:");
tk_ref_por(PorID, &rpor);
ltostr(rpor.wtsk,info,10,10);
tm_putstring((UB*)info);
tm_putstring((UB*)" ");
ltostr(rpor.atsk,info,10,10);
tm_putstring((UB*)info);
tm_putstring((UB*)" ");
ltostr(rpor.maxcmsz,info,10,10);
tm_putstring((UB*)info);
tm_putstring((UB*)" ");
ltostr(rpor.maxrmsz,info,10,10);
tm_putstring((UB*)info);
tm_putstring((UB*)"\n");
}

输出

----------------------------------------------------
        micro Tenux Version 1.6.00(build 0180)     
            Supported MCU is ST STM32F407VG        
  Copyright(c) 2008-2013 by Dalian uLoong Co.,Ltd. 
----------------------------------------------------

TaskA调用集合点端口
I am from TaskA ,i am now calling rendevons port
 
i am in task b
the cal msg is :
I am from TaskA ,i am now calling rendevons port
 
i am in task b
the cal msg is :
I am in task a,the rpl msg is:
I am from Task B ,i am now accept rendevons port
 
TaskA调用集合点端口
I am from Task B ,i am now accept rendevons port
 
I am from Task B ,i am now accept rendevons port
 
i am in task b
the cal msg is :
I am in task a,the rpl msg is:
I am from Task B ,i am now accept rendevons port
 
TaskA调用集合点端口
I am from Task B ,i am now accept rendevons port
 
I am from Task B ,i am now accept rendevons port
 
i am in task b
the cal msg is :
I am in task a,the rpl msg is:
I am from Task B ,i am now accept rendevons port
 
TaskA调用集合点端口
I am from Task B ,i am now accept rendevons port
 
I am from Task B ,i am now accept rendevons port
 
i am in task b
the cal msg is :
I am in task a,the rpl msg is:
I am from Task B ,i am now accept rendevons port
 
TaskA调用集合点端口
I am from Task B ,i am now accept rendevons port
 
I am from Task B ,i am now accept rendevons port
 
i am in task b
the cal msg is :
I am in task a,the rpl msg is:
I am from Task B ,i am now accept rendevons port
 
TaskA调用集合点端口
I am from Task B ,i am now accept rendevons port
 
I am from Task B ,i am now accept rendevons port
 
i am in task b
the cal msg is :
I am in task a,the rpl msg is:
I am from Task B ,i am now accept rendevons port

【实验不足处】

由于不太理解集合点端口中消息传输机制,接收消息到的消息最后部分会出现乱码。使用固定长度消息暂时避免了这个问题,即发送和接收消息长度相同,而且等于集合点端口接收和发送的最大消息数。有待改进

这个不足可以用memset解决。向内存块放得下之前,先将内存块填0

【uTenux实验】集合点端口的更多相关文章

  1. 【uTenux实验】写在开始实验之前

    1.使用的uTenux内核代码:http://www.uloong.cc/cn/download/uTenux_V1.6.00r180.zip 2.uTenux的特性: 1.微内核  2.开放源码.完 ...

  2. 【uTenux实验】任务管理

    任务就是一个无限循环.uTenux提供的任务管理功能是很强大的,包括建立和删除一个任务,启动或退出任务,取消一个任务的启动请求,改变任务的优先级和査询任务状态,使任务进人睡眠状态和唤醒状态,取消唤醒请 ...

  3. 【uTenux实验】信号量

    信号量(semaphore)是一个用来指示可用的资源并将可用资源的数量以数值的形式表示出来的对象.当使用一组资源时,信号量用来实现互斥控制和同步.uTenux提供了信号量出来的API,可以很方便地使用 ...

  4. 【uTenux实验】事件标志

    事件标志是一个用来实现同步的对象,由多个位组成,用作指示对应事件存在的标志.事件标志由用来指示对应事件存在的位模式(bitpattern)和一个等待事件标志的任务队列组成. uTenux提供了一组AP ...

  5. 【uTenux实验】邮箱

    邮箱是一个通过在系统(共享)内存空间传递消息来实现同步和通信的对象.uTenux中每个邮箱都包含一个用来发送消息的消息队列和一个用于等待接收消息的任务队列,其使用邮箱功能的消息内容放置在发送方和接收方 ...

  6. 【uTenux实验】互斥体

    互斥体,维基百科中交互斥锁.其定义是这样的:互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制 ...

  7. 【uTenux实验】消息缓冲区

    uTenux的消息缓冲区是一个通过传递大小可变的消息来实现同步和通信的对象. 消息缓冲区由三部分组成:1.待发消息队列  2.等接收消息的任务队列  3.用来保存缓冲消息的空间. 和信号相比,消息队列 ...

  8. 【uTenux实验】内存池管理(固定内存池和可变内存池)

    1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...

  9. 【uTenux实验】时间管理(系统时间/周期性处理/警报处理)

    1.系统时间管理 系统时间管理函数用来对系统时间进行操作,是OS的一个基础性的东西.个人认为,设置系统时间和获取系统时间对OS来说基本是可有可无的. uTenux提供了三个系统时间相关API.分别用于 ...

随机推荐

  1. Aptana Studio 2启动时提示 Workspace Cannot Be Created 解决办法

    今天在安装Aptana Studio 2时出现这个东东,卸载后再安装依旧不行最后找到原因 原因 : 就是由于你把“我的文档”的位置修改造成的. 但Aptana还以为 “我的文档”的位置 是在系统的默认 ...

  2. Search Insert Position [LeetCode]

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  3. Unix 初步(一)

    1.Unix文件系统 Unix文件系统有三种文件类型:普通文件.目录文件和设备文件(将外部设备作为一种特殊的文件进行管理,实现输入输出统一而单纯的操作.) 2.Unix的网络功能 TCP/IP 3.r ...

  4. bzoj 2761: [JLOI2011]不重复数字

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #d ...

  5. Hibernate 检索策略

    概述 检索数据时的 2 个问题: –不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象, 而程序实际上仅仅需要访问 Custome ...

  6. AngularJS向指令传递数据

    我今天要实现的功能是利用AngularJS来完成客户端过滤器. list.html页面主要代码如下: ...... <div class='tj_con_tr_ipt' ng-init=&quo ...

  7. Goldengate 12.2新特性-自描述的队列文件

    OGG12.2中最大的变化之一就是队列文件是自描述的,意思是不再担心以前版本中,表结构异构的情况,也不再需要defgen生成定义文件,以及不再使用assumeTargetDefs或SourceDefs ...

  8. Java中文档制作与继承

    1:如何制作帮助文档(了解) (1)写一个类 (2)加入文档注释 (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.java 2: ...

  9. Objective-C学习笔记-第一天(1)

    .h头文件,用于声明一些公开的属性.方法.头文件一般不会放太多的东西,没必要暴露太多接口,私有和封装. .m主文件,用于实现.h文件中的方法,以及一些其它的方法. -(返回值)方法名参数1名称:(参数 ...

  10. 初用Ubuntu常见问题及解决方案之一

    1.我的Vaio Fit15e的无线网卡是BCM43142,装了Ubuntu后为了装驱动折腾了好久,因为这款网卡在Broadcom官网都找不到驱动,google了一大圈,一个最简单的命令可以解决这个问 ...