资源描述
二、PITE3960软件(架构)综述
为实现多任务,系统使用了消息驱动方式,采用不可剥夺多任务机制(任务不能强行中止)。
主函数流程:
图2-1 主函数流程(含消息循环)
消息队列优先级:
本架构任务切换是通过消息队列来实现的(如图2-3),保证了先触发先响应。系统将会维护多个消息队列,所有产生的消息都会被插入相应队列中。系统会依据队列优先级在队列中取出每一条消息,根据不同消息队列,而产生不同的消息,并将该消息发送给当前任务的消息处理函数。
队列优先级如下:
图2-2 消息队列优先级
系统中使用的消息队列:
Queue g_sutIntQueue; 中断消息队列(主要用于中断的切换)
Queue g_sutSysQueue; 系统消息队列(主要用于各任务的切换)
Queue g_sutRecv0Queue; UART0接收数据队列
Queue g_sutTran0Queue; UART0发送数据队列
Queue g_sutRecv1Queue; UART1接收数据队列
Queue g_sutRecordQueue; 放电电池记录指针索引数据队列
系统任务变量:
unsigned char g_ucplay_back; 数据回放标志 0x0f:yes 0x00: no
任务的基本架构:
任务由消息处理分支构成,根据分支语句执行不同的操作。
每个任务都有自己的消息处理分支,任务的消息处理函数执行完成后,才能返回主流程,响应其它消息,所以对于耗时较多的任务应尽量精简,或拆分成多个任务。同时这种运行机制存在较大的局限性,目前适用于较小的应用平台。较大的应用中消息检查机制应做相应修改,避免消息检测循环消耗太多的时间和资源。
任务中必须要包含的是PITE_DefTaskProc()函数,用于响应输入操作。其余消息视具体任务添加。
图2-3 任务消息循环及系统消息结构
任务的消息结构:
message :是从当前消息队列中获得的消息值,消息值如图4所示。
para、para1 、para1 :是本消息附带的参数。
系统中的消息:
图2-4系统中的消息
系统软件模块组织结构:
图2-5 软件模块框图
系统中定义的任务:
PITE_RET MenuMain(PPITE_MESSAGE Msg); 主菜单
PITE_RET MenuService(PPITE_MESSAGE Msg); 系统管理菜单
PITE_RET MenuDataMenage(PPITE_MESSAGE Msg); 数据管理菜单
PITE_RET MenuSysSet(PITE_MESSAGE *Msg); 系统设置菜单
PITE_RET MenuRevise(PITE_MESSAGE *Msg); 计量校正菜单
PITE_RET MenuRadioSetup(PITE_MESSAGE *Msg); 放电参数设置菜单
PITE_RET TaskCalibrationZero(PITE_MESSAGE *Msg) 零点校正
PITE_RET TaskCalibrationCoef(PITE_MESSAGE *Msg) 增益校正
PITE_RET TaskCalibrationSensor(PITE_MESSAGE *Msg); 传感器选择
PITE_RET TaskCaliLoadFactoryPara(PITE_MESSAGE *Msg); 载入缺省值(厂值)
PITE_RET TaskCaliSetFactoryPara(PITE_MESSAGE *Msg); 设置缺省值(厂值)
PITE_RET TaskCaliSetDefault(PITE_MESSAGE *Msg); 设置缺省值
PITE_RET TaskCalibrationLogin(PITE_MESSAGE *Msg); 触摸屏校准
PITE_RET TaskCaliSetupRadioBoxId(PITE_MESSAGE *Msg); 分机盒设置ID编号
PITE_RET TaskCaliSetupRadioBoxCoef(PITE_MESSAGE *Msg); 分机盒校正
PITE_RET TaskDateSet(PITE_MESSAGE *Msg); 设置日期时间
PITE_RET TaskVersionShow(PITE_MESSAGE *Msg); 软件版本声明
PITE_RET TaskBackLight(PITE_MESSAGE *Msg); 设置背光
PITE_RET TaskUpdateFont(PITE_MESSAGE *Msg); 字库更新
PITE_RET TaskGetPassword(PITE_MESSAGE *Msg); 设置密码任务
PITE_RET TaskFileList(PITE_MESSAGE *Msg); 数据管理任务
PITE_RET TaskFlashFrame(PITE_MESSAGE *Msg); 数据清除任务
PITE_RET TaskDisplayScreen(PITE_MESSAGE *Msg); 屏幕数据回放任务
PITE_RET TaskGeneralTest(PITE_MESSAGE *Msg); 综合测试任务
PITE_RET TaskVoltagePrecise(PITE_MESSAGE *Msg) 稳压测试任务
PITE_RET TaskCurrentPrecise(PITE_MESSAGE *Msg) 稳流测试任务
PITE_RET TaskRipple(PITE_MESSAGE *Msg) 纹波测试任务
PITE_RET TaskBatteryDischarge(PITE_MESSAGE *Msg) 电池放电任务
扫描触摸屏:
由定时器T0产生一个定时器消息(INT_TIMER),用于扫描触摸屏。如有有效触摸屏按下将直接执行区域响应函数,具体说明见附录2、触摸屏坐标说明。
默认消息处理函数:
图2-6 默认消息处理
默认的消息处理函数将负责处理那些任务中不处理消息。
PITE_RET PITE_DefTaskProc(PITE_MESSAGE *Msg) 默认处理函数,包含时钟扫描、
按键处理和串口数据收发
void RtcShow (void); 默认RTC处理
void Scom485QueueDataCheck(void); 485通信串口接收中断处理
void RadioQueueDataCheck (void); 无线通信串口接收中断处理
void BatteryDischargeSendData2PC (void); 串口发送数据处理
void FAT_FileMsg(void); FAT消息处理
void USB_Msg (void); USB消息处理
综上所述,本系统是一个伪多任务操作系统,编程者了解后可以自定义消息和任务流程,实现特定的功能,但要注意该架构的使用中,消息处理函数一定要清晰。
关于任务的添加见附录5、任务添加说明。
六、附录
1、系统资源分配说明
图6-1 片上FLASH空间分配 图6-2 片上RAM空间分配 图6-3 片外RAM空间分配
图6-4片外FLASH空间分配 图6-5片外EEPROM空间分配
LPC2214内部共有256K FLASHROM和16K RAM,外部扩展512KRAM、16M FLASHROM和256KEEPROM。
程序空间的分配如图6-1所示,前面8K(0—8192)存储的是用于更新主程序(8192之后248K程序存储空间)的代码,8K之后的248K程序存储空间存储的是应用程序代码。
数据空间的分配如图6-2、图6-3、图6-4、图6-5所示。片上16K RAM主要用于堆栈空间。片外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轴坐标变换程序代码为:
TOUCH32 AD2X(TOUCH32 adx) {
TOUCH32 r;
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-7 Flash文件系统
5、任务添加说明
图6-8 任务的基本结构
1、任务结构
从主程序消息循环及消息切换中可知,本系统中包含消息队列,一个任务基本的框架包含有分支语句判断消息类型,并调用相应消息处理函数,不同的消息由任务的不同部分进行处理。
① 处理新建任务消息处理函数(例如VoltagePreciseInitiate ());
② 按键消息处理函数;
③ DSP中断消息处理函数(例如VoltagePreciseDspIntResponse ());
④ RTC中断消息处理函数(例如VoltagePreciseRtcResponse ());
⑤ 默认消息处理函数 (例如PITE_DefTaskProc ());
当然可根据实际需要增加或减少,例如PITE_RET TaskDisplayScreen(PITE_MESSAGE *Msg)中就没有按键消息处理函数。需要注意的是按键消息处理函数,仅在menu.c中有保留(MenuResponse ()),其余的在本架构中被触摸屏区域处理函数替换。
任务对外只提供一个接口函数。
2、任务添加
⑴、在Msg.c中定义任务的显示菜单(如果需要显示为菜单)。
参考菜单结构的命名(例如l_sutMenuSysMain和l_apucMenuMain)
⑵、在具体任务C文件中定义任务的接口函数。
例如
PITE_RET TaskVoltagePrecise(PITE_MESSAGE *Msg)
{
……………..
}
⑶、在具体任务H文件中声明任务的接口函数。
例如PITE_RET TaskVoltagePrecise(PITE_MESSAGE *Msg);
⑷、在需要切换任务的地方调用函数PITE_StartNewTask()来切换任务。
例如 PITE_StartNewTask(TaskVoltagePrecise);
6、ADS编译设置说明
在分散加载文件mem_c.scf中需设置加载域和运行域地址为 0x0002000,如果不是使用USB更新而是使用ISP更新,则需设置为0x0000000。
在拷贝的工程目录中找到*.mcp工程文件并打开,之后先在ADS工程生成目标选择 DebugInChipFlash,接着点击工程设置图表按钮参考下文进行工程的地址设置、输出文件设置、编译选项等设置,之后再点击同步修改日期图表按钮检查文件更新情况(是否需要编译),检查工程中每个文件的修改日期,若发现有更新,则在Touch栏标记,最后点击编译连接图表按钮完成编译连接。
ADS编译环境编译器设置中, Target Settings设置Linker下拉列表中选择ARM Linker,Post-Linker下拉列表中选择ARM FromELF。
图 6-9
ADS编译环境编译器设置中,ARM Linker 设置Output选项卡中Linktype单选框选择Scatterd,Scatter编辑框中输入mem_c.scf文件所在目录。
图6-10
ADS编译环境编译器设置中,ARM Linker 设置Option选项卡中Image entry point 参数需设置为 0x0002000
图6-11
DS编译环境编译器设置中,ARM fromELF 设置,Output formatz下拉列表中选择Intel 32 bit Hex,Output file name 中设置输出文件名为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个汉字。
if 0xA1 <= 高字节 <= 0xF7: 则是 GB2312 字符
在GBK编码(不是国家标准,而只是规范)兼容GB2312字符集及其编码,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。第一字节的值在 0x81~0xFE 之间,第二字节的值在 0x40~0xFE,除去0x7F一线。
if 0x81 <= 高字节 <= 0xFE and (0x40 <= 低字节 <= 0x7E or 0x7E <= 低字节 <= 0xFE):则是 GBK字符。
在Windows95/98/NT/2000 (简体中)中使用的都是GBK字符集。
字符显示是按从左到右,从上到下一点一点的在显示缓冲区显示,主要代码说明如下:
字符显示流程如下图所示:
展开阅读全文