作者:王磊,王耀南,陈斯斯,崔波亮
嵌入式系统常用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,实时响应要求很高,特别是在面向视频应用的系统中。嵌入式操作系统具有体积小、实时性好等优点。嵌入式操作系统ucos-ii就是基于任务优先级抢占的嵌入式实时操作系统。
1 系统硬件平台设计
系统使用的主芯片是adi公司blackfin系列dsp中的bf533,这是一款专门面向视频应用的dsp,拥有丰富的外设接口和较好的系统扩展性。本系统利用bf533的ppi接口采集数字图像,利用芯片的ebiu总线,扩展sdram和网络芯片。bf533工作在600mhz频率,单个芯片即可完成对运动目标跟踪和网络传输等功能。基于bf533的嵌入式系统的外围电路主要可分为三个部分:图像采集部分,网络传输部分,存储器部分。系统硬件框图如图1:
图像采集电路部分采用了ti公司的tvp5150a型视频解码芯片,它将ntsc/pal/secam制式的视频信号转换成8bits的itu-656格式,并按照ycbcr格式以4:2:2的比例转化成数字信号,支持两路模拟输入,解码芯片通过i2c串行接口编程。
网络传输部分采用lan91c111芯片。这是smsc公司为嵌入式应用系统推出的第三代快速以太网控制器。本系统中,lan91c111被当作了是异步存储空间,利用ams3把它映射在bf533的0x20300000地址空间。这样就可以通过dma操作实现对lan91c111内部存储空间读写操作,提高了传输效率并使复杂的网络数据传输过程简单化。
存储器部分bf533的存储结构是统一的4gb寻址空间。同步存储器、异步存储器、外设存储空间和片内存储器全部统一映射在4gb的空间。bf533的ebiu接口中有专门的sdram控制单元sdc,可以和sdram无缝连接。bf533支持的sdram地址是从0x00000000到0x08000000的空间,最大128mb。本系统中使用micron公司的mt48lc系列sdram,存储空间32mb,用于存储图像处理中的中间结果。另外,bf533支持四块连续的异步存储空间,每块空间大小为1mb,地址从0x20000000到0x20400000,由相应的ams0-ams3引脚选择使能。本系统使用的是st公司的m29w系列flash,大小1mb。由ams0片选使能,映射在bf533的第一块异步存储空间。
2 ucos-ii的移植
ucos-ii是一种具有可剥夺实时内核的实时操作系统,而且是免费公开源代码、结构小巧。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。最小内核可编译至2kb,适合小型控制系统。与cpu硬件相关的部分用汇编语言编写,其他绝大部分代码采用c语言编写。ucos-ii在硬件平台上的移植主要分为两大步骤:ucos-ii中与处理器相关的程序的修改、应用程序的添加。
2.1 ucos-ii与嵌入式监控系统的软硬件架构
所有的嵌入式操作系统都是与cpu密切相关的,做移植前需要熟悉被移植cpu平台的硬件架构和ucos-ii的运行原理,图2是ucos-ii与本嵌入式监控系统的软硬件架构。
2.2 基于bf533的ucos-ii的移植
移植ucos-ii需要理解处理器及c编译器的技术细节。处理器和编译器满足了ucos-ii的要求,并且已经有了必要工具。移植工作通常包括以下几个内容:
a用#define设置一个常量的值(os_cpu.h);
b声明10个数据类型(os_cpu.h);
c用#define声明三个宏(os_cpu.h);
d用c语言编写六个简单的函数(os_cpu_c.c);
e编写四个汇编语言函数(os_cpu_a.asm);
针对不同的cpu平台,移植ucos-ii的过程也会有稍许不同。在本系统中,移植过程大致分为两大部分:1)修改部分文件使ucos-ii与dsp能够实现良好的接口(主要指ucos-ii对dsp硬件架构的支持);2)添加针对嵌入式监控系统硬件平台的初始化及驱动代码。
2.2.1 针对bf533的ucos-ii的代码修改
由于bf533是基于msa(微信号架构)的16位定点dsp,为了能与ucos-ii数据处理单位统一,需要在os_cpu.h文件中设置bf533的数据单元长度。部分宏定义代码如下:
typedefboolboolean;
typedefsignedcharint8s;
typedefsignedshortintint16s;
typedefsignedintint32s;
另外在os_cpu.h文件中还需设置几个堆栈的参数如堆栈的增长方向、堆栈的操作单位等。bf533支持的是自顶向下的堆栈增长方式,即堆栈空间从高地址向低地址增长。单次堆栈操作单位是int32u。最后在os_cpu.h还要对三个函数进行宏定义:屏蔽所有中断,恢复所有中断,进行任务切换。这三个函数在ucos-ii中十分重要,前两个是为了保证一些重要函数或任务运行中的数据不会被改变(即通常所说的代码临界段),第三个是用于ucos-ii的任务切换,在ucos-ii中要求任务的切换就好象是刚发生过一次中断一样。在本系统中首先假设申请切换的任务已经把相关的寄存器变量等参数保存,并将堆栈指针指向了优先级高的任务。这样任务切换函数就只需要完成中断返回操作。
开发软件采用visualdsp++,它的编译器支持在c语言中嵌入汇编,因此我们把这个宏定义直接写成了一条软件中断指令:raise14。这样一旦系统进行任务切换,实际上引起了一个中断操作,在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存储操作的部分配置文件:
voidinit_dma(lan91c111_data*d)
{dev=d;//为lan91c11设置一个全局静态变量,实现对它的数据访问
set_short((dev-》dststreambaseaddr+offset_config),(unsignedshort)0x0);
//对目标地址的配置清零
set_short((dev-》srcstreambaseaddr+offset_config),(unsignedshort)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。本系统在对运动目标跟踪任务中采取的策略是:每当任务完成一次跟踪,就使自己进入挂起状态,直到每秒定时到后,在时钟节拍中断服务程序中唤醒该任务使之处于就绪状态。任务的状态图如图3:
3 结论
在ucos-ii的移植和系统应用程序的开发过程中,针对不同的cpu有不同的开发细节,在嵌入式监控系统中应注意以下几点:
a移植过程中,对ucos-ii的堆栈的理解很重要,它的任务切换的实质就是利用堆栈的改变和软件中断来实现任务的跳转。并且在系统的中断服务程序中也要注意到这一点,采取适当的堆栈操作以使之满足任务切换的条件。
b在ucos-ii上增加应用任务之前,最好是编写几个如串口发送之类的简单任务来测试移植ucos-ii后系统的可靠性,然后在此基础上逐渐添加一些复杂的任务。
c要分析好ucos-ii各个任务的功能与时间要求,特别是在以时间为任务运行条件的情况下,可以在时钟中断服务中创建任务。如果系统是应用在对时间不敏感的场合,可以使用ucos-ii自带的邮箱功能,用一个运行中的任务在满足一定条件下来唤醒另一个任务。
将ucos-ii应用在嵌入式智能视觉监控系统中后,经实际运行,该系统能良好完成预期的所有功能,对非高速的运动目标跟踪效果良好,局域网的pc主机能收到较清晰的halfd1分辨率、256灰度等级的现场bmp图片。
云知声医疗AI产品及相关解决方案助力国内医疗高质量发展
Linux系统中的10个常用的文本查看命令
机器视觉系统设计五大难点
星曜半导体发布首款双频GPS LFEM全自研芯片
数字双胞胎正在推动智能制造的生产效率
基于ucos-ii嵌入式操作系统和BF533实现视觉监控系统的应用方案
从数据、算力、算法、教学总结机器学习的民主化
家用加湿器NY8A小家电单片机方案开发
固定增益双端口G类差分放大器设计——ISL1561
蔚来被曝已获得独立造车资质
可以给电动汽车安装一个超大的电池来增加续航吗
中软国际与百度双方携手共建“平台+服务”生态
扫地机器人产业市场发展现状分析
华为云CDN加速,如何让峰值流量屡创新高?
高级16位数字信号控制器dsPIC33F的主要特性及应用电路
我国多地加强人工智能产业发展 日本智能电网建设取得新进展
基于HLS之任务级并行编程
在隐形眼镜上能否放置一个微型显示屏
小米6最新消息:小米官方已默认小米6重启问题,希望用户等待米6的系统更新
Max Pooling算子的设计实现