软件架构.docx
《软件架构.docx》由会员分享,可在线阅读,更多相关《软件架构.docx(22页珍藏版)》请在冰豆网上搜索。
软件架构
二、PITE3960软件(架构)综述
为实现多任务,系统使用了消息驱动方式,采用不可剥夺多任务机制(任务不能强行中止)。
主函数流程:
图2-1主函数流程(含消息循环)
消息队列优先级:
本架构任务切换是通过消息队列来实现的(如图2-3),保证了先触发先响应。
系统将会维护多个消息队列,所有产生的消息都会被插入相应队列中。
系统会依据队列优先级在队列中取出每一条消息,根据不同消息队列,而产生不同的消息,并将该消息发送给当前任务的消息处理函数。
队列优先级如下:
图2-2消息队列优先级
系统中使用的消息队列:
Queueg_sutIntQueue;中断消息队列(主要用于中断的切换)
Queueg_sutSysQueue;系统消息队列(主要用于各任务的切换)
Queueg_sutRecv0Queue;UART0接收数据队列
Queueg_sutTran0Queue;UART0发送数据队列
Queueg_sutRecv1Queue;UART1接收数据队列
Queueg_sutRecordQueue;放电电池记录指针索引数据队列
系统任务变量:
unsignedcharg_ucplay_back;数据回放标志0x0f:
yes0x00:
no
任务的基本架构:
任务由消息处理分支构成,根据分支语句执行不同的操作。
每个任务都有自己的消息处理分支,任务的消息处理函数执行完成后,才能返回主流程,响应其它消息,所以对于耗时较多的任务应尽量精简,或拆分成多个任务。
同时这种运行机制存在较大的局限性,目前适用于较小的应用平台。
较大的应用中消息检查机制应做相应修改,避免消息检测循环消耗太多的时间和资源。
任务中必须要包含的是PITE_DefTaskProc()函数,用于响应输入操作。
其余消息视具体任务添加。
图2-3任务消息循环及系统消息结构
任务的消息结构:
message:
是从当前消息队列中获得的消息值,消息值如图4所示。
para、para1、para1:
是本消息附带的参数。
系统中的消息:
图2-4系统中的消息
系统软件模块组织结构:
图2-5软件模块框图
系统中定义的任务:
PITE_RETMenuMain(PPITE_MESSAGEMsg);主菜单
PITE_RETMenuService(PPITE_MESSAGEMsg);系统管理菜单
PITE_RETMenuDataMenage(PPITE_MESSAGEMsg);数据管理菜单
PITE_RETMenuSysSet(PITE_MESSAGE*Msg);系统设置菜单
PITE_RETMenuRevise(PITE_MESSAGE*Msg);计量校正菜单
PITE_RETMenuRadioSetup(PITE_MESSAGE*Msg);放电参数设置菜单
PITE_RETTaskCalibrationZero(PITE_MESSAGE*Msg)零点校正
PITE_RETTaskCalibrationCoef(PITE_MESSAGE*Msg)增益校正
PITE_RETTaskCalibrationSensor(PITE_MESSAGE*Msg);传感器选择
PITE_RETTaskCaliLoadFactoryPara(PITE_MESSAGE*Msg);载入缺省值(厂值)
PITE_RETTaskCaliSetFactoryPara(PITE_MESSAGE*Msg);设置缺省值(厂值)
PITE_RETTaskCaliSetDefault(PITE_MESSAGE*Msg);设置缺省值
PITE_RETTaskCalibrationLogin(PITE_MESSAGE*Msg);触摸屏校准
PITE_RETTaskCaliSetupRadioBoxId(PITE_MESSAGE*Msg);分机盒设置ID编号
PITE_RETTaskCaliSetupRadioBoxCoef(PITE_MESSAGE*Msg);分机盒校正
PITE_RETTaskDateSet(PITE_MESSAGE*Msg);设置日期时间
PITE_RETTaskVersionShow(PITE_MESSAGE*Msg);软件版本声明
PITE_RETTaskBackLight(PITE_MESSAGE*Msg);设置背光
PITE_RETTaskUpdateFont(PITE_MESSAGE*Msg);字库更新
PITE_RETTaskGetPassword(PITE_MESSAGE*Msg);设置密码任务
PITE_RETTaskFileList(PITE_MESSAGE*Msg);数据管理任务
PITE_RETTaskFlashFrame(PITE_MESSAGE*Msg);数据清除任务
PITE_RETTaskDisplayScreen(PITE_MESSAGE*Msg);屏幕数据回放任务
PITE_RETTaskGeneralTest(PITE_MESSAGE*Msg);综合测试任务
PITE_RETTaskVoltagePrecise(PITE_MESSAGE*Msg)稳压测试任务
PITE_RETTaskCurrentPrecise(PITE_MESSAGE*Msg)稳流测试任务
PITE_RETTaskRipple(PITE_MESSAGE*Msg)纹波测试任务
PITE_RETTaskBatteryDischarge(PITE_MESSAGE*Msg)电池放电任务
扫描触摸屏:
由定时器T0产生一个定时器消息(INT_TIMER),用于扫描触摸屏。
如有有效触摸屏按下将直接执行区域响应函数,具体说明见附录2、触摸屏坐标说明。
默认消息处理函数:
图2-6默认消息处理
默认的消息处理函数将负责处理那些任务中不处理消息。
PITE_RETPITE_DefTaskProc(PITE_MESSAGE*Msg)默认处理函数,包含时钟扫描、
按键处理和串口数据收发
voidRtcShow(void);默认RTC处理
voidScom485QueueDataCheck(void);485通信串口接收中断处理
voidRadioQueueDataCheck(void);无线通信串口接收中断处理
voidBatteryDischargeSendData2PC(void);串口发送数据处理
voidFAT_FileMsg(void);FAT消息处理
voidUSB_Msg(void);USB消息处理
综上所述,本系统是一个伪多任务操作系统,编程者了解后可以自定义消息和任务流程,实现特定的功能,但要注意该架构的使用中,消息处理函数一定要清晰。
关于任务的添加见附录5、任务添加说明。
六、附录
1、系统资源分配说明
图6-1片上FLASH空间分配图6-2片上RAM空间分配图6-3片外RAM空间分配
图6-4片外FLASH空间分配图6-5片外EEPROM空间分配
LPC2214内部共有256KFLASHROM和16KRAM,外部扩展512KRAM、16MFLASHROM和256KEEPROM。
程序空间的分配如图6-1所示,前面8K(0—8192)存储的是用于更新主程序(8192之后248K程序存储空间)的代码,8K之后的248K程序存储空间存储的是应用程序代码。
数据空间的分配如图6-2、图6-3、图6-4、图6-5所示。
片上16KRAM主要用于堆栈空间。
片外512KRAM用于存储系统变量,数据队列,各种测量数据。
片外256K的EEPROMROM用于存储LCD对比度、管理员标志、触摸屏坐标基准值、BMP数字名、计量校正参数、电流传感器参数、监测设置参数和FDT首地址。
2、触摸屏坐标说明
(1)、坐标的获取
由于LCD屏大小为320×240像素,故ADS7846采用12位A/D转换,可精确到X或Y方向上的1/4096。
触摸屏中每一点经过ADS7846的转换后都会获得一组(X和Y)A/D值(触摸屏坐标),该值经过坐标变换后可转变为LCD屏坐标,转换过程如下:
①:
计算A/D值在触摸屏坐标中的偏移值OFFSET;
②:
乘上LCD坐标系相对于触摸屏坐标系的转换比率系数K;
公式如下:
式中:
A/D:
实际采样A/D值;
LCD_MAX:
LCD屏坐标最大值(对于X轴为319,对于Y轴为239);
LCD_MIN:
LCD屏坐标最小值(对于X轴为0,对于Y轴为0);
TOUCH_MAX:
触摸屏坐标(A/D值)最大值;
TOUCH_MIN:
触摸屏坐标(A/D值)最小值;
X轴坐标变换程序代码为:
TOUCH32AD2X(TOUCH32adx){
TOUCH32r;
r=adx-g_sScreenMinMax[COORD_X].Min;
r*=TOUCH_XSIZE-1;
return(r/(g_sScreenMinMax[COORD_X].Max-g_sScreenMinMax[COORD_X].Min));}
(2)、坐标的响应
图6-6触摸屏坐标
参考上图,屏幕中有一区域AREA,(X1,Y1)是其左上角坐标,(X2,Y2)是右下角坐标。
在点击屏幕时,触点只要在(X1,Y1)和(X2,Y2)矩形区域内均认为是触摸该区域有效,就可进行进一步的操作。
程序中屏幕中每个显示有效的区域点都按照结构AREA的大小连续存储在屏幕区域(坐标)列表g_stScrList中,当有有效的坐标产生时,通过调用FindScrList()函数来判断该坐标是否在g_stScrList存储的有效区域内,再做具体操作。
3、文件管理部分说明
文件管理采用简单FAT文件系统。
文件系统由以下3部分组成:
1:
文件分配表区(FAT);
2:
文件目录表区(FDT);
3:
数据区。
(1):
文件分配表存放Flash存储器上所有区块的占用与空闲情况以及每个文件的存储连接结构。
本Flash文件系统中使用15位FAT,最大可管理2的15次方(32768)个存储单元。
(2)文件目录表紧跟在FAT表之后,存放F1ash文件系统中每一个文件的名字、长度、属性、生成的时间,大小以及该文件的存储链在文件分配表中的入口。
(3)数据区域用于存放数据。
本Flash文件系统中,数据块分配的单位是512字节。
注意:
单次写入数据最大为256KB。
图6-7Flash文件系统
5、任务添加说明
图6-8任务的基本结构
1、任务结构
从主程序消息循环及消息切换中可知,本系统中包含消息队列,一个任务基本的框架包含有分支语句判断消息类型,并调用相应消息处理函数,不同的消息由任务的不同部分进行处理。
1处理新建任务消息处理函数(例如VoltagePreciseInitiate());
2按键消息处理函数;
3DSP中断消息处理函数(例如VoltagePreciseDspIntResponse());
4RTC中断消息处理函数(例如VoltagePreciseRtcResponse());
5默认消息处理函数(例如PITE_DefTaskProc());
当然可根据实际需要增加或减少,例如PITE_RETTaskDisplayScreen(PITE_MESSAGE*Msg)中就没有按键消息处理函数。
需要注意的是按键消息处理函数,仅在menu.c中有保留(MenuResponse()),其余的在本架构中被触摸屏区域处理函数替换。
任务对外只提供一个接口函数。
2、任务添加
⑴、在Msg.c中定义任务的显示菜单(如果需要显示为菜单)。
参考菜单结构的命名(例如l_sutMenuSysMain和l_apucMenuMain)
⑵、在具体任务C文件中定义任务的接口函数。
例如
PITE_RETTaskVoltagePrecise(PITE_MESSAGE*Msg)
{
……………..
}
⑶、在具体任务H文件中声明任务的接口函数。
例如PITE_RETTaskVoltagePrecise(PITE_MESSAGE*Msg);
⑷、在需要切换任务的地方调用函数PITE_StartNewTask()来切换任务。
例如PITE_StartNewTask(TaskVoltagePrecise);
6、ADS编译设置说明
在分散加载文件mem_c.scf中需设置加载域和运行域地址为0x0002000,如果不是使用USB更新而是使用ISP更新,则需设置为0x0000000。
在拷贝的工程目录中找到*.mcp工程文件并打开,之后先在ADS工程生成目标选择
DebugInChipFlash,接着点击工程设置图表按钮
参考下文进行工程的地址设置、输出文件设置、编译选项等设置,之后再点击同步修改日期图表按钮
检查文件更新情况(是否需要编译),检查工程中每个文件的修改日期,若发现有更新,则在Touch栏标记
,最后点击编译连接图表按钮
完成编译连接。
ADS编译环境编译器设置中,TargetSettings设置Linker下拉列表中选择ARMLinker,Post-Linker下拉列表中选择ARMFromELF。
图6-9
ADS编译环境编译器设置中,ARMLinker设置Output选项卡中Linktype单选框选择Scatterd,Scatter编辑框中输入mem_c.scf文件所在目录。
图6-10
ADS编译环境编译器设置中,ARMLinker设置Option选项卡中Imageentrypoint参数需设置为0x0002000
图6-11
DS编译环境编译器设置中,ARMfromELF设置,Outputformatz下拉列表中选择Intel32bitHex,Outputfilename中设置输出文件名为3980B.HEX(内容自定,最好与应用程序相关)
图6-12
7、汉字显示说明
1、汉字取摸
以汉字中为例,使用宋体12,字体对应的点阵为:
宽x高=16x16。
生成字模时,横向取模,对点阵中有笔画的取1,无笔画(背景)的取0,每行可生成2个字节数据,16x16点阵可生成32字节数据。
图6-13中字点阵图图6-14中字数字化图6-15中字字模
2、汉字显示
在GB2312-80标准中每个汉字(图形符号)采用双字节表示,第一个字节的范围从1-87(区码),0xA1-0xF7(机内码),共87种,第二个字节的范围从1-94(位码),0xA1-0xFE(机内码),共94种,利用这两个字节共可定义出87*94=8178种汉字,实际共用6763个汉字。
if0xA1<=高字节<=0xF7:
则是GB2312字符
在GBK编码(不是国家标准,而只是规范)兼容GB2312字符集及其编码,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
第一字节的值在0x81~0xFE之间,第二字节的值在0x40~0xFE,除去0x7F一线。
if0x81<=高字节<=0xFEand(0x40<=低字节<=0x7Eor0x7E<=低字节<=0xFE):
则是GBK字符。
在Windows95/98/NT/2000(简体中)中使用的都是GBK字符集。
字符显示是按从左到右,从上到下一点一点的在显示缓冲区显示,主要代码说明如下:
字符显示流程如下图所示: