推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

如何在SDL中调用C语言函数

   2023-07-03 网络整理佚名860
核心提示:从实际工作出发,提出了在SDL中调用C语言函数的必要性,并给出了SDL语言中使用C语言数据类型、公共变量以及调用C语言函数的方法。C语言函数的调用和变量调用、数据类型引用基本相同,需要注意的是函数的参数。所有在SDL中调用到的数据类型、全局变量和函数必须在C语言头文件中声明,只有声明过的才能在SDL中调用或引用。

摘要:从实际工作出发,提出了在SDL中调用C语言函数的必要性,给出了在SDL语言中使用C语言数据类型、公共变量以及调用C语言函数的方法。 该方法实用性强,大大提高了工作效率,加快了实时多任务系统应用软件的开发速度。 该方法实际应用到第三代移动通信系统《TD-SCDMA》TD-SCDMA高层信令的发展中,收到了良好的效果。

关键词:流程、SDL、实时多任务系统、TD-SCDMA、C语言函数、数据类型、公共变量

SDL(和)是CCITT推荐的规范描述语言。 经过ITU-T的发展和标准化后,在蓝皮书Z.100建议中进行了定义。 第一个正式版本于1988年推出,此后每四年进行补充和更新。 作为国际标准化的形式语言,它用于标准化和描述实时系统。 SDL-2000是目前SDL的最新版本。 作为SDL相关技术的Z.120建议-消息序列图MSC()和Z.105建议-抽象语法符号ASN.1(一)和SDL共同构成完整的描述语言。 本文中描述的 SDL 软件由 Tau AB 提供。

在协议软件开发过程中,SDL被用于系统规范描述和设计阶段。 它完全独立于硬件实现和操作系统。 Tau提供的SDL软件不仅可以用于规范描述和设计,还可以直接从SDL描述和设计生成标准C代码; 用户还可以直接在SDL描述和设计中嵌入C代码来完成一些功能。 SDL描述生成的C代码(包括嵌入式C代码)可以直接与各种嵌入式(或非嵌入式)实时多任务操作系统(RTOS)集成,例如pSOS、Vrtx、OSE等。集成代码可直接在目标板上运行,方便用户开发协议软件。

虽然SDL软件具有强大的开发功能,但重庆邮电大学新科公司TD-SCDMA系统高层信令二层、三层信令开发中遇到了很多问题,主要有:

(1)由于TD-SCDMA系统高层信令由多个部门共同负责,除了第二层、第三层外,还有MMI和物理层控制软件,不可能所有部门都使用SDL软件共同完成系统信令开发工作。 各部门最终提供的应该是标准的C语言源代码“title=”源代码”>源代码,最终集成在实时操作系统上。SDL软件生成的C源代码不便于与其他交互部分代码已集成。

(2)高层二三层信令是一个非常复杂的系统,需要进程间进行大量的数据交换,而SDL要求进程间的所有数据交换必须通过信号来完成(虽然SDL可以用,但是使用起来不方便)。 系统启动后,需要进行大量的数据通信,系统资源会浪费在通信上。

不过SDL的测试功能非常强大。 可以从不同角度测试SDL的描述,发现错误及时返回修正。 如果没有SDL的TTCN测试,在硬件平台上测试所有的设计结果将是非常困难的。 即使可以跟踪硬件平台的运行结果,但仍然不如TTCN测试结果的MSC图表方便。 并且SDL可以独立测试系统的任何部分。 在SDL设计结果与RTOS系统集成之前,基本保证了SDL设计阶段的正确性,减少了繁琐的板级代码调试,使SDL设计结果可以快速移植到硬件工作平台上。时间短,工作效率提高。 。

为了让SDL软件的设计结果能够被SDL软件的TTCN测试并直接与其他C语言源代码集成,必须解决一个问题——如何在SDL中调用C语言函数。

1 实施方式

SDL内核采用消息驱动事件的方法来管理SDL进程,SDL内核根据消息队列中的消息对SDL进程进行调度。 如图1所示,展示了SDL进程、SDL内核和SDL信号队列之间的关系。

SDL图形描述转换为C源代码,没有系统()和功能块(块)的概念,只有进程和通信,由SDL内核程序管理和协调。 进程之间没有全局变量,所有的数据交换都必须通过信号来传输。 如果一个进程想要向另一个进程发送信号,需要发送到SDL信号队列中等待SDL内核程序的处理。

在实时多任务系统的编程中,最关心的是状态的划分,在什么状态下接收到什么信号,做什么样的处理。 因此在SDL中,应该使用标准的C语言源代码来定义数据和信号并对接收到的信号进行处理。 要求这部分代码能够在SDL中测试并在实时操作系统中使用。

在整个开发过程中,我们始终坚持这样一个原则,使用SDL来划分通信模块,并尽可能使用信号来传输协议中规定的原语,对于非标准信息使用公共变量,使用C语言来传输协议中规定的原语。实现流程代码;最后使用TTCN进行综合“title="">测试。在TD-SCDMA信令设计中,证明了这种思路的可行性。图2是某高端的开发模型图。 TD-SCDMA系统级软件。

在开发初期,根据TD-SCDMA系统协议TSM,考虑系统分为多少个进程,每个进程之间需要哪些信号和全局变量数据,然后定义数据类型并编写C语言源代码。 所有C源代码都是根据在什么状态下接收到什么信号,处理后发送什么信号格式来完成的。 这样编写的代码可以在RTOS中应用,并且可以满足SDL的要求,方便TTCN测试。 如图2所示,用标准C完成的源代码可以与SDL集成并通过TTCN进行测试; 同时可以与RTOS系统集成,运行在实际的硬件环境中。

完成的C语言源代码已经过TTCN测试,保证信号处理的正确性。 在软件开发后期,只需修改适当的程序,根据协议转换移植C语言源代码即可。

在SDL的文档中,提到了如何将C语言函数应用到SDL系统中; 但这种方法经过多次实验效果并不理想,即使能够实现也受到很多限制。 因此,放弃了SDL提供的方法,最终找到了一种实用的方法,在第3节中进行了描述。

2 实施过程

C源代码不能直接在SDL中使用。 首先要使用.exe软件将C语言的头文件转换为SDL的文本描述(PR描述),如图3所示。然后在SDL的界面中,将文本描述转换为图形描述,以SDL SUN文件的形式存在。 最后,在设计的SDL系统中使用use关键字语句。 详情如下:

(1) 使用.exe程序转换C语言头文件。 .exe 是 Tau AB 公司提供的可执行文件。 使用该文件时,操作系统需要配备MSC7.00或MSVC++编译器(不是C编译器)。 .exe自动调用标准C编译器,检查C语法,然后将C部分代码转换为SDL的PR格式。 .exe只检查头文件的数据类型、数据定义和函数声明。 在此过程中,不检查特定C语言函数的语法。 事实上,C语言函数不能直接转换成SDL的图形描述或文本描述。

为了方便使用该工具,它是一个可以带参数的DOS程序,格式为:

【参数选项】要转换的C语言头文件

其参数选项如表1所示。在实际应用中,最常用的参数选项是n、s、I三种参数选项。

(2) 将SDL的PR文件转换为GR模式使用

该程序生成一个扩展名为 PR 的 SDL 文件。 SDL界面的菜单中有一个“to GR...”选项,使用SDL to GR对话框即可完成PR文件到GR格式的转换。 生成的 SDL 文件的名称是 SDL PR 描述中内部指定的名称。

(3) 在SDL系统中声明。 在SDL过程中,不能直接使用C语言的数据类型、变量定义和函数。 上面生成的SDL文件需要使用SDL关键字use来声明。 格式是使用文件名。

这样,C语言头文件的函数、数据类型和变量就可以在SDL过程中任意使用。 虽然这些定义可以在SDL中使用,但它们也必须遵守SDL调用C变量和函数的规则。

① 变量调用

由于SDL可以调用C语言函数,所以基本上系统的所有处理都是由C语言函数完成的。 所以SDL和C源代码中使用的公共变量很少,只有一些SDL特有的数据,比如控制SDL的分支等。调用格式为:

变量赋值:调用Set_变量名

转到变量值:调用 name

② 数据类型参考

虽然整个系统的任务是在C源代码中完成的,但是在信号处理中,SDL需要将信号保存到变量中(SDL描述要求),并且信号类型是在C语言中定义的。 C语言数据类型转换为SDL数据类型时,保留原来的数据类型名称,在SDL中,按照SDL规则定义数据。

函数调用

C语言函数调用与变量调用和数据类型引用基本相同。 需要注意的是函数的参数。

调用格式:调用函数名(函数需要的实际参数)

由于在C语言编写的C函数中可以使用全局变量,因此极大地方便了C语言在SDL中的应用,并且不需要SDL信号就可以传输需要处理的公共数据。 例如,在TD-SCDMA高层信令设计中,很多进程都需要小区信息和系统信息,因此可以将它们作为全局变量。

3 示例

下面的例子是在空闲状态下接收来自物理层的测量报告信号并向物理层发送请求信号以进行小区BSIC解释。 将分以下步骤进行说明:

(1)C语言头文件trr.h的编写

SDL 中调用的所有数据类型、全局变量和函数都必须在 C 语言头文件中声明,并且只有声明过的数据类型、全局变量和函数才能在 SDL 中调用或引用。 任何标准 C 语法都可以在头文件中使用。 在下面的头文件中,由于篇幅限制,没有给出从属数据类型的详细定义。

#

#

}

整数;

{;

G

}

整数;

;

整数[];

{;

}

;

;

{;

}

国家委员会;

{;

}

;

;

{;

nd;

;

int sInd(*p);

#万一

trr.h中,#“trr.c”使用时应屏蔽,无需将trr.c文件编译转换为SDL的文本描述。 但生成SDL的TTCN或可执行文件时,需要去掉C语言掩码。 这样,当生成可执行文件时,SDL直接将trr.c定义的内容和SDL描述一起汇编编译。

(2)C语言函数trr.c的编写

C语言头文件中声明的全局变量和函数实体在C源代码中定义。 在 trr.c 文件中定义 nd、全局变量和 int sInd() 函数。 C语言函数不直接转换为SDL描述,可以支持标准C语言的所有使用方法。

#“trr.h”

nd;

;

int sInd(*p)

}

整数;

int rscp[];

.= p->;

rscp[] = p-> .-

[];

..ncc.=10;

对于(=0;

}

..ncc。

]=;

。 .ncc。

[]=;

。 .ncc。

[]=;

{

;

{

在本例中,函数返回值决定是否需要向物理层发送信号。 使用该方法,可以确定SDL描述的分支处理。

(3) 使用

编写完trr.h文件后,可以将trr.h文件转换为SDL的文本描述,并在DOS系统提示符下执行以下命令:

-n trr -sc:.pr -o″-Ic:-Ic:″trr.h

编译过程中,如果C语言源代码写得不正确,会有错误提示。 所有错误都必须根据提示纠正(每个头文件最后一行必须为空行),直到生成正确的.pr文件。 SDL 的名称在 .pr 文件中指定为 trr。 最后使用SDL的PR转GR工具生成trr.sun文件。

(4) SDL流程的调用

在此过程中最终实现了C语言在SDL中的应用。 根据SDL的要求,接收到的信号首先要存储到一个变量中,例如接收到的信号必须先存储到一个变量中; 然后调用sInd()处理信号,并在处理过程中生成信号的内容,由SDL go out。 图 4.

在实时多任务系统中,为了提高系统的工作效率,信号的传递往往采用传递指针的方式,所以在上面的例子中,int sInd()的形参形式为C语言的指针。 当C语言转换为SDL时,虽然可以将数据类型转换为SDL数据类型格式,但是在SDL中直接定义指针不方便,所以将接收到的信号定义为与接收信号相同数据类型的变量函数参数,使用SDL中的“&”取地址符号,将变量转换成指针使用。 在此示例中,调用 sInd(&)。 其他请参考图4。

并不是所有的设计代码都可以用C语言完成,SDL信号的发送和接收机制、时钟处理只能由SDL本身来处理。 事实上,这部分对于不同的RTOS系统是不同的,所以我们必须使用C语言的预编译开关将它们分开,针对不同的系统进行不同的编译。

根据实际工作的需要,提出了利用SDL调用C语言函数进行此类通信软件的开发。 虽然不能保证是最好的方法,但经过长期的研究和探索,实践中的应用充分证明了这种方法是好的。 可行。 利用该方法完成TD-SCDMA系统的第二层和第三层高层信令。

参考

1 tau蛋白AB。 tauTM SDL 套件 4.0。 2001年

2 tau蛋白AB。 tauTM SDL 套件 4.0 .2001

3 CWTS.TSM 04.08 无线电层 3。 V2.2.0.2002

4.加上。 。 2000,-001 修订版 101

5. 加上。 2000,-001 修订版 102

6.ARM 套件说明.2000, -001 Rev.108

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON