1 引言:
以往的LED异步控制器只能把一个屏幕作为一个完整的区域来进行显示,或者简单的加上时间区域或游走字幕区域,这样对于用户来讲往往缺乏足够的灵活性,尤其在屏幕较大的时候。针对以上情况,本文提出了一款基于32位高性能ARM处理器和uc/OS-II的设计方案。它充分利用了uc/OS-II高效的多任务管理功能和ARM处理器强大的运算能力,实现了单屏幕多窗口的任意位置显示,使得显示内容变得更加丰富,显示方式变得更加灵活。
2 LED控制系统的工作原理:
典型的LED异步控制系统主要由PC应用软件、通信模块、数据处理模块、扫描控制模块、驱动模块和LED屏几部分组成,如图1所示。
首先,PC应用软件将文本或图片转化为具有特定格式的点阵信息。然后,通过通信模块将此点阵信息发送给数据处理模块。数据处理模块对这些点阵信息进行各种特技处理,最后通过扫描控制模块和驱动模块将画面在LED屏上进行正确显示。本文所指的LED异步控制器包括通信模块、数据处理模块和扫描控制模块三部分。
3 控制器软件部分的设计:
本控制器的硬件结构如图2所示。数据处理模块由MCU,一片SRAM和一片FLASH存储器组成。MCU选用PHILIPS的基于32位ARM内核的LPC2214处理器,它有着丰富的外围接口资源和强大的运算能力,是整个控制器的核心。SRAM作为MCU进行特技处理时的缓存使用。FLASH存储器用于存储点阵信息和一些必要的参数。
扫描控制模块由CPLD和显存组成。显存为一片SRAM,它用于保存当前显示的一帧点阵信息。CPLD通过地址总线和16位数据总线与MCU相连, 它把从MCU接收到的16位数据按指定地址写入显存,然后再按一定的寻址方式从显存中读出点阵信息进行扫描。MCU只能通过CPLD对显存进行以字(2byte)为单位的写操作。
通信模块包括以太网模块和串口通信模块,用于实现PC与控制器之间的RS232、RS485以及工业以太网通信。
4 控制器软件部分的设计:
为了实现单屏幕、多窗口任意位置的显示,软件部分我们基于uc/OS-II进行设计,这样可以充分利用操作系统高效的任务调度算法,将每个窗口的显示都交由单个任务来完成,从而极大地提高系统的运行速度和可靠性,并且使得程序的开发和扩展变得更加方便。
在进行具体的程序设计之前,首先要确定数据的组织方案。因为好的数据组织方案,对于程序编写来说往往可以达到事半功倍的效果。
4.1 显存的数据组织方案:
对于双色屏,一个像素点需要红、绿两位数据来描述。为了便于处理,我们将横向连续的8个像素点组成一个字(2byte)来进行存储,其中一个字节为红数据,一个字节为绿数据。数据存储顺序为从左到右,从上到下。如图3所示,假如屏幕宽度为160个像素点,显存起始地址为0x83000000,则屏幕第一行的前8个像素点映射到显存中地址为0x83000000和0x83000001的两个字节,第二行的前8个像素点映射到显存中地址为0x83000028和0x83000029的两个字节,依此类推。
4.2 点阵信息转化规则:
由于窗口大小可以任意设置,窗口的位置可以任意摆放。所以对于单个窗口而言,它在显存中的映射可能并非是字(2byte)对齐的。以图4为例,在一个大小为160(宽)×96(高)的屏幕上开设一个左上角坐标为(20,16),大小为86×47的窗口,则此窗口第一行的前4个像素点在显存中的映射为地址是0x83000282和0x83000283的两个字节的低4位,所以这个窗口在显存中的映射并不是字对齐的。由于MCU只能以字(2byte)为单位对显存进行操作,所以PC软件在对该窗口进行点阵信息转换时,如果直接对区域1(窗口的实际大小)进行转换存储,则在对该窗口进行特技处理时会存在大量的位运算,这样会大大降低运算效率,从而影响特技效果的显示,这样就很难满足用户对特技显示效果的要求。
为了解决上述问题,可以将区域1横向扩展成起点坐标为(16,16),大小为96×47的区域2。易知,区域2在显存中的映射是字对齐的。为了避免运算时的位操作,PC软件在对区域1进行点阵信息转换时,可按区域2来进行,只是需将区域1的扩展部分的数据全填为1。这样处理会牺牲掉一小部分FLASH存储器空间,但却可避免特技处理时大量的位运算,从而大大提高运算效率,因此这样做是值得的。
4.3 缓存数据的组织方案:
由于MCU只能对显存进行写操作,而在进行特技运算时,往往需要前一帧信息才能得到下一帧的信息。所以,首先,需要在缓存中划分出一块和显存大小相等,地址一一对应的区域screen用于保存整屏幕的前一帧信息。
又由于MCU对显存只能进行字操作,并且多个窗口之间可能会出现区域重叠,所以如果各窗口的特技运算都直接在screen区域上进行,则窗口重叠部分信息可能会发生混乱。因此如图5所示,也需要在缓存中为每个窗口划分出一块存储器空间(area 1, area 2, …, area n),用于保存本窗口显示的前一帧信息。这样在特技运算时,首先要在area区域中对各窗口数据进行运算得到各窗口的下一帧信息,然后将area区域中数据写入该窗口在screen区域中的相应地址以保存整屏幕最新一帧信息,最后把screen中相应数据写入显存从而完成显示。
4.4 软件设计:
基于上述方案,MCU程序的设计变得非常简洁。程序结构如图6所示,控制器上电后,首先进行系统初始化,然后从FLASH中读取屏参数,进行参数初始化。接着建立任务TaskControl,TaskControl拥有比各窗口显示任务都要高的优先级,它主要用于对各窗口显示任务进行实时管理。每隔一段时间TaskControl就要对reset标志进行一次查询,如果reset=1,它会删除原先建立的各窗口显示任务,然后从FLASH中读取新的窗口个数,依此建立新任务,将每个窗口的显示交由单个窗口显示任务来控制。
下面是任务TaskControl的程序演示:
void TaskControl(void *pdata){
uint8 taskNum;
pdata=pdata;
RESET:
reset=0; //reset标志清零
for(taskNum=3;taskNum<18;taskNum++){ //删除原先建立的窗口显示任务
OSTaskDel(taskNum); //窗口显示任务优先级从3开始
} //最多允许设置16个窗口
taskNum=flashReadWord(AREA_NUM_ADDR); //从FLASH中读取屏幕窗口个数
if(taskNum>0) //根据窗口数建立窗口显示任务
OSTaskCreate(task0,(void*)0,&task0Stk[TaskStkLength-1],3);
if(taskNum>1)
OSTaskCreate(task1,(void*)0,&task1Stk[TaskStkLength-1],4);
……
while(1){
if(reset) goto RESET; //reset标志为1,程序复位
OSTimeDlyHMSM(0,0,1,0);
}
}
窗口显示任务用于实现各窗口内容的显示。它根据各窗口显示方式的不同在其相应area区域中进行下一帧数据的运算,然后调用areaToScreen()和screenToCpld()进行显示。在完成一帧数据的显示后,调用一次 OSTimeDlyHMSM()使当前任务进入等待状态同时进行一次任务调度,将系统控制权交给处于就绪状态的窗口显示任务中优先级最高的那个,由此完成窗口显示任务之间的切换。我们也可以通过调整OSTimeDlyHMSM()的参数来改变各窗口相临两帧显示信息之间的时间间隔,从而可调整各窗口特技显示的效果,比如移动显示的移动速度。下面是其中一个窗口显示任务的程序演示:
void Task0(void *pdata){
pdata=pdata;
窗口参数初始化;
while(1){
uint16 i;
for(i=0;i<总帧数;i++){
下一帧数据的运算; //在area区域中进行
areaToScreen(); //将数据从area读出写入screen
screenToCpld(); //将screen中相应数据写入显存完成一帧数据的显示
OSTimeDlyHMSM(0,0,0,displaySpeed*20); //任务调度
}
}
}
5 结束语:
充分利用32位微处理器的高性能和实时操作系统高效的任务调度算法,实现了单屏幕多窗口的任意位置显示。使得屏幕显示变得更加丰富灵活,也使得很多以往只能使用同步控制器或者多个异步控制器的场合可用单块异步控制器来替代,从而降低了系统的成本。
本文作者创新点:实现了LED大屏幕单屏幕多个窗口任意位置的显示,并且可实现多窗口重叠显示及“画中画”等显示效果。
参考文献:
[1] 杨姣,郝国法,方康玲.基于cyclone EP1C6的LED大屏设计方案[J].微计算机信息,2006,4-2:59-62。
[2] 郝国法,杨姣.LED大屏幕控制电路设计方案研究[J].电视技术,2005,11:94-96。
[3] Jean. Labrosse著,邵贝贝等译.嵌入式操作系统uc/OS-II(第二版.北京航空航天大学出版社,2005年。