3. 添加CooCox CoOS操作系统
目前嵌入式领域的实时操作系统还是很多的,相uCOS-II,FreeRTOS,以及ARM的RTX等等,但是综合考虑我们选择了CooCox CoOS。CoOS是专门针对Cortex-M3内核处理器设计的一款实时操作系统,而且开源免费。它的使用方法和uCOS-II差不多,最主要的是增加了一个同优先级任务之间时间片轮转的功能(uCOS-II中不能有同优先级的任务),上手起来很容易。
CooCox CoOS是专门针对于ARM Cortex-M3专门设计和优化的一款可剪裁的多任务实时内核。CooCox CoOS支持时间片轮询和优先级抢占两种不同的任务调度机制,支持软件定时器,并提供多种通信方式,如:信号量、邮箱、队列、事件标志、互斥体等。它符合CMSIS(Cortex Microcontroller Software Interface Standard)。
(1)CooCox CoOS特征
(2)支持的器件
你可以从如下网站下载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的任何尺寸的物理和虚拟显示。
1)UCGUI的移植
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的歌曲选择界面:
2)MP3的播放界面设计
① 显示的是播放器的名字;
② 显示的是当前所要播放的音乐的名字;
③ 显示歌词;
④ 显示歌曲的播放时间;
⑤ 显示歌曲播放的进度;
⑥ 停止按钮,用来停止播放音乐;
⑦ 切换到上一首按钮,用来切换到上一首音乐进行播放;
⑧ 播放按钮,用来播放音乐;
⑨ 切换到下一首按钮,用来切换到下一首音乐进行播放;
⑩ 打开按钮,用来显示歌曲选择列表。
>>>这个设计和大多数的MP3界面差不多。
3)MP3的歌曲选择界面设计
按下MP3播放界面上的打开按钮之后,会停止播放音乐,并显示歌曲选择列表,如下图所示
① 此框右边的3/6表示,SD卡中总共用6个歌曲文件,当前选择的是第3个;
② 用蓝色标记,表示当前歌曲被选中;
③ 在触摸屏上按下OK按钮后,会回到MP3播放界面,并播放选中的歌曲;
④ 在触摸屏上按下Back按钮后,会回到MP3播放界面,并播放进入歌曲选择列表之前的音乐。
在歌曲选择列表中,只能通过开发板上的按钮来向上选择音乐或向下选择音乐,选择合适的音乐之后,按下OK按钮就可以回到MP3播放界面进行播放了。这里之所以没有使用触摸屏来随机选择歌曲,一是触摸屏精度的问题,容易选不准;而是实现难度的问题,这里得歌曲显示是通过UCGUI的列表框来实现的,而要把触摸屏和列表框结合使用,比较麻烦,只能等以后再慢慢完善了。
到目前为止,讲述的都是MP3设计过程中的一些要点,下一节会从全局角度讲述一下MP3的总体设计方案。
文章评论(0条评论)
登录后参与讨论