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 结束语
实现了单屏幕多窗口的任意位置显示。使得屏幕显示变得更加丰富灵活, 也使得很多以往只能使用同步控制器或者多个异步控制器的场合可用单块异步控制器来替代, 从而降低了系统的成本。