中断向量表是系统产生中断处理的索引表,系统会根据不同的中断类型引导它们进入不同的中断处理函数。ZEVIO1020双核处理器提供了多种不同类型的中断处理,主要分为两类:IRQ 中断和FIQ中断。FIQ中断是快速中断处理函数,执行速度快,优先级高,一般用于重要和对实时性要求较高的中断处理。IRQ中断是普通的中断处理函数,一般的中断处理都归属于这种类型的中断。在各种中断同时触发的情况下,中断程序会根据各种中断优先级的设定来进行比较,执行优先级最高的中断处理程序。对于 UCOS-II 的 操作系统 来说,需要一个系统时钟作为操作系统的时钟节拍,供操作系统调用时间函数使用。ZEVIO1020有4个Timer可供选择,在这里选用Timer1作为系统时钟,设置系统时钟频率为100Hz且为FIQ中断。中断处理程序的实现过程如图2所示。
图2中断处理流程图
5、软件层的设计与实现
5.1、系统任务层的组成和优先级的设计
系统任务层并行存在以下六个任务:总控任务、音频解码任务、视频解码任务、JPEG图片解码任务、GUI界面任务,图片显示任务。每个任务均有以下三部分组成:应用程序、任务的堆栈以及任务的状态机。任务堆栈用以存储CPU寄存器内容。当某任务由运行态变为其他状态时,CPU寄存器内容压入相应任务堆栈,反之则将相应任务堆栈内容置入CPU寄存器。任务的状态机记录了当前任务的运行状态,当有新的消息转发给任务时,任务可根据状态机查询相应的状态,来决定下一步的具体操作。操作系统也可以查询任务的状态机来获得当前任务的运行状态。
优先级的设定是根据任务的重要性和任务的实时性需求来定的。总控任务优先级最高,视频任务的实时性大于音频任务的实时性,所以将音频的优先级排在视频解码任务的后面。对于其他几个任务一般没有太多的约束,我们可以任意安排其优先级。优先级从高到底的顺序排列:总控任务,视频解码任务,音频解码任务,JPEG解码任务,图片显示任务,GUI界面任务。
5.2、系统任务间的消息通信机制与状态机的设计
在 数码相框 这个系统中,消息的类型主要有两类:
一是外部输入(键盘)转化的消息;二是任务之间相互传递的消息。第一类消息不知道消息的接受方,直接交给总控任务来处理,总控任务通过查询状态机获得各个任务目前的运行情况后,进行内部消息的转换,转发给目标任务,由目标任务来具体处理。目标任务接受到总控任务传送过来的内部消息之后,查询自身的状态机,执行相应的处理。每个任务都有一个时间点来查询新的消息。在音频解码任务中这个时间点设在解码数据流后填充buffer和播放buffer互换的时刻。图片显示任务是一个不断循环的显示过程,利用每次循环结束的时刻查询新的消息。第二类消息是任务之间相互传递的消息,任务知道消息的接受方。因此在两个需要相互通信的任务之间直接建立消息邮箱和信号量进行同步和通信。
状态机是记录任务运行状态的一种工具,对于数码相框这个系统来说,在不同的运行状况下对于相同按键的处理是不同的,所以必须通过状态机来实现任务的调度和处理。本文的状态机实现采取分块的思想,即一级一级从上往下对消息进行处理。上级的状态机不需要对消息的内容进行具体的处理,只要明确传递给下面的哪一个状态机来具体处理。针对数码相框这个产品,本文设计了两级状态机的实现机制。一级是总控任务的状态机,二级是各个应用程序的状态机。总控任务的状态机,主要用来对外部消息的转发;应用程序的状态机主要处理启动,退出,暂停等具体操作。如图3所示,总控任务查询到有新的消息进来后,首先查询当前各个任务的运行情况,然后判别消息的内容,将消息转换成内部消息分发给当前任务或者即将运行的任务。应用程序的任务状态机接受到总控状态机发送过来的内部消息之后,也是查询自身的状态机,并且检查消息的正确性,然后根据自身的运行状态执行相应的操作。具体如图4所示。
图3总控任务的状态机流程
图4 应用程序的状态机流程图
5.3、数码相框系统的整体实现过程
系统上电后从flash中执行boot.s启动代码,boot.s的主要作用就是初始化SDRAM,设置PLL,将保存在flash中的CODE拷贝到SDRAM中。因为flash中的数据可以永久保存,不会因为掉电而消失,而SDRAM则不行。