终于有时间了,和大家说说嵌入式软件设计。不知道各位的硬件做的怎么样了,说起软件设计其实没什么特别的地方。整个软件采用最简单的前后台系统。在满足需求的前提下,能最简化设计,那是一种能力的体现。这个系统,用前后台实现是绰绰有余了。
前台做主要做两个工作:查询用户的控制并响应用户的控制;从Flash中读取原始数据,解码后放入输出队列。
后台只做一个工作,将队列中的解码数据定时(22KHz)送到DAC上输出。
这是整个系统的活动图。让大家可以了解整个代码设计的思路。
其中,从Flash中读取1Byte的原始数据并解码,遵循如下流程:
这里需要解释一下,当队列满的时候,就不从Flash里读取数据往队列里插入了。防止解码过快,产生前后台不一致,造成声音丢帧、失真。
这里是更新音乐的整个活动图。其中擦写Flash的活动图就不贴出来了,和更新音乐差不多,也比较简单,就不细说了。
搞清楚整个前后台的活动,就要分析一下前后台的通信数据。这里我们可以看到,前后台的数据通信有两个方面,一个是播放音乐的数据队列;一个是串口接受数据的队列。这两个队列依我说,最好做成循环队列,是比较好的方式,好用。并且这两个数据队列是前台和后台的中断共享的,所以无须互斥,本身中断就是个临界区。这里要注意,多个中断之间如果没有共享数据,是可以认为他们是在同一个临界区里的。如果不同级别的中断共享了数据,那就不能认为中断是临界区域了。必须做相应的互斥。因为串口和定时器没有共用数据,所以无须做互斥,可以互不干扰的工作。
有些比较好玩的童鞋要注意了,如果你用uC/OSII或者其他的复杂的操作系统来做这个事情,还是要仔细分析一下,该保护的还是要保护的。
好了,今天说到这里,明天继续接着侃……