原创 基于SAM3U + CooCox CoOS + UCGUI的MP3设计(3)

2010-4-26 19:06 2873 4 4 分类: MCU/ 嵌入式

3. 添加CooCox CoOS操作系统


       目前嵌入式领域的实时操作系统还是很多的,相uCOS-IIFreeRTOS,以及ARMRTX等等,但是综合考虑我们选择了CooCox CoOSCoOS是专门针对Cortex-M3内核处理器设计的一款实时操作系统,而且开源免费。它的使用方法和uCOS-II差不多,最主要的是增加了一个同优先级任务之间时间片轮转的功能(uCOS-II中不能有同优先级的任务),上手起来很容易。


CooCox CoOS是专门针对于ARM Cortex-M3专门设计和优化的一款可剪裁的多任务实时内核。CooCox CoOS支持时间片轮询和优先级抢占两种不同的任务调度机制,支持软件定时器,并提供多种通信方式,如:信号量、邮箱、队列、事件标志、互斥体等。它符合CMSISCortex Microcontroller Software Interface Standard)。


1CooCox CoOS特征



  • >免费开放的实时操作系统
  • >针对Cortex-M3 核设计
  • >符合CMSIS
  • >支持优先级和时间片轮转两种调度算法
  • >可裁剪
  • >中断延迟时间为0
  • >>能够防止优先级反转
  • >能进行堆栈溢出检查
  • >支持信号量,互斥体,事件标志,邮箱和队列五种同步与通信方式
  • >>支持ICCARMARMCCGCC 平台

2)支持的器件



  • >ST STM32 系列
  • >>Atmel AT91SAM3U 系列
  • >NXP LPC17xx 系列
  • >>Toshiba TMPM330 系列
  • >Luminary LM3S 系列

你可以从如下网站下载CooCox CoOS 的源代码:http://www.coocox.com.


>>>>


在程序中总共创建了8个任务,功能分别如下:


void SDCardTask(void)                // SD卡中读取文件,并判断文件的类型


void PlayWaveTask(void)             // 用于播放Wav文件


void DecodeTask(void)                // 用于解码及播放MP3文件


void ProgbarTask(void)                // 用于显示进度条及歌曲播放时间


void LRCShowTask(void)            // 用于显示当前播放歌曲的歌词


void ReadButtonTask(void)           // 读用户按钮,用于歌曲选择列表中


void TouchScreenTask(void)        // 读取触摸屏状态,对MP3播放器进行控制


void GUITask(void)                     // 用于在LCD屏上显示MP3播放界面


各任务的优先级如下,其中数字越小代表优先级越高:


#define GUITask_Prio                  7


#define TouchScreenTask_Prio     8


#define ReadButtonTask_Prio        8


#define ProgbarTask_Prio             9


#define LRCShowTask                 9


#define DecodeTask_Prio             9


#define PlayWaveTask_Prio          10


#define SDCardTask_Prio             11


       具体任务的设计在下面进行介绍。


4. 使用UCGUI设计MP3的界面


       现在要设计MP3的界面了,这是外部形象,马虎不得。


       如果只是简单画些图,添加一些方框,显示一些文字,根本就不需要什么图形开发系统,我们自己手画就行了。但问题往往不是这么简单的,画图没问题,显示文字没问题,但进度条、滚动条怎么办,像一些文字特效,如居中、居左、文字透明等等,这些自己一点一点的设计下来,那工作效率就很低了。


       因此,最后我们放弃了自己手工设计MP3界面,决定采用已有的图形开发系统UCGUI来进行设计。UCGUI是一种用于嵌入式应用的图形支持软件。它被设计用于为任何使用一个图形LCD的应用提供一个有效的不依赖于处理器和LCD控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。UCGUI适用于使用任何LCD控制和CPU的任何尺寸的物理和虚拟显示。


     1UCGUI的移植


       LCD显示模块是基于UCGUI开发的,把UCGUI移植到SAM3U开发板上比较简单,只需要修改对应的LCD的底层驱动,再经过一些配置修改就可完成。在该GUI下开发界面程序很方便,可查看UCGUI的使用手册。本程序选择移植的UCGUI版本为3.24,具体移植过程如下:


修改Config文件夹里的GUIConf.h文件


#define GUI_OS                    (0)  /* 不支持多任务操作系统 */


#define GUI_SUPPORT_TOUCH     (0)  /* 不支持触摸屏 */


#define GUI_SUPPORT_UNICODE   (0)  /* 不支持ASCII/UNICODE混合字符串 */


#define GUI_DEFAULT_FONT        &GUI_Font8x16 /* 默认的字体 */


#define GUI_ALLOC_SIZE           5000  /* WM和存储器设备分配的动态存储空间 */


#define GUI_WINSUPPORT          1  /* 窗口管理包可用 */


#define GUI_SUPPORT_MEMDEV    1  /* 存储器设备可用 */


#define GUI_SUPPORT_AA           0  /* 去锯齿功能不可用 */


说明:虽然程序中使用到了CooCox操作系统,触摸屏以及汉字的显示,但是这时并没有让GUI支持操作系统、触摸屏和UNICODE编码,这样做虽然在某种程度上增加了程序的复杂性,但是让程序的设计更加的直接和清晰了。


修改Config文件夹里的LCDConf.h文件


#define LCD_XSIZE      (240)   /* LCD屏的宽度为240个像素 */


#define LCD_YSIZE      (320)   /* LCD屏的高度为320个像素 */


#define LCD_BITSPERPIXEL (16) /* LCD屏每个像素用16位来表示 */


#define LCD_CONTROLLER  3194 /* LCD控制器的型号 */


#define LCD_INIT_CONTROLLER()   


说明:这里LCD_INIT_CONTROLLER()设置为空,是因为并不需要在GUI中初始化LCD,而是在程序最开始的时候就把LCD屏初始化了。


gui/core文件夹中添加一个名为GUI_X.c的文件,主要内容为:


#include "GUI_X.h"


#include "coocox.h"


#include


 


void GUI_X_Delay(int ms) {  


       CoTickDelay(ms);


}


int GUI_X_GetTime(void)


{


       return ((int)CoGetOSTime());


}


void GUI_X_ExecIdle(void)


{


       CoTickDelay(1);


}


unsigned int GUI_X_GetTaskId(void)


{


       return 0;


}


说明:这里主要是添加GUI的延迟函数,以及获取操作系统当前时间的函数。


gui/LCDDriver文件夹中添加一个名为ATT3194.c的文件,这是移植的关键。


这个文件主要是参照gui/LCDDriver里面的LCDSLin.c来写的,这是UCGUI与具体的LCD屏显示相关联的地方,这里面实现了画点、画线、显示图片等基本功能。里面有两个地方需要移植:_SetPixel()函数用来在LCD屏上画一个像素点,_GetPixel()用来获取指定地方像素点的颜色,其他的函数都是直接或间接调用这两个函数来实现相应的功能。


修改gui/core文件夹中的GUIChar.c文件。


修改函数GL_DispLine内容:


void GL_DispLine(const char GUI_FAR *s, int Len, const GUI_RECT *pRect)


{


    while (--Len >=0) {


       if (*(U8*)s <= 0xA0) // ASCII


       {


        GL_DispChar(*(U8*)s++);


       }


       else {// it is not ASCII Code


           LCD_DisplayHZChar((void *)BOARD_LCD_BASE, GUI_Context.DispPosX,


                                     GUI_Context.DispPosY, s, LCD_COLORINDEX);


                     s += 2;


                     --Len;      


                     GUI_Context.DispPosX += 16;


             }


   }


}


说明:这里做的修改主要是为了显示汉字,这里汉字的显示和ASCII码的显示是分开的。如果一个字符的值大于0xA0,则说明它不是ASCII字符,而是汉字,那么就把这个字符及它后面的那个字符一起作为汉字显示。


修改gui/core文件夹中的GUI.h文件。


GUI.h中添加5个按钮的ID定义:


#define GUI_ID_OPEN         GUI_ID_USER + 1


#define GUI_ID_STOP         GUI_ID_USER + 2


#define GUI_ID_PREV         GUI_ID_USER + 3


#define GUI_ID_PLAY         GUI_ID_USER + 4


#define GUI_ID_NEXT        GUI_ID_USER + 5


以上显示的是UCGUI移植过程中的主要内容,具体移植可以参考源程序。最后设计了两个界面,分别是MP3的播放界面和MP3的歌曲选择界面:


       2MP3的播放界面设计


>>1269673758_a34e8ad5.jpg
>>


显示的是播放器的名字;


显示的是当前所要播放的音乐的名字;


显示歌词;


显示歌曲的播放时间;


显示歌曲播放的进度;


停止按钮,用来停止播放音乐;


切换到上一首按钮,用来切换到上一首音乐进行播放;


播放按钮,用来播放音乐;


切换到下一首按钮,用来切换到下一首音乐进行播放;


打开按钮,用来显示歌曲选择列表。


>>>这个设计和大多数的MP3界面差不多。


       3MP3的歌曲选择界面设计


按下MP3播放界面上的打开按钮之后,会停止播放音乐,并显示歌曲选择列表,如下图所示


>>1269673793_bad1aeac.jpg
>>


此框右边的3/6表示,SD卡中总共用6个歌曲文件,当前选择的是第3个;


用蓝色标记,表示当前歌曲被选中;


在触摸屏上按下OK按钮后,会回到MP3播放界面,并播放选中的歌曲;


在触摸屏上按下Back按钮后,会回到MP3播放界面,并播放进入歌曲选择列表之前的音乐。


在歌曲选择列表中,只能通过开发板上的按钮来向上选择音乐或向下选择音乐,选择合适的音乐之后,按下OK按钮就可以回到MP3播放界面进行播放了。这里之所以没有使用触摸屏来随机选择歌曲,一是触摸屏精度的问题,容易选不准;而是实现难度的问题,这里得歌曲显示是通过UCGUI的列表框来实现的,而要把触摸屏和列表框结合使用,比较麻烦,只能等以后再慢慢完善了。


到目前为止,讲述的都是MP3设计过程中的一些要点,下一节会从全局角度讲述一下MP3的总体设计方案。

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条