EDN China > 设计实例 > 微处理器与DSP > CPU/GPU > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

(多图) 基于ARM9和μC/OSII的多频道数据采集系统设计

维库电子?? 2011年08月31日 ?? 收藏0

  3.2? 任务时限设置

  为了对整个系统的时间调度进行优化,首先说明几个内部工作时间。i386体系和Linux2.5内核中操作系统节拍率都设置为1000 Hz[2]。在这里将μC/OSII操作系统调度时间OS_TICKS_PER_SEC也设置为1000,也就是说操作系统的任务调度以ms为单位。ARM9内核CPU工作频率设置为400 MHz,即CPU机械周期以ns为单位。外设包括上位机命令扫描和上位机、下位机显示部分工作都以s为单位。μC/OSII系统中任务切换、调度及延时都以系统节拍率为单位,而内部代码的运行是以机械周期为单位。内部任务时限可以以节拍律为单位,也可以以实时时间为基准,获得一个绝对时间差。

  单个采样任务通道内部只有采样任务需要时限设置。为了达到智能化,用消息队列的等待延时替代了采样任务时限,而该延时便是本通道的采样周期。其他的后续任务包括内存开辟、数据处理、数据发送,都依次等待上一级任务消息,受上一级任务钳制不设置任务时限。显示任务时限按ms设置为绝对时间差。

  3.3? 针对外设的时间优化

  针对命令扫描和解析任务,将其设置为中断方式,在检测到有用户命令输入时发生中断,在中断里对用户命令进行解析、分析、提取和处理。在中断下半部分对命令进行广播式发布,发布到各个采样任务函数使其立即刷新执行。因为用户工作方式改变,命令刷新频率并不高而且任务量不大,所以完全可以利用中断的快速处理来实现这种功能。

显示任务工作原理图

图4? 显示任务工作原理图

  在处理完命令扫描和采样任务之后,影响整个系统性能的就剩下上位机和下位机显示部分了。显示任务工作原理如图4所示,利用μC/OSII系统提供的消息队列对显示部分进行改善。分别建立两个长度为16的消息队列和内存块链表,数据提交任务从空闲内存池中得到可用内存块之后将本任务要显示的数据存入该内存块,此时该内存就变成了带有数据的待显示数据块。而后将该内存块的地址以消息的形式注册在显示消息队列上。消息队列的长度设置为16,虽然这里只有12个任务会发送消息给消息队列,但在实时多任务程序中,各个任务的运行是随机的,消息队列在一段时间内得到的消息个数是个不定值,所以留出4个空位作为裕度。而且设置初始值为16的计数信号量来保护消息队列,数据提交任务在提交数据之前先检测该信号量,如该信号量有效就可以发送信号,如信号量无效则需等待,直到有可用信号位时方可将信号发出。在外部硬件操作端,由外部发送任务将消息队列中的消息按照固定速率发送到外部信号线上。

  这样设计,消息队列就相当于一个缓冲区,使得所有提交任务都可以向这个缓冲区发送待显示数据,有效地避免了多个任务争用一个外围设备而引起的死锁、竞争冒险等问题。同时减少了任务数量,减少了任务切换的次数,充分利用了系统时间,提高了系统性能。

  3.4? 关键区保护

  多任务设计中每个任务在任何时刻都可能被其他任务打断,必须充分考虑代码的安全性、可重入性、可靠性、饥饿、互锁、死锁等情况。[3]

  为了避免上述情况,任务间消息发送和传递时以及在数据采样时对相应函数体进行关键区保护,在这些函数运行的时候禁止中断和任务调度,以保证数据传递和数据采样的绝对正确性和系统运行的绝对安全性。

  4? 极限频率测定及总结

  上位机超级终端接收到的极限频率测试结果如图5所示。

极限频率测量结果

图5? 极限频率测量结果

  分别测试了高频段、中频段和低频段的极限频率,结果在CPU使用率80%~90%的情况下测定。该系统成功实现了智能化设计和优先级动态调度、系统参数动态设置等功能,达到了设计指标。


上一页12下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

ARM9? 数据采集? LCD? volatile?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈