S3C2416裸机开发系列十四_GCC下UCGUI的移植(2)

发布者:神雕最新更新时间:2016-12-12 来源: eefocus关键字:S3C2416  裸机开发  GCC  UCGUI  移植 手机看文章 扫描二维码
随时随地手机看文章

现在主要讲解一下在GCC移植UCGUI,Makefile工程如何加入目录,加入源码,c标准库,编译选项的设置。

笔者的Makefile模板提取自uboot,工程中加入目录,加入源码都是很简单的,详细的介绍请参考前面章节” GCC启动代码工程应用实例”。下面主要介绍UCGUI目录下很多的源码文件Makefile的编写,一种可行的方式就是把GUI目录上所有的c文件,不管有无用到,均加入工程进行编译,第一次编译时间较长,但以后不用重复编译。因此这部分的Makefile实现如下:

include $(TOPDIR)/config.mk

 

SRCS   := $(wildcard *.c)$(wildcard *.C)

OBJS   := $(SRCS:.c=.o)$(SRCS:.C=.o)

 

CURDIR := $(shell pwd)

FOLDER := $(notdir $(CURDIR))

LIB := lib$(FOLDER).a

 

.PHONY: all clean

all: .depend $(LIB)

 

$(LIB): $(OBJS)

    @$(AR) $(ARFLAGS) $@ $(OBJS)

 

clean:

    rm -f .depend *.o $(LIB)

 

#########################################################################

# defines$(obj).depend target

include$(TOPDIR)/rules.mk

 

sinclude .depend

#########################################################################

把这个Makefile模板加入到GUI下所有的子目录和GUIDemo目录中,其它目录的Makefile也类似编写加入,这样即可把所有要编译的源码加入工程。每个子目录的Makefile需加入该目录下要编译的源码文件,生成该目录下的源码依赖关系文件.depend,最终生成该目录下的静态库文件,以供顶层目录的Makefile链接输出相应的可执行代码文件,工作方式与uboot是完全一致的。

修改顶层目录的Makefile,加入各个子目录Makefile的路径,以调用编译该目录下的源码。子目录路径SUBDIRS变量的修改如下:

SUBDIRS = $(TOPDIR)/start_code $(TOPDIR)/apps

SUBDIRS += $(TOPDIR)/GUI/AntiAlias $(TOPDIR)/GUI/ConvertColor \

       $(TOPDIR)/GUI/ConvertMono  $(TOPDIR)/GUI/Core \

       $(TOPDIR)/GUI/Font  $(TOPDIR)/GUI/LCDDriver \

       $(TOPDIR)/GUI/MemDev  $(TOPDIR)/GUI/MultiLayer \

       $(TOPDIR)/GUI/Widget  $(TOPDIR)/GUI/WM

SUBDIRS += $(TOPDIR)/GUI_X $(TOPDIR)/GUIDemo

修改顶层目录的config.mk,对编译选项如-O2二级编译优化或-g加入调试等进行设置,此处需加入工程c编译器的头文件的搜索路径,对于UCGUI头文件搜索路径只需加入Config、GUI/Core、GUI/Widget、GUI/WM这四个目录路径即可。头文件搜索路径CFLAGS变量的修改如下,s3c2416没有硬件浮点单元,加-msoft-float防止配置成只支持硬浮点的交叉工具通过编译。

CFLAGS := -Wall  -Wstrict-prototypes  -mcpu=arm920t -msoft-float

CFLAGS += -I $(TOPDIR)/start_code  -I$(TOPDIR)/apps

CFLAGS += -I $(TOPDIR)/GUI/Core  -I$(TOPDIR)/GUI/Widget \

      -I $(TOPDIR)/GUI/WM  -I $(TOPDIR)/Config

CFLAGS += -I $(TOPDIR)/GUIDemo

设置库,嵌入式开发很大程度上依赖于标准c库。在linux操作系统下,标配的c库为glibc,glibc囊括了几乎所有的UNIX通行标准,可见其内容包罗万象。因此glibc对于很多嵌入式系统来说过于臃肿和庞大,并且很多函数严重依赖于linux的系统调用。笔者在较老版本交叉编译工具开发裸机代码,可以链接glibc,但新版本的工具却无法顺利链接glibc。为了解决glibc在嵌入式应用中的不足,很多面向嵌入式的c标准库已经被开发出来,如uclibc、newlib、eglibc等。这些嵌入式c库特点就是比glibc小很多,相对独立,可不需要操作系统支持,不支持glibc的完整实现,很多功能可以根据空间需求进行取舍。一般开发linux系统,可以用glibc,如果对代码容量等方面有要求,也可使用嵌入式c库。笔者测试用相同的UCGUI移植代码分别链接uclibc和glibc,代码容量差距相当明显,链接uclibc时,可执行代码只有270k,而glibc达到700k。此处采用uclibc作为c库,对于在linux下做开发而采用glibc的读者,可以下载uclibc的最新源码库,通过make menuconfig简单配置,用交叉编译工具编译源码库,即可生成交叉编译工具可使用的c库。嵌入式开发最常使用到字符处理、数学处理方面的库函数,非linux操作系统开发,只能链接静态库,在linux下对应库名为libc.a和libm.a。由于不使用glibc,因此标准c库应指定uclibc的库存放路径。同时,对于没有硬件除法器,浮点处理单元的arm,对取余和除法操作,浮点处理都需要libgcc.a的支持。UCGUI移植用到了这三个库,因此需要在Makefile中指定这三个库的路径,库路径设置如下,对于uclibc中的libc.a和libm.a库路径,需要读者根据自己的嵌入式库路径进行修改。

PLATFORM_LIBS :=

# 加入uclibc标准c库以及数学函数库

PLATFORM_LIBS += -L /opt/crosstool/uClibc-0.9.33.2/lib -lm -lc

# 加入gcc库

PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS)-print-libgcc-file-name`) –lgcc

 

至此,Makefile工程设置完毕,跳转到顶层目录,执行make即可开始编译工程。编译时产生一大堆错误,主要是提示头文件未找到,micrium给出的GUIDemo目录下的测试代码写的不够严谨,源代码中include头文件名不区分大小写。例如实际要#include“GUI.h”,但有些源码中是#include"GUI.H",这对于windows来说是没有区别的,因为windows文件系统不区分大小写,但linux却是区分大小的,因此会提示找不到文件。windows操作系统假定它的用户是儿童,对一般用户来说,apple和Apple都是苹果,没有区别。但linux/unix操作系统假定它的用户是专业人士,apple和Apple虽然都是苹果,但它们的大小、产地、口感等均是不同的,因此是有区别的。为了代码的可重用,这些问题都是需要注意的,尤其是同时在windows和linux下做开发,应保证一定的规范性。如在windows下文件目录名区分大小写,在linux下文件名加后缀(如.c、.h)表示这个文件的用途等。此处没有好的方法,只能修改GUIDemo下所有不区分头文件名大小写的源码。

6. 代码烧录

修改编译通过后,会在顶层目录生成三个比较重要的文件,ucgui.map为链接Mapping文件,这里可以看到各个全局符号、各个段内存链接位置、大小等信息。s3c2416.dis为工程的汇编生成文件,这是编译器经过编译所有的源码并进行链接最终给出的汇编文件,这是最权威的查错文件,编译器的bug以及任何用户的失误造成编译器未能很好地按照用户的本意编译等出现的问题,在这里都可以查找出。s3c2416.bin即为我们用来烧录进SD卡或nand等存储器的二进制代码文件。

此处说明一点,笔者此系列的裸机例程都是有启动代码的,可以自动从sd/mmc卡、nand启动的,代码的烧录与一般的bootloader的烧录方式无异。最常用的烧录方式是把裸机bin代码通过SdBoot工具进行格式转换,再通过三星sd卡烧写工具IROM_Fusing_Tool把转换后的bin代码烧写进sd卡,设置成sd卡启动即可。从sd卡启动成功后,通过调用相关的Nand模块接口函数,实现代码固化进Nand,以后即可从Nand启动。详细教程请参考笔者前面章节的” GCC启动代码工程应用实例”或” MDK启动代码工程应用实例”。

7. 编译工具性能对比

笔者采用了相同的UCGUI移植源码在MDK、GCC下进行编译,MDK和GCC均设置成二级优化条件下,对比这两个平台下编译器、标准c库的差异。

7.1. 代码容量

编译后,MDK下生成的二进制可执行代码大小为250k,而GCC在采用uclibc标准库时可执行代码大小为273k,在老版本的GCC交叉编译工具上,采用glibc生成的代码大小为700k,从代码容量看,MDK生成的代码更小,采用GCC加uclibc并不比商业公司开发的平台工具差很多。在linux下做嵌入式开发,对代码容量、性能有要求的话,无特殊情况,采用嵌入式c库如uclibc、newlib等更适合。

7.2. 编译速率

均把所有源码加入工程中进行全部编译,MDK下编译时间需225秒,可以明显看到提示窗口的源码在一个一个编译,GCC下编译时间为42秒,源码编译时可看到窗口是在刷屏的,编译速度不是MDK能比的。

7.3. 代码生成质量

此处并不能准确对比MDK与GCC代码生成质量的优劣,只能以UCGUI多层裁剪测试作为一个对比项。MDK生成的可执行代码裁剪打点速度为11526060 pixel/秒,而GCC生成的可执行代码打点速度为11985690 pixel/秒,打点速度GCC高出4%,可以看出开源免费的GCC编译器以及c库uclibc同样高效优越。

 

对比可以看出,GCC与MDK不分上下,某些方面GCC做的更好,如编译速度。当然,MDK还有必杀技MicroLIB,这是MDK专为arm嵌入式应用高度优化的库,用了这个外挂库后,任何其它编译器的标准c库都暗然失色,当然只能够支持部分c库的实现。总体来说,对于移植平台多、开源免费的GNU软件来说,能达到丝毫不输商业软件的性能,确实令人尊敬,选择GNU软件进行开发也是相当不错的。

移植后的UCGUI效果:










8. 附录


对于ucgui的移植,总体还是比较简单的,主要是根据特定的LCD和触摸屏进行相应的接口移植,这只需要实现相应的LCD、触摸屏驱动模块即可。如果读者在windows下进行过win32窗口编程(非MFC),那么对于ucgui的界面编程也会是得以应手的。

ucgui_MDK.rar,MDK平台下的UCGUI 3.98版移植源码工程,需根据特定LCD、触摸屏进行驱动模块的更改。

http://pan.baidu.com/s/1eQvcNWe

 

ucgui_GCC.rar,GCC下UCGUI3.98版移植源码工程,涉及到Makefile的编写,编译器、链接器、标准库等的设置,对了解编译工具的原理有一定的帮助,可供参考。

http://pan.baidu.com/s/1mg3EdxI


关键字:S3C2416  裸机开发  GCC  UCGUI  移植 引用地址:S3C2416裸机开发系列十四_GCC下UCGUI的移植(2)

上一篇:S3C2416裸机开发系列十五_GCC下uCOS的移植(1)
下一篇:S3C2416裸机开发系列十四_GCC下UCGUI的移植(1)

推荐阅读最新更新时间:2024-03-16 15:24

Linux-2.6.14内核在S3C2410上的移植
2.4内核由于本身并不支持2410,移植起来较为烦琐,所以直接上2.6的版本. 1.准备工作 下载解压交叉编译工具,2.6的内核编译要用3.4.1版本的(arm-linux-gcc-3.4.1)ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2 下载解压2.6.14.1内核 ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ . 之前文章已经说明不再赘述. 2.Flash分区管理 启动开发板,进入vivi,查看vivi的分区信息. 分区信息如下所示: 分区 起始地址 分区大小
[单片机]
3D打印肝脏“补丁”可延长移植患者寿命一两年
  在短短三年内,等待肝移植的患者可能能够捐赠健康细胞,并将它们通过 3D打印 机复制成可以延长其寿命的美元大小的组织。下面就随医疗电子小编一起来了解一下相关内容吧。 3D打印肝脏“补丁”可延长移植患者寿命一两年   位于圣地亚哥的生物打印公司Organovo已经表明,其 3D打印 的肝组织贴片在植入小鼠时继续发挥作用。那么下一步的研究将是人类。   据悉,这家开发生物打印过程的公司有着10年的历史,可以定制生产多种形式的组织,包括微型人体肝组织和肾组织。   Organovo的 3D打印 组织已被用于加速临床前药物测试。传统的测试和开发使用动物或放置在培养皿中的小细胞样品,平均花费12亿美元,需要十几年的时间。成本很高,部
[医疗电子]
Android平台移植应该做两步工作
    Android系统的移植工作的目的是为了在特定的硬件上运行Android系统。在移植的过程中,把握关键要点,减少工作量是一个重要的方面。从工作的角度,通常的方法为,首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序,主要的工作量在硬件抽象层的实现中。为了更好地理解和调试系统,也应该适当地了解上层对硬件抽象层的调用情况。     移植方面主要的工作有两个部分:     Linux驱动     Android系统硬件抽象层     Linux中的驱动工作在内核空间,Android系统硬件抽象层工作在用户空间,有了这两个部分的结合,就可以让庞大的Android系统运行在特定的硬件平台上。     Androi
[嵌入式]
51上移植ucosii的心得
  自嵌进式系统开发以来,很长时间都采用前后台系统软件设计模式:主程序为一个无穷循环,单任务顺序执行。通过设置一个或多个中断来处理异步事件。   这种系统对于简单的应用是可以的,但对于实时性要求比较高的、处理任务较多的应用,就会暴露出实时性差、系统可靠性低、稳定性差等缺点。    μC/OS-II 是一种基于优先级的抢占式多 任务实时操纵系统,包含了实时内核、任务治理、时间治理、任务间通讯同步(信号量,邮箱,消息队列)和内存治理等功能。它可以使各个任务独立工作,互不干 涉,很轻易实现准时而且无误执行,使实时应用程序的设计和扩展变得轻易,使应用程序的设计过程大为减化。而且它内核源代码公然,可移植性强,为编程职员提 供了很好的一
[单片机]
带全速USB接口的PIC18F4550应用设计
引 言 随着USB(Universal Serial Bus)技术的发展,特别是高速(480 Mbps)USB2.0协议的出现,几乎所有的PC外设都可以移植到USB上,所以USB的PC外设的发展空间是巨大的,甚至在不久的将来,USB将完全取代异步串口和打印机并口,PC机厂商将不会再生产机箱上带异步串口和打印机并口的PC机了,机箱上也不会再有那么多的连线了。 USB是一种快速的、双向同步传输的、廉价并可以进行热插拔的串行接口。利用USB总线技术,开发适用于科学研究和工业牛产的各种仪器仪表设备,借以取代传统计算机测控系统中采用串行RS232或并行接口的仪器仪表设备,使计算机测控系统更加高效实时,方便灵活。 利用USB总线的数据采
[单片机]
OpenCV2.0.0移植到ARM9(五)(JZ2440----S3c2440)
Linux系统:Ubuntu9.10 交叉编译器:arm-linux-gcc-4.3.2(已安装) Qt:qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-linux-opensource-src-4.5.3.tar.gz 1、安装Qt Qt下载地址:https://www.qt.io/download-open-source/ 这里下载的安装包为:qt-embedded-linux-opensource-src-4.5.3.tar.gz(大小123MB) 2、安装Qt-x11 将qt-x11-opensource-src-4.5.3.tar.gz包放到U
[单片机]
OpenCV2.0.0<font color='red'>移植</font>到ARM9(五)(JZ2440----S3c2440)
ARM裸机开发笔记1(指令简介)
1.非常简单的ARM程序: arm.s文件内容 AREA Example,CODE,READONLY ;声明代码段 AREA:定义代码段 Example是代码段名称CODE:代码段关键字READONLY:只读关键字 ENTRY ;相当于C程序中的main函数,标识程序的入口 CODE32 ;使用32位指令集 START MOV R0,#1 ;具体的汇编指令 MOV R0,#0
[单片机]
stm32+ucos+ucgui 中edit框读取AD值以十进制显示
初始化 case WM_INIT_DIALOG: hEdit0 = WM_GetDialogItem(hDlg, GUI_ID_EDIT0); //创建Dialog hRadio = WM_GetDialogItem(hDlg, GUI_ID_RADIO0); //创建Dialog //EDIT_SetDecMode(hEdit0, 0, 0, 5000, 0, 0); /* Select decimal mode */ EDIT_SetMaxLen(hEdit0,4); //此句要进行设置edit 默认显示3位数 //WM_DisableWindow(hItem); RADIO_SetVa
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved