做过一个简单的MP3,可以放歌曲,显示歌曲目录、歌曲名和歌曲作者,还可以显示温度和时间,心血来潮,写一下它的软件组织形式,希望对此感兴趣的人有所帮助。
先上一张MP3项目开发流程图,让大家有个框架。
这里的重点是软件架构,所以在上一张程序树状图:
里面的程序包括各个驱动设备的驱动程序和fatfs文件系统。
在上一张主函数中调用的资源图:
主函数,也可以说是应用程序的资源就来自这些位置,也就是说我想建一座房子材料——什么水泥、沙子、砖头。。。都是从这里面取的。第一张项目宽架图告诉我们要做的是去准备这些材料,然后再去考虑那些材料不好找,这就是所谓的项目开发重点。
MP3的设备驱动程序包括SD卡的驱动程序,VS1003硬件解码芯片的驱动程序,DS1302的驱动程序,sensor的驱动程序,显示驱动程序等。这些驱动程序存储的位置都是单片机的flash。
针对每个驱动程序我遵循的都是三文件形式——.c+.h+.config,源文件+资源输出+源文件配置文件,这种规范在一些大公司里面所采用的,具有较好的可移植性。对于程序员我们应尽可能做到让程序不带“策略”,这是软件设计的共同目标。(再以后我将谈到机制和策略的编程思想)。这样我们写的驱动程序才具有更高的灵活性。
这里设计的技术难点还有一个FatFs文件系统的移植。文件系统是为了明确磁盘或分区上的文件的方法和数据结构。说起文件系统必须相对于存储设备才有意义。这里是用来管理Sd卡上面的文件。
文件系统的层次叫驱动程序要高一层,为什么这么说呢,上一张图你就明白了:
程序员需要给文件系统提供三个对底层硬件的操作函数,我们才能利用文件系统对硬盘(disk)上面的设备进行管理和使用。
这三个函数分别是:sd_read();sd_write();RTC();他们分别是SD读扇区,SD卡写扇区,系统时钟。(可能还需要提供更多的函数接口,但是SD卡读写扇区是必须要有的)。
文件系统接受了这三个资源便可以对Sd卡进行管理了。
应用程序就是实现了吧SD卡上面的MP3文件或者wma文件通过文件系统提供的函数接口找出来,发送到数据流设备上,也就是解码芯片上,解码流程我们不需要知道,这是芯片内部集成的,无需人工参与。输出到音频输出设备就行了。
说到这个里,我们的MP3就可以运行了——把程序下到单片机上面,上电,应用程序就开启了!听歌吧~~~
补充:
这里没有使用到操作系统,不能实现多进程同时进行工作,每次只能实现一个硬件工作。如果加入操作系统,我们可以看到的效果就会是MP3一边显示歌词,温度、时间,一边放歌曲,操作系统是个很好玩的东西,有兴趣的可以移植uCOS II,这个比较小,AVRX也可以,在做这些之前,花点时间去了解软件层面上的各个层之间的调度关系,少走弯路。