博客首页 | 排行榜 |

microcom的博客

个人档案
博文分类
【32位MCU】基于SAM3U + CooCox CoOS + UCGUI的MP3设计(3)  2010-03-27 15:25

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的播放界面设计


显示的是播放器的名字;

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

显示歌词;

显示歌曲的播放时间;

显示歌曲播放的进度;

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

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

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

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

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

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

       3MP3的歌曲选择界面设计

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


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

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

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

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

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

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

 

类别:默认 |
上一篇:【32位MCU】基于SAM3U + CooCox CoOS + UCGUI的MP3设计(4) | 下一篇:【32位MCU】基于SAM3U + CooCox CoOS + UCGUI的MP3设计(2)
以下网友评论只代表其个人观点,不代表本网站的观点或立场