另外在OS_CPU.H文件中还需设置几个堆栈的参数如堆栈的增长方向、堆栈的操作单位等。BF533支持的是自顶向下的堆栈增长方式,即堆栈空间从高地址向低地址增长。单次堆栈操作单位是INT32U。最后在OS_CPU.H还要对三个函数进行宏定义:屏蔽所有中断,恢复所有中断,进行任务切换。这三个函数在ucos-ii中十分重要,前两个是为了保证一些重要函数或任务运行中的数据不会被改变(即通常所说的代码临界段),第三个是用于ucos-ii的任务切换,在ucos-ii中要求任务的切换就好象是刚发生过一次中断一样。在本系统中首先假设申请切换的任务已经把相关的寄存器变量等参数保存,并将堆栈指针指向了优先级高的任务。这样任务切换函数就只需要完成中断返回操作。
开发软件采用VisualDSP++,它的编译器支持在C语言中嵌入汇编,因此我们把这个宏定义直接写成了一条软件中断指令:raise 14。这样一旦系统进行任务切换,实际上引起了一个中断操作,在OS_CPU_A.ASM文件中我们在此中断操作中完成任务切换前的保存寄存器等工作,最后是一条中断返回指令:RTS。这样优先级更高的任务运行时就会好像刚从中断返回一样。
在文件OS_CPU_A.ASM中还需要编写几个汇编函数来实现ucos-ii的时钟节拍、正常任务切换、中断级任务切换、初始化任务堆栈等功能。
在ucos-ii中,我们可以把时钟节拍TICKS比做是它的心脏节拍。TICKS为系统提供了一个时间基准并为各个任务提供了时间等待等服务。本系统使用BF533的核心定时器来完成系统时钟节拍的功能。系统TICKS设定的是100mS。以下是部分初始化核心定时器的汇编代码:
_CoreTimerInit:
p1.H = ( TCNTL >>16 ); //设置时间控制寄存器
p1.L = ( TCNTL &0xFFFF );
r3 = 1;
[ p1 ] = r3;
p1.H = ( TCOUNT >>16 ); //装载计数值
p1.L = ( TCOUNT &0xFFFF );
[ p1 ] = r1;
p1.H = ( TCNTL >>16 ); //开启定时器
p1.L = ( TCNTL &0xFFFF );
r1 = 0x07;
[ p1 ] = r1;
_CoreTimerInit.end:
除增加上述功能函数外,在ucos-ii启动代码的程序中加入BF533的一些必须的初始化程序如CPU频率的设定等, ucos-ii就可以在本系统上运行起来。
2.2.2 嵌入式监控系统在ucos-ii中的系统驱动程序添加
ucos-ii移植完成后,嵌入式系统要实现应有的功能还需要添加一些外围电路的驱动程序如:网卡芯片LAN91C111的初始化程序,视频A/D芯片的初始化程序等。由于Blackfin系列DSP支持存储空间的DMA操作,为了充分发挥BF533的硬件优势,本系统专门建立一个文件DMA_TRANS.C实现多个存储空间的DMA操作的初始化配置,以方便各个任务实现其功能调用。以下就是实现网卡芯片DMA存储操作的部分配置文件:
void init_dma(LAN91C111_DATA *d)
{dev =d; // 为LAN91C11设置一个全局静态变量,实现对它的数据访问
SET_SHORT((dev->DstStreamBaseAddr+OFFSET_CONFIG),(unsignedshort)0x0);
// 对目标地址的配置清零
SET _SHORT((dev->SrcStreamBaseAddr+OFFSET_CONFIG),(unsigned short)0x0);
//对源地址的配置清零
dma_mask_en(1); //将SIC控制寄存器的相应DMA传输位置1。}
2.3 基于ucos-ii和监控系统的任务程序添加
在ucos-ii中系统的各个应用程序被当成是任务,每个任务被分配一个优先级,ucos-ii支持的最大任务数可在OS_CFG .H文件中指定。ucos-ii可以管理多达64个任务,并从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。因为ucos-ii不支持相同优先级的任务,所以每建立一个任务就需要为任务分配一个优先级并建立一个独立的堆栈空间。
本智能监控系统主要实现对运动目标的跟踪监控和将原始数字图象转化为BMP格式并向网络发送现场图片的功能。在ucos-ii中分配了两个任务优先级0和1给对运动目标的跟踪和网络传输。之所以使网络传输的任务优先级低于对运动目标跟踪的任务,是因为考虑到网络延时等因素会造成对运动目标跟踪的实时性效果比较差,对图像做二值化和差分等运算的时间不大于150mS以及摄像机云台运动一次的时间大概是500mS。本系统在对运动目标跟踪任务中采取的策略是:每当任务完成一次跟踪,就使自己进入挂起状态,直到每秒定时到后,在时钟节拍中断服务程序中唤醒该任务使之处于就绪状态。
嵌入式系统常用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,实时响应要求很高,特别是在面向视频应用的系统中。嵌入式操作系统具有体积小、实时性好等优点。嵌入式操作系统ucos-ii就是基于任务优先级抢占的嵌入式实时操作系统。