基于S3C44B0X的μC/OSⅡ和μC/GUI整合移植

时间:2022-09-28 04:36:20

摘 要:提出一种将开源实时操作系统μC/OSⅡ与文件系统、图形界面等整合构建成一个嵌入式应用系统的设计方案。该方案通过分析μC/OSⅡ的启动过程,重新配置和定义μC/OSⅡ的3个主要函数,初始化S3C44B0X内部LCD控制器的驱动程序,修改μC/GUI相关的配置文件和宏定义,总结出一套在S3C44B0X上具体的整合方法、移植步骤以及注意事项。最后测试表明该整合移植方法是可行的,系统平台运行稳定可靠。

关键词:S3C44B0X;μC/OSⅡ;μC/GUI;移植

中图分类号:TP3141.54 文献标识码:B 文章编号:1004373X(2008)1603303

Realization of Transplanting μC/OSⅡ with μC/GUI in S3C44B0X

ZHOU Bo.1,MA Wenwen.2

(1.PLA No.92601 Troops,Zhanjiang,524009,China;2.Information Science and Engineering,Central South University,Changsha,410083,China)

Abstract:This paper presents a design method of embedded application system which uses open source real time operation system μC/OSⅡ combing such as file system,graphic user interface and so on.Via analyzing startup process of μC/OSⅡ,reconfiguring and defining three main functions of μC/OSⅡ,initializing drivers of LCD controller inside,modifying correlative configuration file and macro definition of μC/GUI,text summarizes the technique of realization,the steps of transplant and special notices.The testing indicates that the transplanting method is feasible,system platform runs stability and reliably.

Keywords:S3C44B0X;μC/OSⅡ;μC/GUI;transplant

μC/OSⅡ是一个微型的实时操作系统,包括一个操作系统最基本的一些特性,如任务调度、任务通信、内存管理、中断管理等,而且这是一个代码完全开放的实时操作系统,其源代码相对其他操作系统来讲是非常简单的。但是就μC/OSⅡ本身而言,它仅是一个内核,还不能直接用于一个复杂的工程项目,必须与其他一些模块如TCPIP、文件系统(FS)、图形界面(GUI)等等整合[1],其中图形界面(GUI)是一个成熟的工程产品不可缺少的部分。目前较为流行的嵌入式GUI有miroWindows,MiniGUI,QTEmbeddedOpenGUI,LcGUI等,而基于μC/OSⅡ平台的用的较多的是μC/GUI。μC/GUI是Micrium公司开发的一种基于嵌入式系统的图形界面支持系统。可以用于任何使用LCD图形显示的应用,提供高效的独立于处理器及LCD控制器的图形用户接口,可以在单任务或是多任务系统上运行,并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。

S3C44B0X是三星(SAMSUNG)公司一款基于ARM7TDMI核的32位的微处理器。它一方面具有ARM处理器的所有优点:低功耗、高性能;同时又具有非常丰富的片上资源,还集成LCD控制器,非常适合嵌入式产品的开发。通过将μC/OSⅡ和μC/GUI整合移植到S3C44B0X上,在此基础上进行应用软件的开发与传统的嵌入式系统的开发相比更加简单。本系统移植过程在ARMSDT2.5仿真开发环境下进行编译,用JTAG仿真器进行在线仿真调试。

1 BootLoader

BootLoader是操作系统内核启动之前运行的一段小程序,其作用与PC机上的BIOS类似,通过这段程序,将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。在一个基于ARM7TDMICPU核的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行。BootLoader可以分为3个部分:第一部分是汇编代码,完成初始化中断向量表和堆栈的功能;第二部分开始进入C语言编程,完成一些与启动操作系统相关的硬件的初始化工作,如内存控制器、I/O控制和串口设备等;第三部分负责设置合适的硬、软件环境,以便操作系统的内核可以顺利启动。

BootLoader完成系统初始化工作后把内核和文件系统的映像文件由存储设备中拷贝到SDRAM中,再从SDRAM中执行内核的引导程序,自行加载内核和根文件系统。S3C44B0X没有存储区重映射功能,所有存储区地址固定;并且S3C44B0X提供矢量中断功能,这样减少了中断延迟,但是在启动程序中,须扩展向量表。同时为了方便程序设计和在RAM中调试,中断入口通过地址定义方式转移到RAM区的最高端。图1为S3C44B0X启动程序流程图[2]。

通过配置特殊功能寄存器完成存储器的初始化,将编译生成的二进制文件bootloader.bin烧进NOR FLASH里就完成了系统启动。

2 μC/OSⅡ移植所需工作

要使μC/OSⅡ可以正常工作,必须满足下面要求[3]:

(1) 处理器的C编译器可以产生可重入代码。这样在多个任务被调用时,不必担心数据被破坏,比如中断执行的时候。ARM SDT的集成开发环境可以生成可重入代码。

(2) 程序中可以打开或者关闭中断。在进入临界区时需要使用到这个功能。在ARM的处理器上,可以设置寄存器CPSR关闭或者打开系统的所有中断。

(3) 处理器支持中断,并且能够产生定时中断。多任务系统治之间的调度是通过定时器的调度。在ARM的处理器上可以产生定时器中断。

(4) 处理器能够支持一定数量数据的硬件堆栈。对于ARM这样的可以使用大容量储存器的处理器,这个不是问题。对于只能访问1 kB大小存储单元的处理器下移植比较困难。

(5) 处理器有将堆栈指针和其他CPU寄存器和读出到堆栈或者内存的指令。μC/OSⅡ在进行任务调度时,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。

根据上述要求进行μC/OSⅡ的移植,主要对OS_CPU.H,OS_CPU_C.C和OS_CPU_A.ASM三个文件进行修改[4]。3个文件所定义的函数在很多文献中都作了介绍,本文主要说明以下几个需要特殊注意的函数。

(1) OSTaskStkInit()函数。OSTaskStkInit()在任务创建的时候被调用,它负责初始化任务的堆栈结构。任务的最初堆栈。μC/OSⅡ的任务,在没有执行的时候就像是刚刚被中断一样,任务一经CreateTask()创建,就是这样的。堆栈则是任务上下文(contex)的一部分,CreateTask()调用OSTaskStkInit()来给任务做一个初始的任务上下文堆栈。任务堆栈结构如图2所示。

(2) OSCtxSw()函数。该函数由OS_TASK_SW()宏调用。OS_TASK_SW()由OSSched()函数调用。OSSched()函数负责任务之间的切换,OSCtxSw()函数在OSSched()函数中负责将当前任务对应的处理器寄存器保存到堆栈中,并将任务中需要恢复的处理器寄存器从堆栈中恢复出来。

(3) OSIntCtxSw()函数。该函数由OSIntExt()函数调用。OSIntExt()函数由OSTickISR()函数调用。OSIntCtxSw()负责在定时中断之间的切换。OSCtxSw()函数和OSIntCtxSw()函数均负责任务之间的切换,区别主要在于是否在定时中断期间负责任务切换。OSIntCtwSw()函数主要负责当前任务堆栈指针,并将新任务对应的处理器寄存器从堆栈中恢复出来。

不管是中断级任务切换还是任务级任务切换,发生切换需求时处理器都将脱离原先的系统模式,进入IRQ异常模式或SVC异常模式。由于这2种异常模式使用自己独立的物理寄存器,进入异常时当前指针已经不是刚才指向任务堆栈的指针,当前也不是刚才系统模式下的寄存器,所以必须设法保存刚才系统模式下的R0~R12,LR,CPSR和指向下条指令地址的PC,使用的堆栈必须是系统模式下SP指向的任务堆栈,同时还要保证异常模式下的堆栈恢复原样,不发生内存泄漏。在操作上,为保证压栈的是中断刚发生时系统模式下寄存器的值,程序采用先用异常模式堆栈过渡、再切换模式、分批保存的策略。

(4) OSTickISR()函数。μC/OSⅡ要求用户提供一个时钟源来实现时钟节拍的功能,时钟节拍推荐为每秒发生10~100次。时间节拍函数,由定时器中断产生,主要完成的功能为保存处理器寄存器,调用OSIntEnter(),调用OSTimeTick(),调用OSIntExit(),恢复处理器寄存器,执行中断返回命令。

3 μC/OSⅡ和μC/GUI的整合

液晶模块选用LFUBK909,STN型,每个像素通过3位数据来表示颜色状态,液晶屏大小

为320×240像素。S3C44B0X的LCD控制器设置8位单扫描,256色工作模式。为μC/GUI移植主要修改3个文件,包括LCDConfig.h,GUIConfig.h和LCDdriver.c。

(1) LCDConfig.h中定义可供配置的适用的宏。以下是S3C44B0X的LCD控制器的宏定义。

#define LCD_CONTROLLER (0)//控制器名称

#define LCD_XSIZE (320)//x大小

#define LCD_YSIZE (240)//y大小

#define LCD_BITSPERPIXEL (8)//每像素适用的数据位

#define LCD_FIXEDPALETTE (332)//调色板模式

#define LCD_NUM_CONTROLLER (1)//控制器数量

#define LCD_MAX_LOG_COLORS (256)//最大逻辑颜色数

(2) GUIConfig.h主要对一些高级选项进行控制和定义。定义对操作系统的有关配置、动态内存空间、默认字体以及是否使用触摸屏、窗口管理和存储器管理等选项。

#define GUI_OS (1) //支持操作系统

#define GUI_WINSUPPORT (1) //使用窗口管理器

#define GUI_SUPPORT_MEMDEV (1) //支持存储器管理

#define GUI_SUPPORT_TOUCH (1) //使用触摸屏

#define GUI_SUPPORT_UNICODE (1) //支持UNICODE

#define GUI_ALLOC_SIZE 12500 //动态内存区大小

#define GUI_DEFAULT_FONT &GUI_Font6x8//默认字体

(3) LCDdriver.c主要定义μC/GUI与LCD的硬件接口函数。包括LCD的初始化函数,画点、线、多边形、位图等二维图形的函数。主要定义以下函数。

int LCD_L0_Init(void)//初始化

void LCD_L0_SetPixelIndex(int x,int y,int ColorIndex)//用指定颜色在x,y处画点

void LCD_L0_DrawHLine(int x0,int y,int x1)//画水平线

void LCD_L0_DrawVLine(int x,int y0,int y1)//画垂直线

void LCD_L0_FillRect(int x0,int y0,int x1,int y1)//用当前颜色填充矩形区域

void LCD_L0_DrawBitmap(int x0,int y0,int xsize,int ysize,int BitsPerPixel,int BytesPerLine,const U8* pData,int Diff,const LCD_PIXELINDEX* pTrans)//画位图

在μC/OSⅡ系统中建立多个任务,每个任务都有自己的优先级。多个任务调用μC/GUI用于用户界面,在任务系统中具有典型的低级别,不会影响系统的实时行为。μC/OSⅡ中为了防止数据别破坏,每个任务访问共享资源时必须独占该资源,应该事先声明。访问结束后,应交出对资源的访问权。当多个任务调用μC/GUI,液晶屏就是共享资源,当每个任务访问之前,就必须锁定该资源;当访问完成后,对其进行解锁[5]。μC/OSⅡ下使用μC/GUI就需要提供一些内核接口函数,与硬件相关的同时与操作系统相匹配。

static OS_EVENT *DispSem;

void GUI_InitOS(void)//初始化内核接口

void GUI_X_Lock(void)//锁定

void GUI_X_Unlock(void)//解锁

U32 GUI_X_GetTaskId(void)//返回当前任务标志符

在某些程序中,如果用到窗口工作机制的回调函数,实现时间函数就非常必要。

void GUI_X_Delay(int Period)//延时

void GUI_X_ExecIdle(void)//空闲任务

通过函数void GUI_Exec(void)来完成屏幕的刷新工作。

完成以上工作,操作系统μC/OSⅡ中就可以使用μC/GUI。μC/GUI中除了与硬件相关的代码,还包括其他代码。文件目录结构如图3所示。为了使开发过程变得更加简单,这里将源文件编译成ucgui.alf文件,即编译成一个库,直接添加在μC/OSⅡ下,如图4所示。

在移植好的μC/OSⅡ和μC/GUI上建立自己的应用程序,编译生成system.bin文件,通过JTAG在线调试,成功后通过USB口直接下载到Nand Flash。程序就可以在硬件系统上正常运行。

4 结 语

本文介绍BootLoader的编程方法,以及μC/OSⅡ和μC/GUI的整合移植具体方法。在此基础上可以完成多任务调度。应用表明,μC/OSⅡ在S3C44B0X上运行稳定,可以达到实时系统的要求,μC/GUI在多任务环境下工作稳定,具有良好的显示效果,其必将在嵌入式仪器仪表的设计中得到广泛的应用。

参 考 文 献

[1]王田苗.嵌入式系统设计与实例开发[M].北京:清华大学出版社,2003.

[2]田泽.嵌入式系统开发与应用教程[M].北京:北京航空航天大学出版社,2005.

[3]韩志耕,王健.实时内核μC/OSⅡ在S3C44B0X上移植的研究与实现[J].计算机工程与设计,2006,27(5):828830.

[4]刘滨,刘兵,赵艳华.基于μC/GUI的嵌入式图形界面的设计[J].液晶与显示,2005,20(6):558563.

[5]陈进,周治国.嵌入式图形用户界面在S3C44B0X上的移植[J].工业控制技术,2006(3):9799.

[6]赵瑞芳,唐焱,吴倚龙.μC/GUI中触摸屏操作在S3C2410上的实现\.现代电子技术,2007,30(10):6365,99.

上一篇:基行时间法的纳秒量级时间间隔测量系统研制 下一篇:ADC的动态性能对软件无线电接收机性能的影响