基于uC/OS-II的MP3文件播放系统设计 02
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
基于uC/OS-II的MP3文件播放系统设计 02
4.2 μC/OS-II内核的多任务管理
μC/OS-II除了具有良好的稳定性和安全性外,主要是对多任务的管理,可以管理多达64个任务。除了8个白用任务外,用户的应用程序最多可达56个任务。
在多任务系统中,内核负责管理各个任务,并且负责任务之间的通信。内核提高的基本服务是任务切换,由实时内核管理。一个任务有5种状态,在任意给定时刻,任务状态一定是这5种状态之一:休眠、就绪、运行、挂起(等待某事件发生)和被中断。
μC/OS-II总是进入就绪状态任务中优先级最高的那一个。通过任务级的调度函数OSSched()或者中断级的调度函数OSIntExt()在任务就绪列表OSRdyTb()中查找。在确定优先级最高的就绪态任务后,如果有更高优先级的任务要运行,调用OS_TASK_SW()完成实际的任务切换。
4.3 μC/OS-II任务间通信
μC/OS-II有3种用于数据共享和任务通信方法:信号量、邮箱和消息队列。信号量是一个二值量或可计数量,用于表示一个或者多个事件的发生。或者用于实现共享资源的互斥访问。任务调用函数OSSemPend()等待一个信号量,用OSSemPost()发送一个信号量。邮箱和消息队列都是μC/OS-II中利用指针变量的通信机制。邮箱中包含一个指针,指向包含了特定"消息"的数据结构,也可把邮箱当作二值信号量实现资源互斥访问。而消息队列可看作是多个邮箱组成的数组,只是它们共用一个等待任务列表。每个指针所指向的数据结构可按具体应用设定。 此系统中含有播放(play)、暂停播放(pause)、停止播放(stop)、音量控制(control volume)、下载音乐(download)5个任务。各任务设置相应任务堆栈和优先级,其中download任务优先级最高,其他4个任务优先级从高到低依次为停止播放(stop-task)、暂停播放(pause-task)、音量控制(control volume-task)、播放(plav-task)。这样在播放(play-task)运行态时,其他任务也能获得CPU控制权,完成播放过程中的其他功能。
arm处理器有音频文件解码库,能够有效的解码MP3格式的歌曲,输出16-bit立体声PCM数据。在播放任务play-task中,调用int play(struct audio_play *play)函数播放歌曲,struct audio_play *play是自定义的audio_play类型指针。播放时调用voidwrite_dev()初始化IIS接口和DMA2,以下为实现软件播放的主要代码:
![](http://embed.chinaitlab.com/UploadFiles_4615/200809/20080901091952285.jpg)
5 运行播放任务时接口初始化 在系统开始时,需初始化硬件函数,各接口的初始化根据任务的具体执行要求,设置相应的控制寄存器实现。ARM存储系统中,所有I/O映射为地址空间,易于实现读写操作。其中对UDA1341的初始化需要注意L3控制端口的时序。因为L3控制端口由arm器件的通用PORT控制,需软件编程实现传送控制信息过程中符号L3的时序。
实现IIS初始化的主要代码为:
![](http://embed.chinaitlab.com/UploadFiles_4615/200809/20080901091952189.jpg)
6 结束语 |
|
|
|
|
|