Sysol2 编程规范Word文档下载推荐.docx
《Sysol2 编程规范Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Sysol2 编程规范Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
*Module:
JAVA
*Date:
2003-6-18
*Version:
1.0
*----------------------------------------------------------------------------*
*DESCRIPTION
*
*FUNCTIONSDEFINEDINTHISFILE
*Name|Object
*EVOLUTION
*Date|Author|Description
*2003-6-18|liuys|Creation
***************************************************************************)F*/
#ifndefJAVA_HIV
#defineJAVA_HIV
#ifdefJA1_C
/*声明变量*/
#else
/*扩展声明*/
#endif
3)新增.c文件。
新增的文件必须包含类似如下信息:
#ifndefJA1MESHDL_C
#defineJA1MESHDL_C
#defineMODULE_NUMBERMODULE_JAVA
#defineFILE_NUMBER1
#definePROCESS_NUMBERPROCESS_JAVA
#include“java.h”
//
例如现在要增加一个ja1_MesHdl.c文件
ja1_MesHdl.c
Java
java
*ja1_00DevDisplayMetrics|Pfunction
*ja1_01DevITextToLower
*----------------------------------------------------------------------------*
*Date|Author|Arnb|Description
*2003-6-18|liuys|create
/*-----------------------------------------------------------------------------*/
/*P(***************************************************************************
*Procedurename:
ja1_00DevDisplayMetrics
*Object:
Returninformationaboutthedevicedisplaysizeinpixels
*Inputparameters:
*-------------------
*None
*or
*ParameterName:
ParameterDescription
*Outputparameters:
*Usedvariables:
*VariableName:
VariableDescription
*Usedprocedures:
*-------------------wui4_1GetDisplayMetrics
*ProcedureName:
ProcedureDescription
*
*Returninformationaboutthedevicedisplaysizeinpixels
***************************************************************************)P*/
voidja1_00DevDisplayMetrics(SINT*width,SINT*height)
{
#undefPROCEDURE_NUMBER
#definePROCEDURE_NUMBER0
/*函数的实际内容*/
}
4)文件的存放位置。
头文件要保存在相应模块目录下的incl文件夹下..\module\incl;
源文件要保存在srce文件夹下..\module\srce
二、函数
1)函数的的定义要放到*.C文件中,并在相应的头文件中进行extern扩展声明。
如果此函数只在本模块内部使用,就将extern扩展声明放到*.hip中,如果其他模块也需要调用此函数,则必须将extern扩展声明放到*.hep中。
2)函数的命名。
函数的命名要体现如下几个方面,1所属模块;
2所在文件;
3函数序号;
4函数功能描述。
例如:
ja1_00DevDisplayMetrics函数,我们可以从名称上知道这个函数是java模块的在ja1文件中的第一个函数,功能是得到要显示内容的尺寸。
3)在函数定义的实体中,要包含
#undefPROCEDURE_NUMBER
#definePROCEDURE_NUMBER(NO)
4)函数定义的上方要有详细的注释。
三结构体(struct)
1)结构体的定义必须在相应模块的.h?
t文件中。
2)结构体的命名。
结构体的名称分为三部分,第一部分是字母t,用来标识这是结构体;
第二部分是模块名或模块名缩写,用来表示这个结构体是在哪一个模块中定义的;
第三部分用来表示结构体的功能与用途。
三部分之间用下划线(_)分隔,例如:
typedefstruct
u16m_utab_ptr;
u16m_uline2tab;
u16m_uselect;
u16m_ucurrIndex;
}t_lk_ScrollTable;
3)定义一个结构体的时候,必须在结构体的上方给出详细的注释。
注释要包括结构体的名称、用途、结构体内变量的意义与用法等信息。
4)结构体中的变量以m_开始,其余部分按照《命名规则》指定的方式编写。
5)地址对齐问题,要注意结构体中各个成员变量的地址对齐问题。
其中,类型为2Bytes的变量例如:
u16应该从偶地址开始,也就是变量的起始地址应该可以被2整除,最后一位(bit)应该是0;
类型为4Bytes的变量例如:
u32应该从可以被4分的地址开始,也就是地址的对后两位应该是00。
如下所示:
typedefstruct_t_wap_NetInfor
u8m_u8NetID;
u16m_u16NetLocation;
u8m_u8OperationType;
}t_wap_NetInfor;
是错误的定义方式,应该写为:
}t_wap_NetInfor;
四变量
变量从使用范围的角度,可以分为全局变量和局部变量。
所以在sysol2/sysol3平台上,变量的定义就分为全局变量和局部变量两种形式。
1)全局变量的定义(可以跨模块使用)。
可以跨模块使用的全局变量的定义和结构体的名称方式类似,也是分为三部分。
第一部分是g*[p,t,v,a,s],例如:
gp_表示是一个全局的指针变量,gv_表示是一个全局的变量,gt_表示是一个全局的结构体变量,ga_表示是一个全局数组,gpa_表示是一个全局的指针数组,gs_表示一个全局静态变量。
第二部分是模块的名称和模块的缩写,例如:
lk表示look模块,ja表示java模块等。
第三部分是变量名称的主题部分,请参考文档《标识符命名》。
gpa_lk_szMenuNameList;
/*表示一个全局的以’\0’为结尾字符串指针数组,属于look模块*/
2)模块内全局变量的定义。
这种全局变量的定义参见“全局变量的定义(可以跨模块使用)”,不过这种变量的定义不需要在前面加g。
pt_lk_MenuInfor;
/*表示一个全局结构体变量,但是这个变量的使用范围是look模块,其他模块不可以直接使用,所以其定义位置应该是在look.hiv中。
*/
3)局部变量的定义。
局部变量的定义要按照《标识符命名》文档的要求,变量中间不允许有下划线(_),特殊情况除外。
所谓的特殊情况就是局部的静态变量,我们规定局部的静态变量以s_为开始。
4)变量的类型必须使用u8,s8,u16,s16,u32,s32,u64,s64,BOOL。
下表是一些变量的定义解释:
名称
类型
全局/局部
所属模块
解释
gp_lk_u8MuneList
u8指针
全局
Look
gv_wui_bIsJad
Boolen类型
Wui
一个全局布尔型变量
gt_ja_ConnInfor
某种结构类型
Java
一个全局结构变量
ga_edp_sMoNa
字符串数组
Edp
一个全局的字符串数组
gpp_ip_u8Content
指向u8指针的指针
Ipstack
一个全局指向u8指针的指针
pu8AppName
类型为u8的指针
局部
bHasSend
布尔变量
s_s32AccessCounter
整形静态变量
五模块间的函数调用.
模块间的函数调用相对同一模块中的调用比较复杂。
所以我们可以分为三种情况来对此进行分析并给出模块间函数调用的规范。
因为sysol2/sysol3系统本身是多任务抢占式处理方式,所以不同的任务之间是按照一定的关系并行处理的,所以不同的模块可能是处在同一个任务下,同一个进程下或反之,所以这样虽然在使用起来具有很大的灵活性,但是也增加了防止出错的难度。
根据系统本身的这种特点,我们把模块间的函数调用分为三种情况,分别是:
1.个模块在逻辑上或功能上处于同一任务,同一进程下。
针对这种情况,函数的调用相对比较简单,但是在函数的设计时就要考虑函
数本身对其他模块的可见性和透明性。
透明性的考虑,只要在编写函数的时候,按照《函数过程》文档的规范来编写就可以实现函数的透明性。
可见性的考虑,应该考虑在函数的定义中变量类型和常量(宏定义、枚举变量等)的使用和定义的文件。
简单的说,如果函数中使用的变量是通用的,那么只要在.hep文件中左扩展声明就可以了。
例如有此函数定义:
voidlk7_100DisplaySms(u8*sStr),那么它的扩展定义就可以在.hep文件中定义,externvoidlk7_100DisplaySms(u8*sStr)
而不需要考虑更多的因素,又如:
voidlk7_101DisplaySmsExt(t_lk_SmsSpecDestSmsDet),因为在这个定义中,包含t_lk_SmsSpecDes的类型,而t_lk_SmsSpecDes类型是在本模块中定义的,所以,在创建函数的时候,就应该考虑如果此函数允许或者必须在其他模块中被调用,则要把t_lk_SmsSpecDes结构的定义放在.het中,并要考虑访问此函数的权限,也就是,此函数对那些模块是可见的,对那些模块是禁止的。
如果在此函数中有消息的发送,情况就要复杂一些,如果消息是单方向的,比如说某些IND消息,不需要额外的处理,但是对大多数消息处理起来就比较麻烦。
所以在定义函数的时候不但要考虑函数的一些基本规范约束,还要考虑与系统结合起来。
1,两个模块在逻辑上处于不同任务,不同进程下。
在这种情况下,我们可以有两种方式处理,一种就是直接调用,类似于上
面所述;
另一种就是通过消息来处理。
我们下面就这两种不同的方式分别的分析。
首先针对直接调用。
直接调用这种方式比较简单,在函数的定义上按照上面的叙述就可以,而且在使用上也比较简单,但是也存在一些大的问题。
因为对此函数的调用者不在同一个任务和进程下面,那么就存在着在某一时刻,两个不同的进程同时对此函数进行调用的可能,问题就产生了并可导致整个系统的崩溃。
所以在创建和使用用于这种方式的函数时,就要考虑对函数的保护措施,比如说用信号量或临界区等方法,使用这些方法时还要考虑系统本身的构架和限制,如果考虑不周全同样会产生严重的问题,比如说死锁现象。
所以综合利弊和我们系统本身的特点,不提倡使用位于不同进程内的函数的直接调用。
如果必须这样,也要慎重考虑。
针对消息的处理方式。
优点:
1,与系统本身架构相统一,运行稳定,结构清晰;
2,可以在很大程度上避免同步实时处理的冲突问题;
3,防止与系统本身消息机制处理冲突而导致系统崩溃;
4,可以节省系统资源;
5,可以有效的进行多任务处理和任务间的实时切换;
6,可以有效的进行多任务多功能并行实现。
但是在实际的编码处理过程种,也存在一些弊端。
比如:
代码编写复杂,同步函数设计困难,简单的同步变得复杂。
不过考虑系统的稳定性和健壮性,在设计不同进程可同时调用的函数,尽可能的考虑用消息实现,虽然在代码的编写和设计方面存在困难,但对于整个系统安全、稳定、健壮、清晰有巨大的益处。
3,两个模块处在同一个任务,不同进程下。
这种情况的处理基本和两个模块处在不同任务不同进程下的情况差不多,我们创建和使用时尽可能的用消息机制来实现。
但是这种情况也有一些特殊的地方,就是无法用系统的消息事件机制使函数进行同步化,如果函数需要进行消息处理时。
据上述三种情况的分析,我们对函数的创建规定如下:
不允许函数被不同进程直接调用,如果必须要这么做,则要认真的考虑此种设计对系统的影响,并要经过项目组长的审核。
六内存的使用
由于系统资源的限制,我们可供使用的内存是有限的,在实际的使用如果不加以控制就会出现内存不足的现象使整个系统无法按照正常的方式工作。
所以需要制定一套适合我们系统的内存使用规范。
使用统一的规范不但可以在数量上控制内存使用的情况,还可以在质量上控制内存的使用。
所谓的质量可以分两方面来理解,第一就是可以提高内存的使用效率,第二就是可以控制内存的使用正确与否可以避免一些潜在的危险比如说,内存泄漏等。
一般内存的错误肯定会导致系统崩溃
但是内存的使用存在着特殊性,具体的编码人员应该根据需要对内存进行分配和使用。
所以内存的使用原则如下:
1,要及时删除不使用的变量。
2,在定义局部变量时,如果超过100字节,尽可能的使用动态分配。
3,原则上不允许跨进程使用全局变量。
4,尽量避免对全局指针进行动态分配内存。
5,禁止使用未经初始化的变量。
6,必须事先性的规划和监视memorypool的使用情况。
7,要及时的释放不使用的动态内存。
8,要防止动态内存的重复申请。
9,函数的参数超过4个,原则上考虑使用结构体按类型将参数封装。
10,局部变量占用空间过大时,应该使用动态分配。
不同的项目组应该根据实际情况根据以上原则严格的规划和核查内存的使用
情况。