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 大屏幕单屏幕多个窗口恣意方位的显现, 而且可完结多窗口堆叠显现及“画中画”等显现作用。