MiniGUI Porting Guide for ThreadX
{width="2.234027777777778in" height="1.3743055555555554in"}
MiniGUI for ThreadX
移植指南[[]{#_Toc93915436 .anchor}]{#_Toc93915400 .anchor}
目 录
[]{#_Toc95185263 .anchor}1. 前提
[]{#_Toc95185264 .anchor}1.1 用户要求
在进行移植前要求用户有以下知识基础:
掌握在ARM ADS1.2集成开发环境中如何编写程序和进行工程设置。
掌握ARM ADS1.2的编译过程。
掌握ADS编译器相关术语的含义。
了解ThreadX操作系统的核心概念和主要接口的用法。
了解MiniGUI的基本原理和应用程序的编写。
了解posix线程接口功能。
[]{#_Toc95185265 .anchor}1.2 移植环境
硬件:VisualFone ANVIL开发板,Trace32调试器,PC机
操作系统:
目标机:ThreadX
宿主机:Windows XP
软件:ADS1.2 , Trace32 ICD ARM Podpar , MiniGUI
[]{#_Toc95185266 .anchor}1.3 相关文档
MiniGUI for ThreadX详细设计
MiniGUI编程指南
[]{#_Toc95185267 .anchor}2. MiniGUI与ThreadX
MiniGUI 软件架构的设计充分考虑了可移植性,核心的主要结构包括消息处理、窗口管理和图形绘制等主要模块都是建立在得到广泛支持的POSIX线程库接口的基础之上;其次,MiniGUI通过操作系统和硬件抽象层(porting layer)隐藏了特定操作系统及底层硬件的细节,这大大减轻了MiniGUI移植到不同操作系统和硬件平台的工作量。
ThreadX操作系统是一实时操作系统,它提供了一套自己的线程接口供用户使用,但对标准posix线程接口部分中的线程局部存储(Thread-specific Data)和线程属性等部分不支持,具体接口对照可参见下表1。
ThreadX POSIX Thread 实现方法
N/A pthread_attr_init 自定义 pthread_attr_t 类型(结构)实现相关接口。pthread_attr_t 接口中的参数,将控制通过 pthread_create 函数创建的 ThreadX 任务的相关属性。
pthread\_attr\_destroy 本实现还需定义 struct sched\_param 结构,用来定义 ThreadX 操作系统任务的调度参数(抢占阈值、优先级、时间片)。
pthread\_attr\_setstackaddr ThreadX 仅支持 FIFO 调度策略,因此 不必实现 pthread\_attr\_setinheritsched、pthread\_attr\_getinheritsched、pthread\_attr\_setschedpolicy 和pthread\_attr\_getschedpolicy 接口。
pthread\_attr\_getstackaddr
pthread\_attr\_setstacksize
pthread\_attr\_getstacksize
pthread\_attr\_setdetachstate
pthread\_attr\_getdetachstate
pthread\_attr\_setschedparam
pthread\_attr\_getschedparam
tx_thread_create pthread_create 根据线程属性的定义,创建底层操作系统任务。
tx_thread_terminate pthread_exit
N/A pthread_self 线程管理函数,无对应底层服务,需自行实现。
pthread\_equal
pthread\_join
pthread\_detach
tx_thread_preemption_change, tx_thread_priority_change, tx_thread_time_slice_change pthread_setschedparam 运行中修改任务的调度参数( 抢占阈值、优先级、时间片 )。通过调用相关操作系统服务完成。
pthread\_getschedparam
N/A pthread_once 一次执行函数,无对应操作系统服务,需自行实现。
N/A pthread_key_create 线程局部存储,无对应操作系统服务,需自行实现。
pthread\_key\_delete
pthread\_setspecific
pthread\_getspecific
N/A pthread_setcancelstate 线程取消相关函数,无对应操作系统服务,需自行实现。
pthread\_setcanceltype
pthread\_cancel
pthread\_testcancel
pthread\_cleanup\_push
pthread\_cleanup\_pop
N/A pthread_mutexattr_init pthread_mutexattr_t 类型自行定义。
pthread\_mutexattr\_destroy 互斥锁属性。ThreadX 上的 PThread 互斥锁,只能是递归锁,可控制属性仅包括是否继承优先级。
pthread\_mutexattr\_setpriorityinherit
pthread\_mutexattr\_getpriorityinherit
tx_mutex_create pthread_mutex_init pthread_mutex_t 结构类型定义由与TX_MUTEX结构相同的一变量 和名字段两部分组成。
PThread 互斥锁接口可和相应的 ThreadX 互斥锁接口一一对应实现。
tx_mutex_get pthread_mutex_lock
tx_mutex_get pthread_mutex_trylock
tx_mutex_put pthread_mutex_unlock
tx_mutex_delete pthread_mutex_destroy
tx_semaphore_create sem_init sem_t 结构类型定义为由与TX_SEMAPHORE结构相同的一变量 和名字段两部分组成。
PThread 信号量接口可和相应的 ThreadX 信号量接口一一对应实现。
不实现命名信号量相关接口(sem\_open和sem\_close)
tx_semaphore_put sem_post
tx_semaphore_get sem_wait
tx_semaphore_get sem_trywait
tx_semaphore_delete sem_destroy
tx_semaphore_info_get sem_getvalue
表1
又ThreadX中无errno的定义,所以MiniGUI到ThreadX的移植工作主要有下面几点:
自定义errno。
线程接口部分,除条件变量部分外均需实现。实现方法在表1中已经列出。
内存管理和I/O相关接口部分。因ThreadX对malloc/free和printf/fprintf/sprintf等函数接口不支持。
图形引擎和输入引擎部分。针对硬件平台设计相应的引擎。
[]{#_Toc95185268 .anchor}3. 移植
[]{#_Toc95185269 .anchor}3.1 获取MiniGUI源码
1)在Windows下打开相应宏定义:
拷贝minigui03/build/config-ucosii-s3c2410-1.h至minigui03目录,并改名为config.h。在此文件中添加如下语句:
/* Define if compile for ThreadX */
#define __THREADX__ 1
/* Define for target VisualFone ANVIL1.1 */
#define __TARGET_VFANVIL__ 1
//
#define _VFANVIL_IAL 1
2)config.h中主要配置选项说明:
使用auto输入引擎。Auto引擎在没有键盘等输入设备时可以用来模拟键盘和鼠标的输入,该引擎自动地产生键盘和鼠标的输入事件,在移植或测试时非常有用。如果在release版本使用键盘或触摸屏作为输入设备,就可以把该支持去掉。
/* Define if include the automatic IAL engine */
#define _AUTO_IAL 1
使用dummy输入引擎。该引擎什么也不干,在没有其它引擎时,使用该引擎可以使MiniGUI正常运作和显示,但是没有输入,主要用于移植和测试。
/* Define if include the dummy IAL engine */
#define _DUMMY_IAL 1
内嵌式资源支持。
/* Define if build MiniGUI with incore resources */
#define _INCORE_RES 1
GB2312中文字符集支持。如果要使用中文的话,必须打开该选项。
/* Define if support GB2312 charset */
#define _GB_SUPPORT 1
下面分别是英文16点阵、中文12和16点阵字体(宋体)的支持,如果要使用某种字体,必须把对应的选项打开。英文12点阵字体的支持是默认的,不用配置。要注意的是,使用中文字体时,还必须打开 _GB_SUPPORT 中文支持选项。
#define _INCORERBF_LATIN1_16 1
#define _INCORERBF_GB12 1
#define _INCORERBF_GB16 1
RBF字体支持,必须打开。上述字体都是RBF字体。
#define _RBF_SUPPORT 1
内存管理函数malloc等的支持。必须打开该选项。
/* Define if use own implementation of malloc functions */
#define _USE_OWN_MALLOC 1
I/O函数支持。
/* Define if use own implementation of stdio functions */
#define _USE_OWN_STDIO 1
ThreadX操作系统必须打开该选项。
/* Define if compile for non-Linux like ThreadX */
#define __NOLINUX__ 1
ThreadX操作系统必须打开该选项。
/* Define if compile for ThreadX*/
#define __THREADX__ 1
ANVIL开发板需打开该选项。
/* Define for target VisualFone ANVIL1.1 */
#define __TARGET_VFANVIL 1
针对ADS编译器的选项,使用ADS编译器时必须打开。
#define inline __inline
针对ADS编译器若有locale.h,需打开此项。
/* Define to 1 if you have <locale.h> header file. */
#define HAVE_LOCALE_H 1
使用minigui_entry入口时,需打开此项。
#define _USE_MINIGUIENTRY 1
针对256色彩屏的选项:
使用newgal图形引擎。Newgal图形引擎支持8位色及以上的显示。
/* Define if use new GAL interfaces */
#define _USE_NEWGAL 1
使用newgal中的dummy引擎。
/* Define if use dummy newgal engine */
#define NEWGAL_ENGINE_DUMMY 1
[]{#_Toc95185270 .anchor}3.2 errno定义
因多个文件都有用到errno的值,故在minigui03/include/common.h中定义errno。
#ifdef __CC_ARM
# define ENOMEM 200
# define EINVAL 201
# define EBUSY 202
# define EAGAIN 203
# define ESRCH 204
# define EDEADLK 205
# define ENOTSUP 206
# define ENOSYS 207
#endif
[]{#_Toc95185271 .anchor}3.3 posix线程实现
除条件变量外所有的posix线程接口均需通过ThreadX相应接口封装或重新实现。故需创建下面几个文件置于对应路径下:
include/ threadx_pthread.h threadx_semaphore.h src/libc/ threadx_pprivate.h src/libc threadx_pthread.c、threadx_mutex.c、threadx_pprivate.c和threadx_sem.c
1)头文件定义
在相应的头文件中需声明相关结构体、宏定义和函数接口。
结构体
a. 结构体sched_param
定义可参照如下所示:
struct sched_param
{
UINT priority;
UINT preempt_threshold;
ULONG time_slice;
};
b. 结构体pthread_attr_t
结构定义同src/libc/ucos2-pprivate.h中的pthread_attr_t定义。pthread_info定义须与TX_PTHREAD一致。
c. 结构体pthread_mutex_t
定义可参照如下所示:
typedef struct _pthread_mutex_t
{
TXPTH_MUTEX tx_mutex;
char name [TXPTH_LEN_NAME];
} pthread_mutex_t;
TXPTH_MUTEX类型完全同与TX_MUTEX,TXPTH_LEN_NAME为定义的默认名称长度。
d. 结构体pthread_mutexattr_t
定义可参照如下所示:
typedef struct _pthread_mutexattr_t
{
unsigned int prio_inherit;
} pthread_mutexattr_t;
e. 结构体sem_t
类型的定义采用如下所示:
typedef struct _sem_t
{
TX_SEMAPHORE tx_sem;
char name [TXPTH_LEN_NAME];
} sem_t;
宏定义
a. 主线程中支持的最多线程数(64),默认优先级(21),阈值(21),时间片(10);
b. 任务栈所占空间大小(约为400K)线程优先级范围(0~31),
c. 线程的默认堆栈大小(4K);默认的线程优先级(20),阈值(20),时间片(10);
以上默认值可由移植者自己来定。下面所列宏定义可供参考:
//threadx_pprivate.h
#define TXPTHNUM_POSIX_PTHREAD_THREADS_MAX 64
#define TXPTHNUM_LIBC_MAIN_DEFAULT_STACK_SIZE (1024 * 4)
#define TXPTH_THREAD_MIN_PRIORITY 31
#define TXPTH_THREAD_MAX_PRIORITY 0
#define TXPTH_THREAD_DEF_PRIORITY 20
#define TXPTH_THREAD_DEF_PREEMPT_THRESHOLD 20
#define TXPTH_THREAD_DEF_TIME_SLICE 10
#define TXPTH_POSIX_MAIN_DEF_PRIORITY 21
#define TXPTH_POSIX_MAIN_DEF_PREEMPT_THRESHOLD 21
#define TXPTH_POSIX_MAIN_DEF_TIME_SLICE 10
#define TXPTH_SIZE_BYTE_POOL ((PTHREAD_STACK_DEFAULT + sizeof (pthread_info) + (1024*2)) * TXPTHNUM_POSIX_PTHREAD_THREADS_MAX)
#define TXPTH_NAME_BYTE_POOL "BytePool4PThreads"
#define TXPTH_NAME_MUTEX "Mutex4PThreads"
#define PTHREAD_TX_PRIORITY(pri) (TXPTH_THREAD_MIN_PRIORITY-(pri))
#define PTHREAD_POSIX_PRIORITY(pri) (TXPTH_THREAD_MIN_PRIORITY-(pri))
//threadx_pthread.h
#define PTHREAD_STACK_MIN (1024*2)
#define PTHREAD_STACK_DEFAULT (1024*4)
#define PTHREAD_KEYS_MAX 64
posix线程相关函数接口
2)实现文件
ThreadX中的各函数均有名字段变量,该段值不可重复,而在posix中无此段,故需创建一实现唯一名称的函数供线程所有实现函数使用,该函数实现含在threadx_pprivate.c中。
除了标准posix线程接口实现外,为了调用MiniGUI主程序入口,还需创建一函数(如txpth_posix_pthread_start)来实现主线程的创建,MiniGUI所有其它程序均在此主线程下运行。该主线程完成诸如开辟缓冲池,初始化全局互斥锁和全部线程的局部存储表以及主线程的各相关值,最后创建主线程。
线程具体实现可参考ucosii相关文件源代码或ecos-2.0中线程的相关实现。具体细节也可参考详细设计文档。
[]{#_Toc95185272 .anchor}3.4 内存管理和相关I/O接口
1)内存管理
内存管理相关的函数接口定义在 include/own_malloc.h头文件中,具体的实现文件是 src/libc/malloc.c。malloc.c文件中实现了 malloc、free、calloc和realloc等堆内存管理的函数。这些函数的接口定义和使用方法和标准C中定义的是一样的。
int threadx_malloc_init (void);
MiniGUI for ThreadX在该部分需增加ThreadX下的相关函数实现,具体可参照该文件ucosii部分的代码。另外此部分增加一接口int minigui_tx_malloc_init (unsigned char* heap, unsigned int heap_size),此函数实现分配一块堆栈首址为heap,大小为heap_size内存块。该接口为应用开辟一块运转的空间。在使用这些内存管理函数之前必须首先调用minigui_tx_malloc_init函数进行系统的初始化,我们一般必须在使用minigui的相关函数之前调用该函数进行堆内存管理模块的初始化,因为minigui用到了动态内存分配函数。
2)I/O接口
I/O接口部分相应的自定义接口实现在文件libc/defdev.c 中。
static int def_seek (MG_RWops *context, int offset, int whence)
static int def_read (MG_RWops *context, void *ptr, int size, int maxnum)
static int def_write (MG_RWops *context, const void *ptr, int size, int num)
static int def_ungetc (MG_RWops *context, unsigned char c)
static int def_close (MG_RWops *context)
static int def_eof (MG_RWops *context)
MG_RWops __mg_def_dev = {def_seek, def_read, def_write, def_ungetc, def_close, def_eof, RWAREA_TYPE_UNKNOWN};
针对ThreadX需对def_write(), def_read()等一系列函数重新实现。具体方式可通过串口驱动的serial_read()和serial_write()完成相应功能。
[]{#_Toc95185273 .anchor}3.5 图形和输入引擎
1)图形引擎
MiniGUI for ThreadX的图形引擎文件可基于现有的LCD图形引擎comm2lcd修改来得到,该图形引擎的相关文件位于 src/newgal/commlcd/ 目录下,包括commlcd.c和commlcd.h文件。
commlcd 引擎定义了统一的两个由底层驱动程序提供的LCD函数接口,如下:
int drv_lcd_init (void);
int lcd_getinfo (struct lcd_info *li);
drv_lcd_init函数用来进行LCD的初始化,drv_lcd_getinfo函数用来获取LCD的相关信息,其中lcd_info结构的定义如下:
struct lcd_info {
short height, width; // 屏幕的高和宽
short bpp; // 位深度(bits per pixel)
short type; // 象素类型
short rlen; // 每行象素所占用的字节数
void *fb; // Frame buffer 的起始地址
};
把MiniGUI 移植到基于ThreadX的ANVIL开发板上时,LCD驱动或者应用程序必须实现这两个函数所具有的功能。
LCD驱动提供的类似函数接口如下:
SINT32 tp_man_lcd_init(VOID);
SINT32 tp_man_lcd_get_info(MAN_LCD_SCREEN *screen);
在commlcd.h中定义下面的映射语句:
#define drv_lcd_init tp_man_lcd_init
#define drv_lcd_getinfo tp_man_lcd_get_info
typedef MAN_LCD_SCREEN lcd_info;
#define FB_TRUE_RGB565 1;
2)输入引擎
MiniGUI for ThreadX的输入引擎可基于现有的输入引擎comm2ial做相应修改,该引擎的相关文件位于 src/ial/ 目录,包括comminput.c和comminput.h文件。
commial引擎需要操作系统或者底层键盘驱动提供如下的二个相似函数功能的接口:
int comm_kb_getdata (short *key, short *status);
int comm_wait_for_input (void);
comm_wait_for_input函数用来查询是否有输入数据。如果没有输入事件的话,该函数返回0;如果有鼠标或触摸屏事件的话,返回值的第1位置1;如果有键盘事件的话,返回值的第2位置1。
comm_kb_getdata函数用来获取键盘的输入数据,key返回键盘的keycode,status返回按键状态(1表示键按下)。comm_kb_getdata获取数据成功时应该返回0,否则返回负值。这里的keycode是指MiniGUI中定义的键盘各按键的键码(参考 include/common.h中定义的scancode),底层驱动键盘驱动程序需要在收到键盘的扫描码(scancode)时,把scancode转换为对应的keycode(MiniGUI定义的scancode)返回。
MiniGUI中外部事件的输入处理作为一个单独的系统线程存在,在没有外部事件时,该线程应该进入睡眠。所以,驱动实现comm_wait_for_input函数时需要提供一个等待机制,如信号量或者其它事件。comm_wait_for_input函数中查询是否有输入数据时等待一个输入信号量,让调用该函数的MiniGUI输入任务进入睡眠,有输入时由底层驱动程序(中断处理程序)发出信号唤醒该任务。comm_kb_getdata函数直接返回输入数据。
键盘驱动提供的两个函数接口如下:
SINT32 tp_man_kp_get_data(MAN_KP_INFO *kp);
SINT32 tp_man_kp_wait(UINT32 timeout); /*timeout 单位:ms,粒度:10ms*/
需建立一文件threadx-kbdrv.c,在该文件中实现驱动扫描码与MiniGUI扫描码的映射函数和下面两函数。
int comm_kb_getdata (short *key, short *status);
int comm_wait_for_input (void);
另需在comminput文件中增加相应语句:
#if defined __THREADX__ && defined __VFANVIL__
#include "threadx_kbdrv.c"
#endif
3)添加配置文件
为了使上述引擎针对ThreadX生效,需定义一配置文件mgetc_threadx.c。该文件定义可参照其它mgetc-*.c文件。mgetc-threadx.c文件中定义ThreadX使用的输入和图形引擎、屏幕分辨率和颜色、字体等配置属性。下面是一定义范例。
static char *SYSTEM_VALUES[] = {"commlcd", "comm", "/dev/mouse", "IMPS2"};
static char *FBCON_VALUES[] = {"320x240-16bpp"};
static char *SYSTEMFONT_KEYS[] =
{"font_number", "font0", "default", "wchar_def", "fixed", "caption", "menu", "control"};
static char *SYSTEMFONT_VALUES[] =
{
"1","rbf-fixed-rrncnn-6-12-ISO8859-1",
"0", "0", "0", "0", "0", "0"
};
SYSTEM_VALUES的前两项分别指定图形引擎和输入引擎,在ThreadX版本中默认是commlcd通用图形引擎和comm通用输入引擎,一般不需要修改。后面的两项针对使用鼠标的输入引擎。
FBCON_VALUES指定LCD的屏幕分辨率和颜色深度,需要根据实际的LCD分辨率大小和颜色进行调整,对应于ANVIL开发板就是320x240-16bpp。
SYSTEMFONT_KEYS和SYSTEMFONT_VALUES项定义了MiniGUI使用的系统字体,可根据实际需要修改。
定义好图形和输入引擎后需在mgetc.c文件的相应位置加入如下代码。
#include "mgetc-threadx.c"
[]{#_Toc95185274 .anchor}3.6 ThreadX下启动MiniGUI的入口
#include "tx_api.h"
#include "serial.h"
#include "common.h"
#include "pthread.h"
#define MY_HEAP_SIZE (2*1024*1024)
static unsigned char my_heap [MY_HEAP_SIZE];
extern int minigui_tx_malloc_init (unsigned char* heap, unsigned int heap_size);
extern int minigui_entry (int argc, const char* argv[]);
void main_enter()
{
serial_init(baud_57600);
tx_kernel_enter();
}
void tx_application_define (void *first_unused_memory)
{
if (minigui_tx_malloc_init (my_heap, MY_HEAP_SIZE))
printf ("Can not init minigui heap.\n");
txpth_posix_pthread_start (minigui_entry);
}
[]{#_Toc95185275 .anchor}4. ADS1.2中编译MiniGUI库
[]{#_Toc95185276 .anchor}4.1 ADS1.2中MiniGUI库工程的建立
1)建立工程文件
ADS1.2环境下:
File ->New->Project下选择ARM Object Library,输入工程名(例:libminigui),选择工程保存路径,确定。
2)向工程中添加以下文件
文件夹 > 文件名 minigui03/src/newgdi > tga.c advapi.c arc.c attr.c bitmap.c clip.c coor.c drawtext.c flood.c gdi.c generators.c icon.c line.c logfont.c map.c miarc.c midash.c mifillarc.c mifpolycon.c mispans.c miwideline.c palette.c pcx.c pixel.c pixel_ops.c polygon.c readbmp.c rect.c region.c screen.c text.c minigui03/src/newgal > blit.c blit_0.c blit_1.c blit_A.c blit_N.c gamma.c newgal.c pixels.c RLEaccel.c stretch.c surface.c video.c minigui03/src/newgal/dummy > nullvideo.c minigui03/src/main > main.c minigui03/src/sysres > resource.c syscfg.c mgetc.c minigui03/src/mybmp > winbmp.c lbm.c mybmp.c gif.c minigui03/src/misc > about.c clipboard.c endianrw.c math3d.c math.c misc.c nposix.c rwops.c systext.c minigui03/src/libc > fnprintf.c fprintf.c fscanf.c printf.c scanf.c snprintf.c sscanf.c stdioinlines.c vfnprintf.c vfscanf.c malloc.c defdev.c threadx_mutex.c threadx_pprivate.c threadx_pprivate.h threadx_p thread.c threadx_sem.c ieeefp.h vsnprintf,c vsscanf.c minigui03/src/ial > ial.c auto.c comminput.c dummy.c minigui03/src/gui > window.c accelkey.c caret.c ctrlclass.c defkeymap.c dialog.c element.c keyboard.c menu.c minigui03/src/font > varbitmap.c big5unimap.c charset.c devfont.c euckrunimap.c fontname.c freetype2.c freetype.c gb18030unimap.c gbkunimap.c gbunimap.c jisunimap.c qpf.c rawbitmap.c sjisunimap.c sysfont.c type1.c ujisunimap.c minigui03/src/font/in-core > 8*16-iso8859-1.c song-12-gb2312.c song-16-gb2312.c 6*12-iso8859-1.c courier_8*13.c sansserif_11*13.c minigui03/src/kernel > fixstr.c init.c message.c timer.c blockheap.c cursor.c desktop.c event.c minigui03/src/control > button.c combobox.c ctrlmisc.c edit.c listbox.c menubutton.c newtoolbar.c progressbar.c propsheet.c scrolled.c scrollview.c scrollwnd.c simedit.c static.c textedit.c toolbar.c trackbar.c listmodel.c 扩展库部分: > (可根据需要增加相应扩展程序) minigui03/ext/mywins > colordlg.c colorspace.c filedlg.c helpwin.c mywindows.c newfiledlg.c minigui03/ext/skin > bmplabel.c chkbutton.c cmdbutton.c label.c mgcontrol.c rotslider.c skin.c slider.c minigui03/ext/control > treeview.c animation.c coolbar.c initmgext.c listview.c monthcalendar.c spinbox.c minigui03/ext/image > gif.c
最终minigui工程视图如图4.1所示:
{width="4.095833333333333in" height="3.542361111111111in"}
图4.1 minigui库的工程视图
其中libmgext.mcp为扩展库工程,该工程视图如图4.2所示:
{width="3.404166666666667in" height="2.5in"}
图4.2 mgext库的工程视图
3)工程选项设置
Edit->DebugRel Settings->Language Settings中的ARM C Compiler设置中必包含的选项
-Ec -D__MINIGUI_LIB__
Edit->DebugRel Settings->Target下Access Paths的System Paths中需添加工程的头文件所在目录。
4)make工程生成libtxMiniGUI.a文件
[]{#_Toc95185277 .anchor}4.2 基于ThreadX编译MiniGUI应用程序
1)ADS1.2下建立应用程序工程
File ->New->Project下选择ARM Executable Image,输入工程名(例:helloworld),选择工程保存路径,确定。
2)添加工程所需文件
示例程序 > helloworld.c ThreadX相应驱动程序 > serial.h serial-driver.c serial.c dt_main_init.s dt_stackheap.s tx_ill.s 链接库文件 > libthreadx.a libtxMiniGUI.a ThreadX头文件(放于include下的tx目录中)和MiniGUI头文件(放于include下的minigui目录中)
3)工程选项设置
Edit->DebugRel Settings->Target->Access Paths的System Paths中需添加库文件所在目录及头文件所在目录。
Edit->DebugRel Settings->Language Settings的ARM Assembler设置
-keep -PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" -g -PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" -apcs /interwork
Edit->DebugRel Settings->Language Settings的ARM C Compiler设置
-O0 -Otime -g+ -apcs /interwork -DTX_ENABLE_FIQ_SUPPORT
Edit->DebugRel Settings->Linke的ARM Linker设置
-info totals -entry __tx_start -scatter 工程路径\scatter_ram.scf
make工程,生成可执行映象文件。
[]{#_Toc95185278 .anchor}4.3 可执行映象下载到RAM中的调试
1)ANVIL板上电,打开Trace32。
将Trace32软件中CPU->System Setting的Mode置为Up(即为上电模式)。
2)装载映象文件至RAM
File->Load选择需装载的映象文件。
3)调试
运行Run菜单下相应选项,可单步或断点调试。
[]{#_Toc95185279 .anchor}4.4 可执行映象下载到Flash中调试
1)设置跳线和串口。
ANVIL板上电。
FlashLoader设置
选 项 > 值 Com port > COM1 Platform > Monaco Destination Type > Flash Address > 0x01000000
选择Phone code ,即要装载的映象文件。Start开始装载。当Status栏出现Waiting for sync时,按ANVIL板上的复位按钮,获取同步信息。当Status显示为Done时完成下载。映象文件启动。
Last updated