程序框架

2024-09-19

程序框架(精选9篇)

程序框架 篇1

1 引言

作用在箱梁桥上的荷载主要是恒载和活载。恒载是对称作用的, 一般只在结构上产生纵向弯曲。活载可以是对称作用, 但大部分时候是非对称的偏心荷载, 偏心荷载对箱梁结构产生的空间效应比较复杂, 必须给予重视。

直接分析箱梁的空间效应较为复杂, 分析时就设法将箱梁计算的空间问题转化为平面问题。一般将箱梁在偏心荷载作用下, 分解为纵向弯曲、刚性扭转、畸变、横向弯曲四种基本变形状态, 箱梁横向内力主要是由畸变和局部荷载在横向产生的挠曲引起的, 本文将主要讨论局部荷载在箱梁上产生的横向内力。

目前箱梁桥横向内力计算的主要方法是框架分析法, 即在纵向人为的在箱梁角点加上支座约束, 以约束其侧向变形, 然后在纵向取单位长度的薄片框架用结构力学的方法进行分析, 以求其横向框架内力。

我国《铁路桥涵设计规范》TBJ2-96规定, 箱梁主梁的横截面, 可作为支承在主梁腹板中心线下缘的箱梁框架进行设计。我国现行的《公路桥涵设计通用规范》JTG D60-2004, 并未明确对箱梁的横向内力计算进行规范, 但实际中, 也是采用平面框架法计算。

2 本文的研究过程

对于跨中设多个横隔板即宽跨比较小的箱梁, 畸变所产生的横向框架应力较小, 可以忽略不计, 仅计局部荷载产生的横向弯矩。

本文仍采用平面框架法的基本方法, 采用有限单元法推导横向框架单元刚度矩阵和相应的等效节点荷载列阵, 并用FORTRAN语言编制相关程序, 以期掌握箱梁横向弯曲应力沿全桥的分布情况, 并能找出在各级荷载组合作用下的箱梁横向应力的最不利作用位置。

2.1 研究背景

如图1取箱梁一框架截面, 在顶板角点加上两个支座约束, 以角点A、B的转角θ1、θ2为基本未知量。当A.、B两角点发生如图1所示的正向位移时 (顺时针方向为正) , 求该框架的弯矩分布, 并以θ1, θ2表示。并以此推导出横向框架单元刚度矩阵。

2.2 位移法求解

以位移法求解, 取如图2所示的位移法基本体系, 可以写出由位移引起的杆端弯矩:

MA=MAB+MAD= (4i1Z1+2i1Z2) + (4i3Z1+2i3Z4-6i3Z5/h)

MB=MBA+MBC= (2i1Z1+4i1Z2) + (4i3Z2+2i3Z3-6i3Z5/h)

MC=MCB+MCD= (2i3Z2+4i3Z3-6i3Z5/h) + (2i4Z4+4i4Z3)

MD=MDA+MDC= (2i3Z1+4i3Z4-6i3Z5/h) + (4i4Z4+2i4Z3)

对AD杆取隔离体, 对A点取矩, 得FQDA= (MAD+MDA) /h, 同理有FQCB= (MBC+MCB) /h, 对DC杆取隔离体, 有FQDA+FQCB=0, 又对于框架, 易知MC=MD=0, 由于在顶板处有由于外荷载引起的固端弯矩, 所以MA≠0, MB≠0。

{ΜC=0ΜD=0FQDA+FQCB=0

联合以上三式, 得到:

Ζ3=-i3 (Ζ2-Ζ1) 4i3+2i4+i3 (Ζ1+Ζ2) 2i3+12i4Ζ4=i3 (Ζ2+Ζ1) 2i3+12i4+i3 (Ζ2-Ζ1) 4i3+2i4Ζ5=h2i3+3i4i3+6i4 (Ζ1+Ζ2)

2.3 计算单位框架截面应变能

仅计框架的弯曲应变能, 框架在角点位移和集中荷载作用下的弯矩呈直线分布, 所以可设各板上的挠度按三次函数变化。

对于顶板, 令w (y) =Ay3+By2+Cy+D

边界条件:

w (0) =D=0

w (s) =As3+Bs2+Cs=0

w′ (0) =C=θ1

w′ (s) =3As2+2Bs+C=θ2

所以:A=θ1+θ2s2, B=- (2θ1+θ2) s

代入:w (y) =θ1+θ2s2y3+- (2θ1+θ2) sy2+θ1y

顶板的应变能为:U (顶) =EΙ20s (w″) 2dy=

i1 (2θ12+2θ1θ2+2θ22)

同理可得底板、腹板的应变能:

U (底) =2i4[i32 (θ2-θ1) 2 (4i3+2i4) 2+3i32 (θ2+θ1) 2 (2i3+12i4) 2]

U () =i3[2θ12+2θ1i3 (θ2-θ1) (4i3+2i4) +2i32 (θ2-θ1) 2 (4i3+2i4) 2+ (θ2+θ1) 2 (2i32+18i3i4+54i42) 4 (i3+6i4) 2+ (θ2+θ1) (-2θ1i3-9θ1i4) (i3+6i4) + (θ2+θ1) (θ2-θ1) (4i3+2i4) (i3+6i4) (-i32-9i3i4) ]

U () =i3[2θ22+2i3 (θ2-θ1) (-3i3θ2-i3θ1-2i4θ2) (4i3+2i4) 2+ (θ2+θ1) 2 (2i32+18i3i4+54i42) 4 (i3+6i4) 2+ (θ2+θ1) (-2θ1i3-9θ1i4) (i3+6i4) + (θ2+θ1) (θ2-θ1) (4i3+2i4) (i3+6i4) (i32+9i3i4) ]

2.4 集成单元刚度矩阵

沿纵桥向取单位长度的箱梁单元, 单元节点位移向量为:

[δe]=[θ1i, θ2i, θ′1i, θ′2i, θ1j, θ2j, θ′1j, θ′2j]T

位移函数取三次多项式:

θ1=a1+a2x+a3x2+a4x3θ1=a2+2a3x+3a4x2θ2=a5+a6x+a7x2+a8x3θ2=a6+2a7x+3a8x2[Ν1]=[1-3x2L2+2x3L3, 0, x-2x2L+x3L2, 0, 3x2L2-2x3L3, 0, -x2L+x3L2, 0][Ν2]=[0, 1-3x2L2+2x3L3, 0, x-2x2L+x3L2, 0, 3x2L2-2x3L3, 0, -x2L+x3L2]

整个箱梁的应变能为:

U (总) =∫0L[U (顶) +U (底) +U (左腹) +U (右腹) ]dx

由于

0L (θ1) 2dx=∫0L[N1][δe][N1][δe]dx

=[δe]T∫0L[N1]T[N1][δe]dx

0L (θ1·θ2) dx=∫0L (12θ1θ2+12θ2θ1) dx=L0 (12[Ν1]Τ[Ν2]+12[Ν2]Τ[Ν1]) dx

即得:[k1e]=2∫0L[N1]T[N1]dx

同理:

[k2e]=∫0L ([N1]T[N2]+[N2]T[N1]) dx,

[k3e]=2∫0L[N2]T[N2]dx

所以得:

[ke]=[k1e]k1+[k2e]k2+[k3e]k3=2∫0L[Ν1]Τ[Ν1]dx[2i1+-4i33-2i32i4 (4i3+2i4) 2+2i33+21i32i4+54i3i422 (i3+6i4) 2-2i32+9i3i4i3+6i4+2i3]+0L ([Ν1]Τ[Ν2]+[Ν2]Τ[Ν1]dx[2i1+4i32i4+8i33 (4i3+2i4) 2+2i33+21i32i4+54i3i42 (i3+6i4) 2-4i32+18i3i4i3+6i4]+20L[Ν2]Τ[Ν2]dx[2i1+-4i33-2i32i4 (4i3+2i4) 2+2i33+21i32i4+54i3i422 (i3+6i4) 2-2i32+9i3i4i3+6i4+2i3]

由上述[ke]的积分式, 代入箱梁实际参数, 即可求得8×8阶的单元刚度矩阵。

2.5 单元等效节点荷载求解

本文暂只考虑在箱梁顶板受一均布线荷载q作用 (如图3) 。

由能量原理, 外荷载产生的荷载势能等于负的应变能, 即

UP=-∫0Lq·w (x, y) dx=-∫0Lq[δe]{[Ν1] (y3s2-2y2s+y) +[Ν2] (y3s2-y2s) }dx

所以得到:

[Ρe]=[q× (-12× (y3s2-2y2S+y) ×L+y3s2×L-2×y2s×L+y×L) q× (-12× (y3s2-y2s) ×L+y3s2×L-y2s×L112q× (y3s2-2×y2s+y) ×L2112q× (y3s2-y2s) ×L212q× (y3s2-y2s) ×L-112q× (y3s2-2×y2s+y) ×L2-112q× (y3s2-y2s) ×L2]

3 计算结果分析

根据以上推导的单元刚度矩阵和单元等效节点荷载列阵, 利用FORTRAN语言编程, 编制了具有文本数据输入输出、单刚叠加至总刚、一维数据存储、高斯分解等功能的计算程序。

只需在文本中编辑桥梁的各种计算参数, 即可方便的得出全桥各个节点的节点位移, 进而可以求得横向截面的弯矩、应力。并可根据计算精度的不同, 如计算变截面时, 可适当加密单元的设置。

对如图4所示的结构, 用该程序得出的计算结果如下:

在程序数据输入文本中输入以下参数 (梁两端视为被横隔板或桥墩所固结) :

y (q) =2 (均布力q到A点的距离) , s=7, h=4.5

EI3=2.6198×108, EI1=7.7625×107, EI4=7.7625×107

运行程序后可以求得结构节点位移:

根据上述程序运行结果, 即可得出箱梁任一截面的横向内力图。

根据以上的程序计算结果, 做跨中截面的弯矩图如图5所示:

4 总结

(1) 本文运用平面框架法的基本思想, 以箱梁顶板两个角点的转角作为基本未知量, 建立了有限元方程, 并用FORTRAN语言编制计算机程序, 即可得出任一截面的横向应力。根据应力图可以评估桥梁横向受力状态, 并对横向预应力配置有指导性意义。该法简单实用、并具有创新性。

(2) 只需修改单元刚度矩阵中相关参数, 本文方法即可用于变截面计算。

(3) 对于多种荷载组合、不同工况类型的情况, 只需单独计算出其等效节点力, 然后叠加到整体结构等效节点力。

(4) 本文仅讨论了在结构上满布均布荷载的等效节点力, 对于求结构上作用一集中荷载情况的等效节点荷载, 是采用等效分布宽度或用等代正弦级数模拟, 还需进一步研究。

摘要:运用平面框架分析的基本方法, 对箱形截面梁的横向框架内力进行分析。为了解桥梁沿长度方向上各个截面的横向内力, 在梁长度方向截取单位长度的框架, 然后用能量原理推导出横向框架单元刚度矩阵及相应等效节点力, 并用FORTRAN语言编制相关程序, 最后得出在各级荷载组合下箱梁桥横向内力的变化规律。该方法对横向内力的计算比较简便, 对找出横向内力最不利作用位置以及横向预应力配筋有参考意义。

关键词:平面框架分析,横向框架,能量原理,FORTRAN,横向内力

参考文献

[1]郭金琼, 房贞政, 郑振.箱形梁设计理论[M].人民交通出版社, 2008.10.

[2]包世华.结构力学[M].武汉理工大学出版社, 2007.5.

[3]范立础.桥梁工程[M].人民交通出版社, 2001.11.

[4]谭浩强, 田淑清.FORTRAN语言[M].清华大学出版社, 1995.12.

[5]郭金琼, 郑震.带伸臂箱梁横向内力分析[J].土木工程学报1986, (3) .

[6]钟新谷.箱形梁的研究[J].湘潭矿业学院学报, 2001, (3) .

程序框架 篇2

教学模式的结构一般包括以下因素:

(1)教学思想。教学思想是教学模式的理论基础,是指导教学模式的理论核心,是教学模式深层内隐的灵魂和精髓,它决定着教学模式的方向性和独特性。它在教学模式结构中既自成独立因素,又渗透或蕴涵在其他各个因素之中。

(2)教学目标。教学目标是指模式所能达到的教学结果,是教育者对某项教学活动在学习者身上将产生什么样的效果所作出的预先估计。它是教学模式的运行方向。教学目标既是实施教学模式的出发点,又是实施教学模式的归宿,它贯穿于教学模式实施的始终。

(3)操作程序。操作程序指教学在时间上展开的逻辑步骤以及每个步骤的主要做法等。任何教学模式都具有一套独特的操作程序和步骤。人们常常从教材内容顺序、心理发展顺序、方法的交替运用等方面提出教学活动的基本阶段及其逻辑顺序。操作程序只能是基本的和相对稳定的而不应是僵化和一成不变的。

(4)师生作用。师生作用指完成教学目标互动主体的角色地位及关系。在教学过程中,教师和学生根据程序安排步骤,通过不同的组合方式,承担不同的角色,发挥各自的作用。

(5)教学策略。教学策略是完成教学目标所采用的方式、方法、措施的总和。策略具有针对性和灵活性。同一目标可采用不同的策略,不同水平的师生也可采取适宜的策略。策略直接制约着教学结果。

(6)评价。评价指评价的方法、标准等。任何一种教学模式都不是万能的,都有其适用的教学情境。由于不同的教学模式所完成的教学目标、使用的操作程序不同,评价的方法和标准也不尽相同。

我在教学中使用的教学模式:预习、读书、议论、讲解、练习。

预习—浅层目标,尝试自达

读书—学习探究,指导助达

议论—沟通合作,互相启达

讲解—讲解释疑,作结促达

练习—诊断评价,全面竣达

程序框架 篇3

关键词:SOA WCF .Net 契约 服务

DOI:10.3969/j.issn.1672-8289.2010.10.058

0 引言

企业信息化发展的过程中,最早搭建的是基于业务模型的各种信息系统。其具体的实现模型是以业务数据存储为核心的应用程序模型。随着企业信息化的发展,企业的数据存储模式越来越分散于各自的系统框架中,而信息共享的需求越来越迫切。为了实现数据之间的互相共享,越来越多的接口协议被应用与系统扩展服务之上。例如TCP数据包模式,XML数据交换模式,WebService接口协议等。为使企业应用摆脱面向技术的解决方案的束缚,轻松应对企业商业服务变化、发展的需要,面向服务的体系结构,即SOA架构模型应运而生。SOA的关键是服务,即一切是基于服务来设计程序,服务是最核心的抽象手段,业务被划分为一系列的业务服务和业务流程。SOA已经成为现有系统应用框架的标准模型。

微软公司作为现有软件编程规范的制定者之一,已经在其最新的企业编程平台VS.Net2010中实现了基于SOA标准的应用程序开发模型,即WCF应用框架模型。它是基于Windows平台下开发和部署服务的软件开发包(SDK),专门用于服务定制、发布与运行,以及消息传递和处理。WCF整合了微软.Net平台下所有和分布式有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ。以通信范围而论,它可以跨进程、跨机器、跨子网、跨企业网甚至于跨Internet;以宿主程序而论,它可以以ASP.NET、EXE、WPF、WindowsForms、NT Service、COM+作为宿主程序。WCF可以支持的协议包括TCP、HTTP、跨进程及自定义。掌握了WCF,就掌握了微软实现SOA标准的服务架构体系。

1、WCF的优势

首先我们先来看若没有WCF应用框架,开发一个基于Internet的典型的分布式应用系统,

将会涉及到现有的几种技术。

上图我们可以看到,采用跨平台的技术手段,后端应用中间层以及数据库服务层,我们需要通过WebService来暴露其接口供前端客户端调用。如果在这个接口之上还需要充分考虑通信的安全性,我们得使用WebService Enhancements来保证ASMX的安全连接。若系统存在分布式事务逻辑,我们会考虑采用EnterpriseService(COM+)的内在事务处理模型,其中还包括了分布式事务处理逻辑(Distributed Transaction)。如果中间业务逻辑还细分为N个对象层级,那么我们还需要考虑中间对象的异步调用、脱机连接、断点连接等功能。也许我们还要使用消息队列(MSMQ)来支持应用程序之间的异步消息传递。

由此,我们看来,要建立一个架构牢靠,性能良好的Internet分布式应用系统,若使用到微软的.Net技术,我们就得使用.Net Remoting、Web Service、COM+等技术,这些技术,既降低了开发效率,又加大了程序的开发成本和维护难度。正因此有如此诸多的因素在里边,WCF的应用框架才会在微软的VS.Net2010中作为全新的分布式开发技术而强势推出,并成为理想的分布式开发的解决方案。WCF具有的优势如下。

1.1统一性

WCF是ASMX、.Net Remoting、Enterprise Service、WSE、MSMQ等技术的整合体。由于WCF完全由托管代码编写,因此开发WCF的应用程序与开发其他的.NET应用程序没有太大的区别,我们仍然可以像创建面向对象的应用程序那样,利用WCF来创建面向服务的应用程序。

1.2互操作性

WCF的最基本的通信机制是SOAP,这就保证了系统之间的互操作性,即使是在不同的上下文中。这种通信可以是基于.NET到.NET间的通信。同时,可以进行跨进程、跨机器甚至于跨平台的通信,只要支持标准的Web Service,例如J2EE应用服务器。应用服务器可以运行在Windows操作系统下,也可以运行在其他操作系统之下,例如Sun Solaris、HP UNIX、Linux等。

1.3安全与可信赖

WS-Securiy、WS-Trust和WS-SecureConversation均被添加到SOAP消息中,以用于用户认证、数据完整性验证、数据隐私等多种安全因素。在SOAP的header中增加了WS-ReliableMessaging允许可信赖的端对端通信。而建立在WS-Coordination和WS-AtomicTransaction之上的基于SOAP格式交换的信息,则支持两阶段的事务提交(two-phase commit transactions)。上述的多种WS-Policy在WCF中都给予了支持。对于Messaging而言,SOAP是Web Service的基本协议,它包含了消息头和消息体。在消息头中,定义了WS-Addressing用于定位SOAP消息的地址信息,同时还包含了MTOM(Message Transaction Optimization Mechanism)消息传输优化机制。

1.4兼容性

WCF充分的考虑到了与旧有系统的兼容性。安装WCF并不会影响原有的技术,如ASMX与?.Net Remoting。即使对于WCF和ASMX而言,虽然两者都是用了SOAP,但基于WCF开发的应用程序,仍然可以直接与ASMX进行交互。

2、基于SOA标准的用户需求分析

假设企业的信息系统要构建在SOA标准之上。那么系统对数据的需求分为2个层次。

2.1数据服务端

即该信息系统的数据请求以服务的方式提供。我们以“数据表格反馈”作为该服务针对客户端请求的回应。该服务端根据客户端的请求返回其所需要的数据内容序列。对其序列的接口封装采用安全连接的Web Service提供。

2.2数据客户端

即发起该数据请求的客户端,应该运行在微软的操作系统之上,表现形式为WindowsForm,当然其也可以采用WEB载体的方式运行。本例中我们只请求其中一个简单的数据内容表格申请。

3、基于WCF应用程序框架的具体代码实现

3.1 定义WCF的服务契约

契约定义了服务提供的功能和客户端程序可以使用哪些功能。契约可以完全独立于服务的实现代码。在WCF中契约分为3种类型:服务契约、数据契约、消息契约。本例中需要返回数据内容序列,因此采用数据契约。

Using system;

Using system.collections.generic;

Using system.Linq;

Using system.serviceModel;

Using system.Text;

Namespace WcfService1

{

[ServiceContract]

Public interface IService1

[operationContract]

String GetData(int value);

[operationContract]

CompositeType GetDataUsingDataContract(CompositeType composite);//此处为服务操作

}

下面定义通过服务发送的复合类型数据

[DataContract]

Public class CompositeType

{

Bool boolValue=true;

String stringValue=”Hello”;

[datamember]

Public bool BoolValue

{

Get{return boolValue;}

Set{boolvalue=value;}

}

Public bool BoolValue

{

Get{return boolValue;}

Set{boolvalue=value;}

}

}

3.2 实现WCF的服务契约

对契约接口的实现,继承接口并实现其方法。

Using system;

Using system.collections.generic;

Using system.Linq;

Using system.serviceModel;

Using system.Text;

Namespace WcfService1

{

public class Service1 : IService1

{

//查询表格数据的行数

public int GetDataGridNum()

{

DataGrid dg = new DataGrid();

return dg.RowNum;

}

//获取表格数据

public List getDataGird()

{

List< DataGrid > DataGridList= new List< DataGrid >();

DataGrid.Add(DataGrid);

return DataGrid;

}

}

}

3.3 宿主进程服务

相当于运行服务的载体,可以是WindowsForm程序或者Windows服务,也可以是ASP.NET的应用程序,甚至简单的控制台程序都可以。本例中采用WindowsForm程序作为载体。

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Windows.Forms;

using System.ServiceModel;

namespace WindowsFormsWcfApp

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

//声明宿主

ServiceHost host =null;

private void btnStart_Click(object sender, EventArgs e)

{

host = new ServiceHost(typeof(WcfService1.Service1));

host.Open();//启动服务的监听器信道,监听请求

//host.AddServiceEndpoint(typeof(IMyProcess), new BasicHttpBinding(), "manualWCF");

//ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

//smb.HttpGetEnabled = true;

//host.Description.Behaviors.Add(smb);

label1.Text = "数据表格服务已启动";

}

private void btnStop_Click(object sender, EventArgs e)

{

if (host.State != CommunicationState.Closed)

{

host.Close();//停止数据表格服务

}

label1.Text = "数据表格服务已停止";

}

}

}

3.4 WCF客户端调用服务

客户端程序需要生成一个代理类来调用服务,然后实例化代理类,最后象调用普通本地方法一样来调用服务方法。

DataContentRef.ServiceClient wcfClient= new DataContentRef.ServiceClient();

ArrayList ListName=wcfClient.getDataArrayList()//获取数据内容表格

4、结论

通过WCF的例子,我们可以知道下一代的SOA的微软实现架构。其中确实对代码量进行了精简。并方便其更新其服务框架。以该框架进行扩展,可以衍生出基于WCF的N层模型的泛型。服务端可以跨平台,客户端可以在浏览器上实现,也可以标准的WinForm作为载体。为在微软编程平台下制定基于SOA标准的应用程序提供了实现例子。

参考文献:

[1] 姚刚霞 陶伟盛. 基于.Net的通信模型的实现[J]. 网络安全技术与应用,2009.9 69-71

[2] 李天平. .NET深入体验与实战精要[M]. 北京 电子工业出版社 2009.6

[3] 蒋金楠 WCF技术剖析(卷一)[M].北京 电子工业出版社 2009.7

[4] 徐雷 WCF技术内幕[M]. 华中科技大学出版社 2010.3

[5] 周明全 吕林涛 李军怀. 网络信息安全技术研究[J] 西安电子科技大学出版社.2005

[6] 杨义先.网络信息安全与保密[M]. 北京邮电大学出版社.1999

作者简介:

程序框架 篇4

一、英国绩效审计回顾

绩效审计是公共审计的一个重要组成部分, 绩效审计的发展与公共审计密切相连。公共审计 (public audit) 即公共部门审计, 在英国可以追溯到14世纪, 其发展可以归结为三个阶段。

(一) 无法律依据的阶段 (1983年以前)

1314年, 英国在财政部内任命了第一位审计长。1857年, 公共资金特别委员会建议政府各部门就议会拨款的使用情况建立账目, 以便每年提交下议院审查。1861年, 下议院根据财政大臣威廉姆·格拉德斯通的提议, 建立了公共账目委员会。随后, 根据1866年《国库和审计部门法》, 设立了主计审计长, 主计审计长以政府官员的身份工作, 负责检查每一笔拨款的账目, 将结果向议会报告。从此, 公共财务审计在英国正式登上了历史舞台。

1866年后, 公共资金的支出由下议院审批, 主计审计长负责拨款和审计政府账目, 最终由议会的专门委员会作出结论, 向下议院报告 (详见图1) 。由于主计审计长负责政府账目审计, 这使其有机会从比财务审计更广的视角来考虑公共资金的有效利用。并且公共账目委员会也积极支持这种审计, 主计审计长将审计政府账目的结果作为审计报告的一部分向议会汇报。这就是有别于财务审计的绩效审计雏形, 这是一种全新的审计, 开创了公共审计的新领域。

1921年, 英国议会对《国库和审计部门法》进行了修改, 通过了《国库和审计部门法修正案》, 规定主计审计长应检查:政府拨款和赠款的使用是否符合议会的要求;支款程序是否符合授权权限;政府部门及下属机构的商业、生产活动是否存在和正确。但无论是《国库和审计部门法》还是《国库和审计部门法修正案》都没有授权主计审计长进行绩效审计。因此在1983年以前, 英国所开展的绩效审计工作并没有任何法律依据, 只是因为议员有兴趣了解被审计单位的绩效情况, 且对报告被审计单位的绩效状况持积极支持的态度, 绩效审计也就不断的展开了。

(二) 出现法律依据的阶段 (1983年—1997年)

1983年公布的《英国国家审计法》, 首次正式为审计署开展绩效审计提供了法律基础。该法案主要包括以下内容:

《英国国家审计法》开宗明义地规定:“本法旨在通过有关任命主计审计长并确认其地位的新的法规。通过建立公共账目委员会和国家审计署, 通过制定能使政府部门和其他机构团体更有效、更经济地使用公共资金的新法规, 来加强议会对公共资金使用的控制和监督。”由此可以看出该法案首先改变了主计审计长的身份, 使其由政府官员变成了下议院官员, 其次, 建立国家审计署协助主计审计长开展审计工作。

该法的第一条规定:“主计审计长在履行职责时, ……应享有充分的自主权。但在决定是否进行这种检查时, 他应考虑公共账目委员会的建议”。可见, 英国国家审计的法律地位是:国家审计是议会的一种监督;具有“自主权”的独立性, 既独立于政府, 又相对独立于议会。议会在监督公共资金上设立两个机构, 一是议会自身的“公共账目委员会”, 二是向议会负责的, 又自成组织体系的国家审计署, 该署依法具有独立性, 但主计审计长在决定进行某种检查时, 要考虑议会公共账目委员会的建议, 在一定程度上受制于议会。

同时, 《英国国家审计法》也对绩效审计做出了明确规定, 即“主计审计长可以……对任何组织为履行其职能而使用所掌握资源的经济性、效率性和效果性进行检查。”从而正式授予主计审计长拥有绩效审计的特权, 即有权就政府部门和其他公共机构使用公共资源的经济性、效率性和效果性展开检查。

(三) 明确跟踪检查程序的阶段 (1997—)

1997年, 英国国家审计署首次发布了绩效审计手册, 确立了绩效审计应该遵循的审计准则, 并肯定了已有的工作方式。在随后的6年中, 英国绩效审计取得了突破性的进展, 并于2003年发布了新版绩效审计手册。该手册提出了绩效审计的八条基本原则;建立了适用于所有绩效审计项目 (少数由公共账目委员会决定不举行听证会的项目除外) 的九个循环程序环节 (详见图2) , 即确定审计项目、制定审计计划、审计实施、起草报告、交换意见、发布审计报告、提交公共账目委员会、政府答复、跟踪检查九个环节;建立了贯穿于所有绩效审计项目的要素体系, 即审计准备、审计实施、跟踪检查;且提出了绩效审计“质量环节”概念。跟踪检查既是循环环节的重要组成部分, 又是贯穿于所有绩效审计项目的要素之一。由此可见, 在英国绩效审计中跟踪检查是非常重要的环节之一。

二、英国绩效审计跟踪检查框架

从英国绩效审计的发展可见, 跟踪检查程序随着绩效审计的日渐成熟而逐渐凸显并成为英国绩效审计中重要的程序之一。尤其在2003年的英国绩效审计手册中, 明确规定了跟踪检查是英国绩效审计循环的最后一个环节;是贯穿于所有绩效审计项目的要素体系;是必不可少的绩效审计程序。因此, 了解英国绩效审计跟踪检查程序有助于我国绩效审计的发展。

(一) 跟踪检查目标

英国绩效审计跟踪检查过程主要包括以下3个目标: (1) 督促被审计单位采取积极措施, 落实审计建议和公共账目委员会的决议, 从而促进审计报告的有效执行; (2) 检查和评价绩效审计项目的质量及效果, 为加强审计项目管理和质量控制提供依据和基础; (3) 全面、客观的总结经验教训, 为审计人员汲取知识、累计经验和改进审计实务提供了有效途径。

(二) 跟踪检查阶段的主要工作内容

在英国绩效审计的跟踪检查过程中, 审计人员更加关注发现的薄弱环节是否已得到纠正, 而较少关注具体的审计建议是否得到执行。通常在英国绩效审计跟踪检查阶段, 审计人员要完成两方面的工作:

1. 确认审计意见的影响, 并对被审计单位执行审计建议的情况做出评价和反映

英国国家审计署把绩效审计的影响分为三类: (1) 量化的经济影响。主要表现为, 绩效审计在促进经济性和效率性的提高方面, 应用金额量化的影响; (2) 量化的非经济影响。这类影响虽然不能用金额来计量, 但可以用数字来衡量和说明部分整改情况; (3) 质的影响。这类影响主要表现为绩效审计提高了效果性。

英国审计署规定在跟踪检查阶段, 确认审计影响有以下几个步骤: (1) 评价被审计单位根据国家审计机关建议而采取的整改措施; (2) 复查英国国家审计署和公共账目委员会报告中的建议, 并与被审计单位反馈的内容相比较; (3) 保持与被审计单位的联系, 持续关注他们的整改程序和实际进展; (4) 记录和确认影响。

2. 采取事后监督工作, 检查和评价审计质量, 全面总结经验教训

在英国绩效审计的跟踪检查过程中, 对政府绩效审计项目实施建设性的事后监督工作, 是绩效审计项目终了前的最后一项工作, 也是跟踪检查阶段的一项重要工作内容。

英国审计署规定, 对绩效审计进行建设性的事后监督方式主要集中在以下四个方面:新闻媒体报道;外部监督;征求被审计单位的反馈意见;审计组复核。

在跟踪检查阶段, 审计组要根据事后监督结果, 对审计项目做出全面总结。总结和推广先进经验可以采取以下措施:审计组通过内部复核总结经验教训;在国家审计机关内部出版物上发表文章;举办培训或座谈会等活动。

三、英国绩效审计跟踪检查框架对我国的启示

从英国绩效审计的跟踪检查框架可以看出, 英国绩效审计的跟踪检查程序已经走向了成熟而完备的阶段, 对我国发展跟踪检查有着非常重要的启示意义。但是由于我国与英国的国情存在差异, 因此我国的跟踪检查程序应致力于中国国情。

(一) 跟踪检查目标

英国绩效审计的跟踪目标虽然体现了对审计效果和质量的检验评价, 但是该目标过于笼统, 不便于操作, 且并没有体现绩效审计的效率性和经济性。

因此本文提出了以下跟踪检查程序的目标: (1) 对审计效果进行检验和评价。检查被审计单位是否依据审计结论和建议, 改进被审计单位管理、增强责任感、提高资金和资源的使用效率及效果。 (2) 对审计质量进行检查和评价。对审计质量进行检查和评价指的是对审计项目的质量进行事后的检查和评价, 以便总结审计项目执行中的经验教训, 从而提高审计机关的工作水平。

(二) 跟踪检查阶段的主要工作内容

英国绩效审计跟踪检查程序中, 审计人员更加注重发现的薄弱环节是否得到纠正, 而较少关注具体的审计建议是否得到执行。这样做不利于审计人员分析审计建议是否被采纳的原因, 以及了解被审计单位是否采取有效的措施落实审计建议。

因此, 本文认为绩效跟踪程序, 应主要是对审计决定和建议的落实、采纳情况进行检验。 (1) 审计决定的落实情况。我国政府审计基本准则规定:审计机关的审计决定书自送达之日起生效, 应于90日内执行完毕, 特殊情况下可以适当延长, 但必须经审计机关批准。审计机关应在审计决定书自送达之日起90日内, 了解审计意见的采纳情况, 监督检查审计决定的执行情况。如发现被审计单位超过90日仍未执行的, 审计机关应报有关政府或提请有关部门处理, 或向人民法院提请强制执行; (2) 审计建议的采纳情况。审计人员应在后续检查过程中, 针对每一项建议检查建议是否采纳。如果审计人员发现审计建议没有被采纳, 因分析其原因。对于已经采纳的审计建议, 审计人员应对根据审计建议采取措施进行整改所产生的经济性、效果性、效率性进行分析, 评价审计建议产生的影响。

(三) 跟踪检查的方法及步骤

英国绩效审计中没有对跟踪检查方式做出具体的规定。本文认为后续跟踪检查的方法应包括以下几点: (1) 随时了解被审计单位的活动。通过与被审计单位保持联系, 及时了解被审计单位的情况, 取得被审计单位对审计报告的理解与采纳情况, 以实现后续跟踪检查; (2) 桌面复核。审计人员只做一些简单的复核, 必要时与被审计单位人员进行访谈; (3) 对被审计单位进行后续跟踪审计。后续跟踪审计是被审计单位根据审计建议进行整改情况的专门审计。后续跟踪审计一般适用于重大的绩效审计项目, 或实施审计建议时间长的项目。

在跟确认审计影响时, 与英国相比我们应当把重点放在评价被审计单位的整改措施和复查绩效审计报告中的建议上来。因此, 本文认为在跟踪检查阶段, 确认审计影响的步骤应当包括:检查审计决定的落实情况;评价被审计单位根据审计机关建议而采取的整改措施;复查绩效审计报告中的建议, 并与被审计单位反馈的内容相比较;保持与被审计单位的联系, 持续关注他们的整改程序和实际进展;记录和确认影响。

(四) 对审计质量进行评估

在英国绩效审计的跟踪检查程序中, 对政府绩效审计项目实施建设性的事后监督工作忽略了被审计单位对审计质量的评估。对绩效审计项目的质量进行后续评价, 是绩效审计项目终了前一项非常重要的工作, 也是审计机关质量控制体系的重要组成部分, 意义重大。审计机关可以利用调查问卷或座谈会方式, 征求被审计单位对审计质量的看法。审计质量的评价内容包括:项目是否能增加被审计单位的价值;审计程序是否合理;审计人员专业水平如何;审计报告是否客观公正。

综上所述, 我国建设跟踪检查程序应注意以下方面的完善:跟踪检查程序的目标应体现效率性、效果性和经济性;在跟踪检查程序中, 审计人员应从审计决定的落实情况和审计建议的采纳情况两方面出发进行跟踪检查;增加跟踪检查的方法和符合我国实际绩效审计情况的跟踪检查步骤;在事后监督工作中, 应强调对审计质量进行评估。

摘要:英国跟踪检查程序发展较早, 为我国提供了借鉴经验。我国建设跟踪检查程序的目标应体现效率性、效果性和经济性;应从审计决定的落实情况和审计建议的采纳情况两方面进行跟踪检查;应增加跟踪检查的方法及符合我国实际的跟踪检查步骤;在事后监督工作中, 应强调审计质量的评估。

关键词:绩效审计,跟踪检查,框架

参考文献

[1]审计署外事司.国外效益审计简介[M].中国时代经济出版社, 2003.

[2]章轲.英国绩效审计[M].中国时代经济出版社, 2005.

[3]刘家义.刘家义同志在全国审计工作会议上的讲话[J].审计研究, 2009, 1.

[4]戚振东, 吴清华.政府绩效审计:国际演进及启示[J].会计研究, 2008, 2.

[5]陈亮, 李建新, 王云峰.英国、美国和澳大利亚政府绩效审计的内容和评价标准[J].审计与经济研究, 2007, 4.

[6]Value for Money Handbook-A Guide for Building Quality into VFM Examinations, NAO ofUK, 2003.

程序框架 篇5

近年来随着Internet的迅速发展, 基于各种技术的网络应用程序广泛应用于人们的生活中。B/S架构由于零部署, 易升级, 操作简单等巨大优势, 迅速成为企业应用软件系统架构的主流。然而在过去几年中, 人们在服务器端的开发投入了大量的精力, 各种成熟的开发框架以及开发技术的不断出现, 使得Web应用程序在性能等方面有了很大的提高。然而Web用户界面对响应灵敏方面却投入不足。在传统的Web应用采用同步交互过程中, 用户首先向HTTP服务器发送一个请求。然后服务器执行某些任务, 再向发出请求的用户返回一个HTML页面。这是一种不连贯的用户体验, 服务器在处理请求的时候, 用户多数时间处于等待的状态。当软件设计越来越讲究人性化的时候, 这种用户体验简直与这种原则背道而驰。随着AJAX技术的出现, 使得Web应用可以为用户提供更加自然、灵敏的浏览体验。

2 AJAX技术体系

2.1 AJ AX的相关概念

AJ AX这个概念的最早提出者J e s s e J am e s Garre tt认为:AJAX是Asynchronous JavaScript and XML (异步JavaScript和XML) 的缩写[1]。其中异步意味着你可以经由HTTP协议向一个服务器发出请求并且在等待该响应时继续处理另外的数据。AJAX并不是一门新的语言或技术, 它实际上是几项技术按一定的方式组合, 在共同的协作中发挥各自的作用。它包括以下技术:JavaScript、XHTML和CSS、DOM、XML和XSLT、XMLHttpReque s t。其中:使用XHTML和CSS标准化呈现, 使用DOM实现动态显示和交互, 使用XML和XSLT进行数据交换与处理, 使用XMLHttpRequest对象同服务器进行异步数据读取, 最后用JavaScript绑定和处理所有数据[2]。下图1为AJAX Web应用模型。

2.2 AJ AX的交互过程

与传统的Web应用不同, AJAX采用异步交互过程, 使用户从请求/响应的循环中解脱出来。AJAX的工作原理相当于在用户和服务器之间加了中间层即AJAX引擎, 使用户操作与服务器响应异步化。从而消除了网络交互过程中的处理-等待-处理缺点。用户的浏览器在执行任务时即装载了AJAX引擎。AJAX引擎, 实际上是一个比较复杂的JavaScript应用程序, 它负责编译用户界面及与服务器之间的交互。AJAX引擎允许用户与应用软件之间的交互过程异步进行, 独立于用户与网络服务器间的交流。现在可以用JavaScript调用AJAX引擎来代替产生一个HTTP的用户动作, 内存中的数据编辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给AJAX来执行[3]。

AJ AX实质上也是遵循Re que s t/Se rve r模式, 所以基本上的流程是:对象初始化, 发送请求, 服务器接收, 服务器返回, 客户端接收, 修改客户端页面内容。只不过这个过程是异步的, 下图2为AJAX异步交互过程。

2.3 AJ AX技术的优点

AJ AX的出现, 揭开了无刷新更新页面时代的序幕, 实现了Web浏览器技术中大量的尚未实现的潜力。AJAX尤其适用于交互较多, 频繁读数据, 数据分类良好的Web应用。它在应用中主要具有以下优点:

(1) AJAX的原则是“按需取数据”, 所以减少了冗余数据请求和响应对服务器造成的负担。

(2) 无刷新更新页面, 减少用户实际和心理等待时间。

(3) AJAX使Web中的界面与应用分离, 这样有利于页面的开发和维护。

(4) 使用AJAX可以把以前的一些服务器负担的工作转嫁到客户端, 利于客户端闲置的处理能力来处理, 减轻服务器和带宽的负担, 节约空间和带宽租用成本。

(5) AJAX具有更好的用户体验, 也可以调用外部数据。

(6) 基于标准化的并被广泛支持和技术, 并且不需要插件或下载小程序。

3 结合DWR开发AJAX程序

3.1 DWR基本概念

DWR (Dire ct We b Re m oting) 项目是Apache的一个开源的解决方案, 它包含服务器端Java库、一个DWR s e rvle t以及J avaScript库。DWR是一个引擎, 可以把服务器端Java对象的方法公开给JavaScript代码。使用DWR可以有效地从应用程序代码中把AJ AX的全部请求-响应循环消除掉。这意味着客户端代码再也不需要直接处理XMLHttpRequest对象或者服务器的响应, 不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成XML, 甚至不再需要编写servlet代码把AJAX请求调整成对Java对象的调用。

DWR是作为We b应用程序中的s e rvle t部署的。这个servlet有两个主要作用:首先, 对于公开的每个类, DWR动态地生成包含在We b页面中的J avaScript。生成的JavaScript包含存根函数, 代表Java类上的对应方法, 并在幕后执行XMLHttpRequest。这些请求被发送给DWR, 这时它的第二个作用就是把请求翻译成服务器端J ava对象上的方法调用并把方法的返回值放在s e rvle t响应中发送回客户端, 编码成JavaScript。DWR允许迅速而简单地创建到服务器端对象的AJAX接口, 而不需要编写任何servlet代码、对象序列化代码或客户端XML-HttpRe que s t代码。这种从J ava到J avaScript调用机制类似于常规的RPC机制, 或RMI或者SOAP.但是它运行在web上, 不需要任何浏览器插件[4]。

3.2 基于DWR的AJ AX开发

这里以在智能小区信息平台中实现的部分AJAX为例, 介绍基于DWR的AJAX开发全过程。本例中, 用户可以通过无刷新的页面在不同时间段对不同的能耗类别进行查询和使用量统计。该例中包含了两个主要的类分别是Ene rgy.java和Ene rgyAccount.java。其中Ene rgy.java类是一个有着属性和getter/setter方法的简单的Java类。Ene rgyAccount.java是数据访问类, 用来查询数据库并基于用户的搜索标准来返回信息。

首先设置DWR的使用:将DWR的jar文件拷入We b应用的WEB-INF/lib目录中, 在w e b.xm l中增加一个servlet声明, 并创建DWR的配置文件。DWR的分发中需要使用一个单独的jar文件。你必须将DWR servlet加到应用的WEB-INF/web.xml中部署描述段中去。

然后你必须让DWR知道通过XMLHttpRequest对象, 什么对象将会接收请求。这个任务由叫做dwr.xml的配置文件来完成。在配置文件中, 定义了DWR允许你从网页中调用的对象。从设计上讲, DWR允许访问所有公布类的公共方法, 但在我们的例子中, 我们只允许访问几个方法。下面是我们示例的配置文件:

dw r.xm l文档的根元素是dw r。在这个元素内是allow元素, 它指定DWR进行远程的类。allow的两个子元素是create和convert。create元素告诉DWR应当公开给AJAX请求的服务器端类, 并定义DWR应当如何获得要进行远程的类的实例。这里的creator属性被设置为值ne w, 这意味着DWR应当调用类的默认构造函数来获得实例。convert则负责这些方法的参数和返回类型。conve rt元素的作用是告诉DWR在服务器端J ava对象表示和序列化的JavaScript之间如何转换数据类型。

配置完成后, 你就可以启动你的Web应用了, 这时DWR会为从你的HTML或J SP上调用所需方法作好准备, 并不需要你创建JavaScript文件。在energystatistic.js p文件中, 我们必须增加由DWR提供的J avaScript接口, 还有DWR引擎, 加入以下到我们的代码中:

在energystatistic.jsp文件中创建了一个JavaScript函数:其中EnergyAccount.countEnergy () 函数是DWR动态地生成包含在Web页面中的JavaScript。中display () 函数, 它指明了当接收到服务端的返回时DWR将会调用的JavaScript方法。display于是被调用来在HTML页面中显示统计结果。下面是在这个交互场景中所使用到的J avaScript函数:

4 结语

本文系统的介绍了AJAX技术体系, 并展示了如何利用DWR框架开发AJAX应用程序。通过AJAX技术, 能够大幅度提高Web应用的性能, 用户的体验可以得到大幅提升。然而尽管AJAX技术已经取得了极大进展, 但它在对移动设备的支持上、流媒体的支持上、AJAX引擎的兼容性上仍有待进一步研究。AJAX是一个快速发展的领域, 不断涌现的新技术必将快速推动Web应用的发展。

参考文献

[1]Brett McLaughlin, Introduction to Ajax[EB/OL], http://www-128.ibm.com/developerworks/xml/library/wa-ajaxintro1.html, 2005.

[2]Jim Ley, Using the XML HTTP Request object[EB/OL], http://www.jibbering.com/2002/4httprequest.html, 2006.

[3]Jesse James Garrett, Ajax:A New Approach to WebApplications[EB/OL], http://www.adaptivepath.com/publications/essays/archives/000385.php, 2005.

程序框架 篇6

MFC库通过COleDataSource类、COleDataTarget类、COleDataObject类和CView类内置了一套支持拖放操作的架构,但是该框架主要是面向跨应用程序的文件拖放而实现的,不太适合在同一进程内任意内存对象的拖放,比如不直接支持动态显示任意的拖放图标、拖放源和拖放目标必须要从CView类继承、依赖于复杂的OLE机制等。

本文基于MFC库,脱离现有的拖放架构,建立了一个进程内的通用拖放管理架构,以实现应用程序内任意的两个窗口对象之间的任意对象的拖放操作,具有自定义的图标显示、拖放指示和灵活的可扩展性等特性。通过重用该模块,可以轻易实现具有直观有效的拖放功能的用户界面,提高开发质量和效率。

1 拖放相关机制

1.1 鼠标捕捉和坐标转换

拖放操作首先需要捕捉鼠标,使用::SetCapture(HWND hWnd)函数和::ReleaseCapture()函数对鼠标进行捕捉和释放。一旦捕捉后,所有的鼠标消息将发往hWnd所指定的窗口对象。

捕捉后鼠标消息中包含的坐标值都是相对于捕捉窗口的。鼠标移动到拖放目标窗口时,拖放管理器需要将相对于捕捉窗口的坐标转换为拖放目标窗口的坐标,并调用拖放目标窗口的OnDragOver(CDragData&dragData,const CPoint&point)函数。拖放管理器自动完成这个转换。转换的方法是先调用::ClientToScreen()函数转换到屏幕坐标,然后再调用::ScreenToClient()函数转换为拖放目标窗口的坐标。

1.2 拖放图标显示

拖放中的图标显示使用CImageList类。相关的成员函数如下:

CImageList::BeginDrag(CWnd*pWndLock,CPoint point)函数开始图像的拖动;

CImageList::DragMove()函数显示拖放中的图标,即一个半透明的图标并随鼠标的移动而移动;

CImageList::EndDrag()结束本次拖放显示。

拖放中鼠标距离所显示的图标的左上角的坐标点称为热点(hotspot)。拖放中的图标总是以热点为基点随鼠标的移动而移动。

CImageList中的图像通常由拖放源来创建,如果没有创建的话,拖放管理器将创建一个默认图标,并设置热点坐标为CPoint(8,8)。

1.3 拖放范围

拖放的范围是一个限制拖放操作范围的窗口对象,超出这个范围,拖放的图标将不再显示。这个拖放范围是通过调用CImageList::BeginDrag函数中的pWndLock参数注册。这个工作由拖放管理器自动完成。

1.4 拖放回调接口IDragGrop

每个涉及到拖放操作的窗口对象都必须实现IDragGrop接口,拖放管理器通过该接口与拖放源和拖放目标进行交互。IDragGrop接口的定义如图1。

OnDragEnter接口函数由拖放管理器在拖放激活时对拖放源窗口调用。拖放源窗口通常根据传递的鼠标坐标点判断何对象被选中,如果有合法的对象,则生成该对象的显示图标以及设定鼠标热点坐标,向dragData注册该对象并返回true。返回false则终止拖放。如果不生成图标,则拖放管理器使用内部缺省的图标。

OnDragOver接口函数在拖放图标进入拖放目标窗口时被调用。此函数的返回值决定了拖放过程中光标的显示类型,如果返回true,则光标显示为接受型;如果返回false,则光标显示为拒绝接受型。

OnDrop接口函数在用户释放鼠标左键的时候,由管理器对拖放目标窗口调用。拖放目标窗口判断被拖动的对象及相关信息,更新内部相应的记录并返回true。返回false表示接受拖放对象失败。返回值被传递到接下来调用OnDragEnd函数的bAbort参数。

OnDragEnd接口函数在用户释放鼠标左键、对拖放目标窗口OnDrop调用之后,由管理器对拖放源窗口调用。拖放源窗口根据b Abort参数判断拖放过程是否正常完成,如果正常完成,则释放被拖放对象的相关数据结构。

1.5 拖放数据对象CDragData

拖放数据对象CDragData主要保存拖放的数据,包括拖放源、当前的拖放目标窗口、当前的拖放图像、拖放热点以及其它的任意数据。拖放源以及拖放目标均可向CDragData访问和添加任意的数据,比如字节流、指针等。CDragData类的声明如图2所示。

m_otherData字段是一个动态的字节流的数组。用于保存拖放源、拖放目标所访问和添加的任意数据。每项数据都有唯一的字符串ID,通过该数据类型,等于实现了一个简单的拖放协议。

2 拖放管理器的处理逻辑

2.1 拖放管理器的初始化调用注册拖放范围的成员函数Cre-ate(CWnd*pHost)。

调用向拖放管理器注册回调接口的成员函数Add(IDragDrop*pDD)。拖放源窗口和拖放目标窗口都需要向拖放管理器注册它们的回调接口。如果拖放目标窗口只接受“放”的操作而不允许“拖”的话,可以在OnDragEnter实现中返回false。

2.2 拖放动作的激发及拖放处理引擎

拖放源调用拖放管理器的OnLButtonDown函数激发拖放循环。在拖放管理器的OnLButtonDown函数中,建立了一个消息泵。核心代码如下:

2.3 拖放

流程及与回调接口的交互拖放管理器被激发后进入拖放控制流程,拖放管理器根据用户控制的鼠标移动来分别对拖放源和拖放目标进行回调。以CDragData为媒介,拖放源与拖放目标进行相互的交互,最终达到拖放数据交换的目的。具体的流程如图3所示。

3 结束语

该文建立了一个进程内通用的拖放管理器框架,包含可任意扩展的拖放数据类、精心设计的IDragDrop回调接口和一套完整的实现。拖放源和拖放目标只要实现IDragDrop接口,就可实现复杂的拖放操作。具体的拖放实现细节,包括拖放图标的显示、坐标的转换、拖放中途的退出、拖放状态的转换等均由拖放管理器完成。通过CDragData类实现了拖放源与拖放目标的交互。

相比MFC中所支持的拖放框架,本文建立的框架具有拖放图片的可定制、不需要从CView类继承、拖放过程不需要用户关心等特点,具有更强的适应性。

图4所示为某一航空配载系统中车辆装备配载的拖放配载界面,其内部实现是采用本文中的拖放管理器框架。拖放过程中光标形状提示了是否能放下该对象。程序在VS2005开发环境下开发,编译运行通过。

摘要:在分析MFC库现有拖放框架的基础上,建立了一套应用程序内的通用拖放框架,明确了拖放过程中参与者以及参与者之间的交互。实现针对应用程序内拖放的更灵活适用的拖放框架。并通过一个示例展示了拖放的效果。

关键词:MFC,C++,拖放,拖放管理器,接口

参考文献

[1]Microsoft Corporation.MSDN Liarary[M].Microsoft Corpora-tion,2008.

[2]Microsoft Corporation.MFC[CP].Microsoft Corporation,2005.

程序框架 篇7

当前, 高职教育不断发展, 各种教育教学理论层出不穷, 而作为教育主体的学生, 学习兴趣却是因专业而异, 学习主体性的发挥也受到了一定的限制。程序设计课程作为软件设计专业的主干课程, 其重要性不言而喻, 但基于其逻辑性、抽象性较高的特点, 使得很多学生对该课程望而却步。针对以上情况, 将框架式教学模式引入到课堂教学过程中, 构建一个软件框架, 将其应用到各种程序设计的课堂中, 达到程序设计学习微观与宏观的统一, 使得教学能够取得事半功倍的效果。

“框架” (frame) 一词, 是闵斯基 (Minsky, 1975) 研究人工智能 (artificial intelligence) 时所提出的概念和新创的词语。二十世纪五、六十年代的德国范例教学提出“问题解决学习与系统学习的统一”、“掌握知识和培养能力的统一”、“主体与客体的统一”, 其实质就是通过课堂学习来获得系统化的知识结构, 把传授知识与科学方法有机结合。框架式结构教学法, 一方面强调课堂着重分析知识和体系的框架结构, 力求整体把握学科各章节的主体, 另一方面又强调各部分内容的交叉和联系, 注意各阶段知识之间的相互渗透。其实质是以学生为主体, 师生的双向交流。它既包含了静态的教学知识, 又包含了动态性的教学策略, 是科学知识、科学思想以及科学方法之间的有机联系[1]。下面来谈谈框架式教学模式在程序设计教学中的运用。

二、程序设计课程教学的现状分析

(一) 程序设计课程的特点

随着软件技术和物联网技术的迅速发展, 程序设计已经成为当今社会上一种比较热门的技术。程序设计课程在软件专业的课程中, 属于基础课, 也是专业课。该课程涵盖了一系列的程序设计语言课程, 包括C语言、VB语言、C#语言、delphi语言、java语言、网页设计语言等等。该类课程具有其鲜明的特点:

1. 在理论教学上, 各门程序设计课程有很强的共通性, 触类旁通。

2. 理论教学服务于实践教学, 实践巩固理论的理解。

3. 课程的学习有助于培养学生的思维能力、分析解决问题的能力和团队协作能力。

4. 课程的学习有助于学生进一步学习其他相关知识, 提升学生的专业素养和综合素质。

(二) 程序设计类课程存在的问题

程序设计课程目前存在的问题如下:

1. 虽然在机房中进行教学, 学生有一定的操作时间来巩固所学, 但学生的普遍感觉还是比较枯燥, 新旧知识的融合性较差, 使得程序设计教学易于陷入困难的境地。

2. 教师教学过程中, 注重单个知识点的介绍, 容易忽略知识点间的联系, 使得学生难于形成整体的概念, 不知道什么时候去运用该知识点。

3. 课程注重过程性与操作性, 但教学中的教学顺序与实际软件开发的过程不太一致。

4. 教学过程中经常使用的方法是教会学生如何使用该程序开发软件, 易使学生在接触实际项目时不知从何下手。

5. 目前的教学内容与许多企事业单位的实际应用需求脱节, 实用性不强。

三、框架式教学理念在程序设计类课程中的应用

框架式教学的任务首先要求教师对教学内容进行整体规划, 结合教学大纲、教材等实际情况进行课程整体“骨架”的设计, 然后每根“骨头”进行设计, 将各个知识点像血液一样融入其中, 为了培养学生的思维能力、分析和解决问题的能力以及团队合作的能力, 将该类课程的总体骨架分成以下几个部分:

1.以实际的软件设计单位所使用的一种软件框架为例, 让学生了解软件设计的基本流程和体系结构, 这样学生能够从实际出发, 了解该类课程。

2.以树的生长作为一种思维模式, 引导学生形成从抽象到具体的思维方式, 将一学期的课程设计成一个软件框架, 由学生来完成整体构思及各个具体任务的设计。

3.进行软件框架的设计:第一步, 软件的总体规划与设计, 第二步, 基础知识的学习, 第三步, 软件框架的设计, 第四步, 软件的测试与维护。

在这几步中, 第三部分是至关重要的。第一步, 能够让学生了解在软件设计过程中, 需求分析的重要性, 为后续的设计提供依据;而第二步也占有着重要的地位, 它使得学生对一门语言的语法有基础的掌握, 为第三步的成功实施提供依据, 并使得我们的课程能够顺利实施。

我们以delphi程序设计课程为例, 该门课程采用人民邮电出版社出版的张世明的《Delphi程序设计基础》为教材, 为了更好的完成课程的教学, 结合本校教学环境和本课程教学目标的设定要求, 依据课程标准对教材内容进行了整合设计, 以项目展开为主线, 以任务实施为主要内容, 进行课程实施, 使课程教学更为直观、可操作, 更切合专业人才培养的实际要求。

教材内容整合后, 各项目与章节之间的对应关系以及各个项目中的任务信息, 如表1所示:

学生也可以此为参考, 建立自己的骨架信息。

在教学过程中, 我们可以讲课堂的理论教学和实践教学以及学生自主学习、合作学习想结合开展。

(1) 理论教学。教师根据教材和大纲的要求, 以实例演示的方法带领学生进行程序设计语言的学习。完成一个一个骨架的建构, 在教学过程中, 教师可以系统的讲授理论知识, 培养学生的思维能力和分析解决问题的能力。

(2) 实践教学。配合理论教学, 教师引导学生进行软件框架的设计, 学生可以采用教师提供的骨架信息, 也可以自己选择一个相关的主题, 进行设计。即将整个软件框架的设计作为一个贯穿整个学期的综合任务, 学生以小组为单位进行合作学习, 共同完成。在此过程中, 强调学生的主体地位, 以及教师的主导地位, 随着学习的进展, 教师的作用应从大到小, 最终达到学生自主进行的目的。

当然, 在教学过程中, 还可以安排几次“作品展示”活动, 更有效的提高学生的学习积极性, 巩固学习成果。

(3) 自主学习。学生可以通过网络的形式, 通过一些网络教学系统和课程, 按照自己的需求进行自主学习。

以上三部分学习的结合, 有利于培养学生的学习能力, 能够更好的培养软件专业学生的专业素养, 为今后的实际工作打下良好的基础。

结束语

将框架式教学理念引用到教学中来, 并不是第一次尝试, 在其他学科中, 已经有相应的尝试, 并且已经取得了一定的效果。该方法不仅能够激发了学生的学习热情, 提高教学过程的内在吸引力和魅力, 提高教学效果, 而且能够培养学生的素质和职业素养。由框架式教学理念而引导出的三种教学方法的结合弥补了传统教学的不足, 把抽象的问题形象化, 更加具体地反映思维过程, 开阔学生视野、激发学生灵感、开阔思维, 取得良好的教学效果。 (项目来源:江苏省教育科学研究院现代教育研究所【课题批准号:2014-R-28668】)

参考文献

[1]韩文莲.《高中历史框架式结构教学法在课堂教学中的运用》[A].李惠利中学, 2008.10.11.

[2]李艳花.《框架式教学法应用于生物化学教学效果的初步研究》[D].专家论坛, 2011年4月第18卷第10期.

[3]徐茹丹.《“框架式问题”与教学设计》[D].新课程 (综合版) , 2011年06期.

[4]张挺.《框架式教学法在中医基础理论教学中的应用》[D].中国中医药信息杂志, 2013年1月第20卷第1期.P99-100.

程序框架 篇8

1 课件界面

1.1 课件封面

课件运行后, 出现在课件封面左上角的是“南通高等师范学校”的叠放字动画, 中间左边圆内是一几何组合体的旋转动画 (用Swift 3D制作), 中间右边是课件名称“函数y= Asin (ωx+φ) 的图像”的动画, 上下两段文字从左到右逐渐出现组合成倒影效果, 右下角是一“Enter”按钮, 单击“Enter”按钮即可进入教学界面。

1.2 教学界面

在教学界面的下方一共设置了5个按钮和一个显示当前实时时间的电子时钟, 当鼠标移到按钮上时可出现相应文字提示。从左到右五个按钮依次是“导航” 按钮、“音乐”按钮、“返回”按钮、“继续” 按钮、“退出”按钮。用鼠标单击 “导航”按钮, 则从左侧弹出导航菜单, 若再次单击“导航”按钮, 则菜单自动从右向左退出教学界面。若单击菜单上的按钮则可进入相应的教学模块, 且菜单自动从右向左退出教学界面。单击“音乐” 按钮, 播放或暂停背景音乐。单击“继续”按钮, 则显示下一步的教学内容。单击“返回”按钮, 则显示上一步的教学内容。单击“退出”按钮, 弹出退出对话框, 若单击“否”按钮或“叉” 按钮, 退出对话框消失, 若单击“是”按钮, 则运行片尾动画, 退出课件。

1.3 课件封底

课件退出前运行片尾动画, 依次从左到右和从右到左出现欢迎使用、敬请指导、作者: 施永新等信息, 界面如图4所示。

2 时间轴总体

(1) 新建一个ActionScript3.0文档, 并将文件保存为“函数y=Asin (ωx+φ) 的图像.fla”。在右边的文档属性面板中, 单击【编辑】按钮, 在弹出的文档设置对话框中, 将舞台尺寸设为1000×625, 背景设为黑色, 帧频设为12。

(2) 将时间轴第1层更名为“模块标记”, 在第3帧按F7插入一空白关键帧, 选中该帧并在右侧属性面板名称栏中输入“引入”, 设置为帧标签。同样方法分别在相应的帧设置概念、探究、 范例、练习、总结、作业、 退出等帧标签, 这样设置为用gotoAndStop () 命令导航到相应模块提供了方便。第2层为课件封面层, 只在第1帧导入封面背景图片。第3层为教学界面层, 在第2帧导入教学界面背景图片, 并在显示当前日期时间处设置一动态文本框, 用于显示当前日期与时间。第4层为坐标轴层, 在相应的帧将库面板中的zbz影片剪辑元件拖到舞台中。第5层为影片动画层, 将课件用到的影片剪辑动画统一放在该层。第6层为文字图片层, 将教学模块中用到的文字与图片统一放在该层。第7层为按钮层, 将继续、返回、退出、音乐、 导航和动画播放等按钮统一放在该层。第8层为AS层, 将课件所有的ActionScript3.0代码统一放在该层, 这样分层设置, 便于课件的编辑与修改。

3 初始化变量的设置

在AS层第1帧中输入下列代码:

var musicflag:Boolean = true;

var menuflag:Boolean = false;

其中变量musicflag用于控制背景音乐的播放与暂停, 变量menuflag用于当单击导航按钮时控制导航菜单的出现与退出。

4 课件片头的制作

(1) 将课件封面背景图片fmbj.jpg导入到库, 选中时间轴课件封面层的第1帧, 并将库中的位图fmbj.jpg拖到舞台, 将其位置设为x: 0, y: 0。

(2) 选中时间轴影片动画层的第1帧 , 将库中制作好的校名影片剪辑和课件标题名影片剪辑拖到舞台中, 按图1所示位置放置。选中时间轴按钮层的第1帧, 将公用库中的bubble 2 red按钮拖到 舞台的右 下角 , 并将其实 例名设为fmjr_btn。

(3) 将制作好的几何体动画导入舞台, 在时间轴AS层第1帧按F9键输入如下代码:

(4) 要使课件运行后自动播放背景音乐 , 先将背景音乐文件bjyy.wav导入到库, 选中库中的bjyy.wav元件, 单击鼠标右键选属性, 在弹出的声音属性对话框的链接栏中, 勾选为ActionScript导出 (x) 和在帧1中导出, 在类输入框中输入BjSound。然后选中时间轴AS层的第1帧按F9键 , 输入下列代码:

5 导航菜单的制作

在库面板中新建7个按钮元件, 分别命名为复习引入、构建概念、探索研究、讲解范例、课堂练习、 反思总结、布置作业, 然后新建一个影片剪辑元件, 命名为“导航菜单”, 将库面板中的7个按钮元件拖到工作区中, 如图6所示放置。依次选中这些按钮, 分别将其实例名设为zjmyinru_btn, zjm- gainian_btn, zjmtanjiu_btn, zjmfangli_btn, zjmlianxi_btn, zjm- zongjie_btn, zjmzuoye_btn。

6 功能按钮制作

(1) 将公用库中的push button-green和push button-blue拖入到库, 并分别更名为“导航”和“音乐”, 再分别双击之, 在其最上层的指针帧分别添加文字“导航”与“音乐”。

(2) 选择【插入】 /【元件】 /【按钮】, 分别创建返回、继续、 退出、是、否、叉等按钮元件。

(3) 制作退出对话框 , 新建一个“退出”影片剪辑元件 , 在图层1的第2帧按F6键插入一关键帧, 将库面板中的“对话框背景”图形元件拖入到工作区中, 位置为x: 0, y: 0。再将库面板中的“是” 按钮元件拖到工作区中, 设置其实例名为tckyes_btn。将库面板中的“否 ”按钮元件拖到工作区中 , 设置其实例名为tckno_btn。将库面板的“叉”按钮元件拖到工作 区中, 设置其实例名为tckcha_btn。选中第2帧按F9键, 在弹出的代码输入面板中输入: stop () ; 最后效果如图3所示。

(4) 返回场景1, 选中时间轴按钮层的第1帧, 将库中制作好的退出影片剪辑拖到舞台中, 将其位置设为x: 0, y: 0, 并将其实例名设为tcmovie, 当按退出按钮时将会调用此影片剪辑。

7 课件片尾制作

(1) 新建一个影片剪辑元件 , 名称为“片尾MC”, 限于篇幅具体制作步骤此处从略。特别注意在片尾MC时间轴的最上层的最后一帧输入下列代码:

stop () ;

fscommand (" quit" ," true") ;//退出课件运行

(2) 返回场景1, 在时间轴的文字图片层的第57帧 , 将库面板中的徽标.jpg和校名.jpg拖到舞台中, 校名的下方输入“Nan Tong Higher Normal Institute” , 颜色为白 色 , 字体为Baskerville Old Face, 字号为27。再选中时间轴影片动画层的第57帧, 将库面板中的片尾MC影片剪辑元件拖到舞台中, 最后运行效果如图4所示。

8 功能实现代码

返回场景1, 选择AS层的第1帧, 按F9键输入下列代码:

8.1 课件运行初始代码

8.2 实现导航菜单隐藏与显现的函数

8.3 实现背景音乐开关函数

8.4 实现所有按钮功能代码

8.5 教学界面电子时钟代码

(1) 在场景1时间轴的教学界面层的第2帧按F6键插入一关键帧, 选择文本工具在教学界面显示当前日期时间处拖拉出一文本框, 类型选动态文本, 字号为18, 颜色为绿色, 字体为Times New Raman, 选择居中显示, 并将动态文本实例名设为todaydate。

(2) 在时间轴的AS帧的第2帧按F6键再按F9键, 输入如下代码:

至此整个课件的程序框架创建完毕, 然后只需在相应的帧中输入教学内容即可。根据提供的设计模板稍作修改就可制作出富有个人特色的Flash课件。

摘要:以课件《函数y=Asin(ωx+φ)的图像》为例,详细剖析了基于ActionScript3.0的Flash课件的程序框架设计。包含片头、片尾、导航菜单、功能按钮的设计与制作,以及所有功能实现的代码,为基于ActionScript3.0的Flash课件制作提供了一个通用模板。

程序框架 篇9

随着高级编程语言和操作系统在越来越多种类的CPU构架上的应用,系统应用程序变得越来越大,越来越复杂。并且实际应用大多对于程序的设计周期、可靠性都具有很高的要求。基于传统的嵌入式实时操作系统的软件设计,虽然可使程序的实时性能得到提高,但是并行程序设计过程中存在着更多的竞争状态,而且这些竞争状态极难被发现。如何能够找到一种符合软件工程学的程序设计方法成为每个嵌入式软件工程师所面临的问题。

传统的实时操作系统虽然可以完成任务管理,但是往往代码量较大,任务切换要求复杂,完全摒弃编译器提供的程序调用机制,采用任务堆栈机制,接口程序设计要求高,实现任务切换时占用资源较大,不适合应用于8位和16位总线构架的CPU上。

另一方面,基于UML的实时框架程序设计方法对于当今的高复杂性、短开发周期的商业环境来说变得越来越重要。主要是因为UML语言是可执行的,所以根据UML建立的系统行为模型可以生成可执行代码,从而节约了从抽象模型到手工编写可执行代码的费时、费力的工作量[1]。但是所有的UML代码生成工具是为类似PC上应用而设计的,不适合应用于中小型的CPU,且售价昂贵。

如果将RTOS的实时性与UML模型设计的直观性、安全性和便捷性相结合,应用于中小规模的CPU芯片无疑会给深度嵌入式系统开发带来更多的手段。

1 实时UML框架程序设计平台(QP)简介

QP是使用实时抢占式任务管理内核、基于UML状态图的软件设计方法的轻量级软件平台[2],是一种新式操作系统[3]。QP软件平台结构如图1所示由以下4个部件组成。

1.1 任务管理内核(QK)

QK也采用了类似其他商业内核的优先级的抢占机制以保证关键任务得到实时执行。但是QK实现抢占的原理有别于任何一种操作系统。QK采用的是Moore状态机的“运行到结束”的机制,因此当系统还在忙于处理前较低优先级事件时,当较高优先级的事件到来时,系统将新事件存储在消息队列中,直到低优先级事件完成后,再执行新事件[2]。QK的实现原理不同于传统RTOS的堆栈操作,仅使用C语言编译器的中断服务程序(ISR)机制就可完成。也就是QK的移植完全不需要插入额外的汇编语句。所以,任务切换时没有额外的开销,执行速度快,相当于子程序调用[1]。当然如果使用其他RTOS的任务管理功能也能代替QK,稍候在QP到TMS320LF2407的接口程序设计部分介绍。

1.2 基础框架平台

该框架平台完成了驱动事件管理功能、状态机架构管理和实时任务管理功能。

实时UML框架序设计平台(QF)中任务是由能实现轻量级UML状态机和用来接收触发事件的消息队列组成。因此基于实时UML框架的任务具有UML状态机的特点[1]。QF将任务分为激活状态和休眠状态,QF根据触发事件和任务优先级对其进行管理。实际工作时任务间采用异步的事件发送和接收机制进行通信。任务使用消息队列接收其他活动对象的事件消息;同时,不同任务产生的事件也会利QF投送给其他订阅该消息的任务。对于触发事件的交换,排队,收集,销毁等工作则由QF统一完成[3]。可见,任务间通过QF框架进行间接通信,实现了事件松耦合。因此,基于QF的程序设计可以采用模块化的设计方法,给设计过程中方案的修改和设计后期的软件维护提供了极大的方便。正像使用UML的自动设计工具软件进行程序设计的过程一样,使用QF的程序设计也遵循以下过程:使用UML语义进行模型设计,根据QP平台代码转换方法将UML模型转化为源代码。

总之,基于QF的程序设计实现了可视化程序设计和“自动”代码生成的目的;另外,在嵌入式系统中也可以将QF当作为一个软件总线,将QF的接口移植到其他OS之上,以隐藏下层硬件和软件的差异[3]。

1.3 状态机部件(QEP)

上节提到的QF任务的状态机的特性是由状态机部件(QEP)完成的。QEP是一个简化的轻量级的UML状态机部件,实现了状态机的状态转换触发事件响应等功能。QEP提供了两种状态机类型:层次化状态机(HSM)和平面状态机(FSM)[1,3]。

1.4 跟踪调试器(QSPY)

QSPY使用缓存机制采集系统内运行状态,事后在空闲任务时再编码输出,再有在整个QP平台中QSPY调试插件有机的与系统关键运行环节有机的结合在一起,因此基于QSPY的调试可以获得更多的系统的信息的同时又不会过多地干扰程序的正常运行。在这一点上比传统RTOS中的跟踪调试器更领先一步[1]。

2 QP到TMS320LF2407的接口移植

QP存在C和C++版本[3]。基于C语言版本的精简版QP平台的代码量可以在4 KB左右,可以轻易的放入到大多数的小规模CPU的片上存储器中。并且该平台的实现原理如上节所述可以使用C编译器实现[4],因此移植工作量极少,仅需几十行的C语言程序就可完成。显然在诸如TMS320LF2407的中小型的CPU上更适合使用基于C的版本。QP移植主要的工作集中在改写qep_port.h,qf_port.h,qf_port.c,qk_port.h和qs_port.h这4个文件。

2.1 QEP的接口移植

QEP完成了状态机的实现机制。配置和移植QEP需修改qep_port.h头文件中关于各种数据类型和主要参数的定义。其中主要的有Q_ROM,Q_ROM_VAR和QEP_SIGNAL_SIZE三个宏定义。Q_ROM宏是用来定义常变量到程序存储区域的,比如使用较大的表或数组等常数时不希望占用RAM资源时,将其定义在程序区,可以使用Q_ROM宏。定义方法根据不同的编译器而不同,比如在Keil C51中Q_ROM被定义为code关键字。Q_ROM_VAR宏用来定义如何采用指针类型取程序存储器变量。QEP_SIGNAL_SIZE宏用来定义信号宽度,通常为1,2或4。针对TMS320LF2407的硬件结构特点定义了8位、16位和32位有符号和无符号数的类型。

2.2 QF的接口移植

QF的移植主要集中在对于状态机和任务管理方面。在qf_port.h中根据实际的软件需求修改状态机实现相关的定义,例如触发事件的类型、事件队列的深度和事件缓存的容量。QF中事件初始位置存放在事件缓存区中,所有的任务间的事件传递使用指针方式进行,从而有效地减少了事件传递对内存的开销。任务管理方面定义了最大任务数、中断嵌套相关的定义以及任务切换的机制。

在pf_port.c中需要编写有关诸如QF平台开始和退出代码,如无特殊需要这些函数可以使用空函数代替。QP平台中对于程序的运行关键位置使用了断言手段进行约束,在平台运行异常时会给出诊断信息。在pf_port.c的Q_assert_handler()函数可以返回平台错误信息。

2.3 QK的接口移植

QP平台的任务调度机制在QK中完成。因此QK的移植需要根据TMS320LF2407的编译工具进行接口函数的设计。所有调度相关的定义在qk_port.h头文件中。其中主要的是中断相关的定义,如:开关中断的机制和中断响应程序的进入和退出机制等。

QK中使用QK_INT_KEY_TYPE,QK_INT_LOCK(key_),QK_INT_UNLOCK(key_)三个宏接口定义了中断开关机制。其中QK_INT_KEY_TYPE定义了中断嵌套时中断优先级传递参量类型。QK_INT_LOCK(key_)定义了关中断的机制,QK_INT_UNLOCK(key_)定义了开中断的机制。在TMS320LF因为在TMS320LF2407的C编译器中没有直接对ST0、ST1寄存器进行操作的方法[4,5],此处使用嵌入汇编实现中断使能和中断禁止功能[6]。还有,在TMS320LF2407中具有中断优先级管理器,因此中断传递参数类别QK_INT_KEY_TYPE在本移植中不用定义。

QP中中断服务程序相当于最高优先级的任务,因此中断的进入动作QK_ISR_ENTRY()和退出动作QK_ISR_EXIT()需要特殊规定:QK_ISR_ENTRY(pin,ISR_PRIO):首先是,将当前QK优先级保存到变量pin上;然后将当前QK的优先级ISR_PRIO改变为最高优先级别;最后使能中断。QK_ISR_EXIT(pin)中断服务程序退出动作的过程是:关中断,清中断寄存器结束中断标记,从变量pin中恢复以前的优先级,调用QK的任务切换函数进行任务调度。

需要注意,TMS320LF2407中断有2种类型:一种由事件管理模块管理,不需要使用程序清中断标志位,如定时器,计数器,PWM等设备;另一种需要任务清中断标记,如串行外设接口(SPI)、串行通信接口(SCI)、CAN总线等。所以在中断退出时需要分别处理,一般在BSP中进行。

2.4 QS的接口移植

QS完成了软件系统运行信息的收集和输出功能。QS移植需要修改qs_port.h文件。其中定义了系统信息缓存区的深度,定义了在空闲时系统信息的输出方式等。

3 基于QP的航天相机控制器控制软件的实例

通过上节所述的构建过程QP平台被移植到了TMS320LF2407上,下面通过某航天相机控制器的控制软件的设计实例说明基于QP的软件架构设计[7]过程和实际运行结果。

3.1 基于QP的航天相机控制器的软件设计

基于QP平台的软件设计过程完全采用UML的图形可视化方法。使用用例图分析软件任务、需求。使用类图描述软件架构。使用活动图或顺序图描述软件结构中的对象间的消息交换细节。使用顺序图与状态图描述软件系统对象间的行为转换[8]。如图2中描述了航天相机控制器软件总体架构的状态转换图[9]。

其中分为4个状态,正常工作时系统在程控模式和正常模式间转换,触发信号为程控结束和E5.4信号。在正常模式内部又有工况参数轮询和摄像2种模式,通过相应的触发信号系统在两种状态间转换。另外E5.1.1到E5.1.7信号为内部转换触发信号。

3.2 软件源程序的生成

在QP中有关状态机的所有的要素,如状态、层次状态、状态转换、输入事件触发和输出事件触发均可以对应为固定的源代码,在将活动对象转化为源代码时几乎无需编程人员的参与。例如,对于状态机中的状态,QP中使用带有事件参数指针的函数来表示,其返回值指向另一个QP状态。对于信号的传递采用指针消息队列来表示[10]。

3.3 控制器软件的测试结果

由于使用了QS动态调试手段,所以可以在最为接近全速运行的状态下收集软件运行信息。如图3所示控制器采集模拟量工况参数场景的实测各个触发事件发生的时间信息,时间刻度为1μs。

如图3中所示模拟量遥测任务在t1时刻执行,采集系统内的模拟量参数。采集完成后在t2时刻向系统“发布”数据信号量。在t4时刻“订阅”了数据信号的数据合成任务得以执行。在数据合成任务以某种方式对数据打包编码后,在t5时刻向系统“发布”打包后的数据消息。最后通讯任务在t6时刻,将打包数据通过数据链路输出。对于模拟遥测任务,t1为任务执行的起始时刻,t3为任务结束时刻,任务执行时间可由下面表达式(1)来描述。

将图3中的时间代入式(1),可得到遥测任务的执行时间。

根据上面的测量方法可以统计一个软件运行周期内所有任务的执行时间,下表是本相机控制器软件在2 s的运行周期内,常规工况下,所有任务执行时间的统计结果。

通过上表可见,QP平台完成了软件中各个任务的管理工作,但是QP平台对于系统资源的占用时间极少。另外采用速率单调调度[1](RMS)算法可以看到本应用软件是完全可调度系统。通过上面讲述的工作后,证明整个系统已经能够正常运行,移植成功。

4 结论

综上,QP下的程序设计完全是基于可视化的UML状态图方式,因此提高了程序设计的效率,缩短了设计周期,并且减少了不确定的、无法预测的状态从而加强了软件的安全性;QP的实现原理有别于传统的RTOS,因此QP具有紧凑的代码结构,代码量小,QP的代码量非常少,即使是在所有的功能都被使能的情况下也只有4 K左右[1],更适合于深度的嵌入式系统。

因此,在完成了QP平台在TMS320LF2407上的构建的同时也证明了基于实时UML状态机的应用软件是完全可以在中小型CPU上运行的。

摘要:为了能够同时在16位或8位中小型CPU上使用实时操作系统和基于UML的可视化图形程序设计方法进行应用程序设计,在此详细讨论了将一种新式嵌入式实时UML框架程序设计平台移植到TMS320LF2407上全部过程,通过状态机部件、基础框架、任务管理内核和跟踪调试器的移植证明了这种平台在中小型CPU上运行的可行性、便捷性和高可靠性等优点。最后,通过航天相机控制器应用程序设计实例中各个任务线程的执行时间测量结果及可调度结果进一步验证了该平台的实用性。

关键词:RTOS,框架式程序设计,TMS320LF2407,平台移植

参考文献

[1][美]DOUGLASS B P.嵌入式与实时系统开发:使用UML、对象技术、框架与模式[M].柳翔,译.北京:机械工业出版社,2005.

[2]Quantum.Platform programmer’s manual[EB/OL].[2006 1120].http://www.quantum leaps.com.

[3][美]Miro Samek.嵌入式系统的微模块程序设计:实用状态图C/C++实现[M].敬万均,陈丽蓉,译.北京:北京航空航天大学出版社,2004.

[4]刘和平,王为江.TMS320LF2407 DSP C语言开发应用[M].北京:北京航空航天大学出版社,2003.

[5]Texas Instuments.TMS320C2x/C2xx/C5x optimizing c compiler user's guide[R].US:Texas Instuments,1999.

[6]Texas Instuments.TMS320F/C240 DSP controllers peripheral li brary[R].US:Texas Instuments,2002.

[7]柳翔.嵌入式与实时系统开发:使用UML、对象技术、框架与模式[M].北京:机械工业出版社,2005.

[8]RUMBAUGH James.The unified modeling language reference manual[M].New York:Addison Wesley Professional,2004.

[9]刘辉,李云飞.嵌入式航天CCD相机控制器研制模板[J].现代电子技术,2011,34(11):63-69.

[10]刘辉.嵌入式空间遥感相机控制器设计方法与实现[D].长春:中国科学院长春光学精密机械与物理研究所,2010.

上一篇:大数据与图书馆发展下一篇:初中生数学兴趣培养