MINIGUI在S3C2410开发板的移植

作者在 2009-07-02 10:09:37 发布以下内容
MINIGUI在S3C2410开发板的移植2009-4-15 2:25:00

1 引言
    自 MiniGUI 从 1998 年底推出以来,越来越多的人开始选择 MiniGUI 在 Linux 上开发实时嵌入式系统。MiniGUI 系统也逐渐成熟,应用到各种嵌入式系统中,包括PDA、机顶盒、DVD、MP4播放器等。本文讲解基于 Linux 和 MiniGUI 的嵌入式系统软件开发,,其内容不仅仅限于 MiniGUI 的编程,还会涉及到一些 Linux 下嵌入式系统软件开发的技巧,包括交叉编译环境的建立,根文件系统的生成等。

2  图形用户界面MiniGUI简介
    MiniGUI 是由北京飞漫软件技术有限公司拥有版权并主持和维护的自由软件,遵循 GPL 条款发布(1.2.6及之前的版本以LGPL条款发布),其目标是为实时嵌入式 Linux/uClinux、eCos、uC/OS-II、VxWorks 等操作系统建立一个快速、稳定和轻量级的图形用户界面支持系统。与QT/Embeddoed、MicoroWindows等其他GUI相比,MiniGUI最大的特点是占用资源少,在主频为66M的ARM7内核也能够稳定的运行。经过几年的发展已经发布了很多的版本,现在比较稳定的是1.6.x版本,而且源码是开放的,方便我们大家学习的研究。本文就是采用的此版本。

3 MiniGUI在S3C2410开发板上的移植过程
3.1 MiniGUI运行的环境的搭建
      在 Linux/uClinux 上运行,要求 Linux Buffer 驱动程序的功能正常。在 PC 上,如果显示芯片是 VESA 兼容的,则可以通过 Linux 的 VESA Buffer 驱动程序获得较好的支持。对没有 Buffer 支持的 Linux/uClinux 系统,需要编写特定的图形引擎才能运行 MiniGUI。MiniGUI 1.6.x 中已包含了针对非 Buffer 驱动的图形引擎实现,另外在没有 Buffer支持的系统上运行也可以借助虚拟软件实现相同的功能,在这里只是在有Buffer支持的linux操作系统上的 MiniGUI的移植。用到的交叉编译工具链是cross-2.95.3.tar.bz2交叉编译器是arm-linux-gcc2.95.3,这些工具软件通常在网上下载或是由硬件供应商会提供。在这里需要注意的是开发板上的linux的glibc的版本一定要和cross-2.95.3.tar.bz 中的glibc一致,我们使用的是glibc-2.2.3。

3.2 交叉编译MiniGUI
首先,从网上下载三个源码包(http://www.minigui.org/),同时可以下载到相应的用户手册。

libminigui-1.6.x.tar.gz:MiniGUI 函数库源代码,其中包括libminigui、libmgext 和 libvcongui。
minigui-res-1.6.tar.gz: MiniGUI 所使用的资源, 包括基本字体、图标、位图和鼠标光标。
mg-smaples-1.6.x.tar.gz:《MiniGUI 编程指南》的配套示例程序。
先安装MiniGUI的函数库,我们先在PC的根目录下建立一个名为minigui的目录,将下载的三个源码包全部复制到minigui目录下,再在minigui目录下建立一个名为miniguitmp的目录,用来存放生成的文件和minigui库函数。
解压libminigui-1.6.x.tar.gz(tar zxf libminigui-1.6.x.tar.gz )
生成libminigui-1.6.x.目录,编写脚本文件配置lib内容如下:

./configure—host=arm-unknown-linux—enable=jpgsupport=no
--enable-pngsupport=no—enable-gifsupport=no –disable-lite
--prefix=/minigui/miniguitmp –enable-smdk2410ial=yes

保存为setup.sh
host用于指明宿主机的类型disable-lite用来指定生成基于线程的minigui版本而不是生成基于进程的minigui版本prefix用于指定MiniGUI函数库的安装路径/minigui/miniguitmp
进入该目录运行./configure脚本文件,我们为了适合我们的开发板做了适当的修改,其他的开发板类似。
根据PC机的交叉编译环境安装的路径修改libminigui-1.6.x.目录下的configure文件,在文件的开头处加入编译器的安装路径,然后保存,笔者主机上交叉编译器安装路径是/usr/local/arm/,所以修改如下:

CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc
CPP=/usr/local/arm/2.95.3/bin/cpp
LD=/usr/local/arm/2.95.3/bin/arm-linux-ld
AR=/usr/local/arm/2.95.3/bin/arm-linux-ar
RANLIB=/usr/local/arm/2.95.3/bin/arm-linux-ranlib
STRIP=/usr/local/arm/2.95.3/bin/arm-linux-strip

然后运行脚本文件
./ setup.sh
make
make install
如果运行成功,就会生成定制的MakeFile文件,执行make和make install 后相应的函数库就安装到/minigui/miniguitmp/lib下,在执行make install命令是用户一定要具有root权限。

下面安装MiniGUI资源,这些资源包括基本字体、图标、位图和鼠标光标等等。解压minigui-res- 1.6.tar.gz(ar zxf minigui-res-1.6.tar.gz),进入生成目录,修改configure.linux文件,指明TOPDIR= /minigui162/miniguitmp
执行
make install
就可以把相关文件拷贝到/minigui/miniguitmp/目录下的相关目录中去。
执行后会在/minigui/miniguitmp/ 下生成usr/local/lib/minigui/res 相关目录,以下为res目录下的子目录,用户有兴趣可以进入以下目录查看其中的内容。
bmp 
cursor 
font 
icon 
ib

3.3 制作带有MiniGUI的文件系统映象(root_minigui.cramfs)

资料 | 阅读 5362 次
文章评论,共2条
vfdff(作者)
2009-07-02 13:23
1
 1 引言<br />
  <br />
  到目前为止,MiniGUI 的最新发布版本是 0.9.96。我们将 0.9.xx 系列版本定位为 MiniGUI 1.0 版本的预览版。在 0.9.xx 版本足够稳定时,我们将发布 MiniGUI 1.0 版本,同时,目前的代码不会再进行重大调整。在 MiniGUI 1.0 版本发布之后,我们将立即着手开发 MiniGUI 2.0 版本。该版本预期将在体系结构上进行重大调整。为了吸引更多的自由软件程序员加入 MiniGUI 2.0 的开发,也为了更好地帮助 MiniGUI 程序员进行程序开发,我们将撰写一系列的文章介绍 MiniGUI 1.0 版本的体系结构,重点分析其中的一些缺点以及需要在 2.0 版本当中进行优化和改造的地方。介绍体系结构的文章计划如下:<br />
  <br />
  体系结构概览(本文)。将在整体上对 MiniGUI 1.0 的体系结构进行介绍。重点包括:线程的基本概念;多线程的微客户/服务器体系、多线程通讯的关键数据结构――消息队列;面向对象技术在 MiniGUI 中的应用等等。 <br />
  MiniGUI 的多窗口管理。将介绍 MiniGUI 的多窗口机制以及相关的窗口类技术。其中涉及到窗口剪切处理和 Z 序,消息传递,控件类设计和输入法模块设计等等。 <br />
  MiniGUI 的图形设备管理。重点介绍 MiniGUI 是如何处理窗口绘制的。其中主要包括图形上下文的概念,坐标映射,图形上下文的局部、全局和有效剪切域的概念等等。 <br />
  图形抽象层和输入抽象层。图形抽象层(GAL)和输入抽象层(IAL)大大提高了 MiniGUI 的可移植性,并将底层图形设备和上层接口分离开来。这里将重点介绍 MiniGUI 的 GAL 和 IAL 接口,并以 EP7211 等嵌入式系统为例,说明如何将 MiniGUI 移植到新的嵌入式平台上。 <br />
  多字体和多字符集支持。MiniGUI 采用逻辑字体实现多字体和多字符集处理。这一技术成功应用了面向对象技术,通过单一的逻辑接口,可以实现对各种字符集以及各种字体的支持。 <br />
  2 POSIX 线程<br />
  <br />
  MiniGUI 是一个基于线程的窗口系统。为了理解 MiniGUI 的体系结构,我们有必要首先对线程作一番了解。<br />
  <br />
  2.1 什么是线程 <br />
  线程通常被定义为一个进程中代码的不同执行路线。也就是说,一个进程中,可以有多个不同的代码路线在同时执行。例如,常见的字处理程序中,主线程处理用户输入,而其他并行运行的线程在必要时可在后台保存用户的文档。我们也可以说线程是“轻量级进程”。在 Linux 中,每个进程由五个基本的部分组成:代码、数据、栈、文件I/O 和信号表。因此,系统对进程的处理要花费更多的开支,尤其在进行进程调度和任务切换时。从这个意义上,我们可以将一般的进程理解为重量级进程。在重量级进程之间,如果需要共享信息,一般只能采用管道或者共享内存的方式实现。如果重量级进程通过 fork() 派生了子进程,则父子进程之间只有代码是共享的。<br />
  <br />
  而我们这里提到的线程,则通过共享一些基本部分而减轻了部分系统开支。通过共享这些基本组成部分,可以大大提高任务切换效率,同时数据的共享也不再困难――因为几乎所有的东西都可以共享。<br />
  <br />
  从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。<br />
  <br />
  用户线程指不需要内核支持而在用户程序中实现的线程,这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,但却占用了更多的系统开支。<br />
  <br />
  Linux 支持内核级的多线程,同时,也可以从 Internet 上下载一些 Linux 上的用户级的线程库。Linux 的内核线程和其他操作系统的内核实现不同,前者更好一些。大多数操作系统单独定义线程,从而增加了内核和调度程序的复杂性;而 Linux 则将线程定义为“执行上下文”,它实际只是进程的另外一个执行上下文而已。这样,Linux 内核只需区分进程,只需要一个进程/线程数组,而调度程序仍然是进程的调度程序。Linux 的 clone 系统调用可用来建立新的线程。<br />
  <br />
  2.2 POSIX 线程 <br />
  POSIX 标准定义了线程操作的 C 语言接口。我们可以将 POSIX 线程的接口划分如下:<br />
  <br />
  线程的建立和销毁。用来创建线程,取消线程,制造线程取消点等等。 <br />
  互斥量操作接口。提供基本的共享对象互斥访问机制。 <br />
  信号量操作接口。提供基本的基于信号量的同步机制。不能与 System V IPC 机制的信号量相混淆。 <br />
  条件量操作接口。提供基本的基于条件量的同步机制。尽管信号量和条件量均可以划分为同步机制,但条件量比信号量更为灵活一些,比如可以进行广播,设置等待超时等等。但条件量的操作比较复杂。 <br />
  信号操作接口。处理线程间的信号发送和线程信号掩码。 <br />
  其他。包括线程局部存储、一次性函数等等。 <br />
  目前,Linux 上兼容 POSIX 的线程库称为 LinuxThreads,它已经作为 glibc 的一部分而发布。这些函数的名称均以 pthread_ 开头(信号量操作函数以 sem_ 开头)。<br />
  <br />
  为了对线程有一些感性认识,我们在这里举两个例子。<br />
  <br />
  第一个例子在进入 main () 函数之后,调用 pthread_create 函数建立了另一个线程。pthread_create 的参数主要有两个,一个是新线程的入口函数(thread_entry),另一个是传递给入口函数的参数(data),而新线程的标识符通过引用参数返回(new_thread)。见清单 1。<br />
  <br />
  清单 1 新线程的创建<br />
  <br />
  void* thread_entry (void* data)<br />
  {<br />
     ...  // do something.<br />
     return NULL;<br />
  }<br />
  <br />
  int main (void)<br />
  {<br />
  <br />
    pthread_t new_thread;<br />
    int data = 2;<br />
  <br />
    pthread_create (&amp;new_thread, NULL, thread_entry, &amp;data);<br />
    pthread_join (new_thread, NULL);<br />
  }<br />
  <br />
  main () 函数在建立了新线程之后,调用 pthread_join 函数等待新线程执行结束。pthread_join 类似进程级的 wait 系统调用。当所等待的线程执行结束之后,该函数返回。利用 pthread_join 可用来实现一些简单的线程同步。注意在上面的例子中,我们忽略了函数调用返回值的错误检查。<br />
  <br />
  第二个例子是利用信号量进行同步的两个线程。这里所使用的例子利用信号量解决了经典的“生产者/消费者”问题(清单 2)。我们首先解释信号量的基本概念。<br />
  <br />
  信号量的概念由 E. W. Dijkstra 于 1965 年首次提出。信号量实际是一个整数,进程(也可以是线程)在信号量上的操作分两种,一种称为 DOWN,而另外一种称为 UP。DOWN 操作的结果是让信号量的值减 1,UP 操作的结果是让信号量的值加 1。在进行实际的操作之前,进程首先检查信号量的当前值,如果当前值大于 0,则可以执行 DOWN 操作,否则进程休眠,等待其他进程在该信号量上的 UP 操作,因为其他进程的 UP 操作将让信号量的值增加,从而它的 DOWN 操作可以成功完成。某信号量在经过某个进程的成功操作之后,其他休眠在该信号量上的进程就有可能成功完成自己的操作,这时,系统负责检查休眠进程是否可以完成自己的操作。<br />
  <br />
  为了理解信号量,我们想象某机票定购系统。最初旅客在定票时,一般有足够的票数可以满足定票量。当剩余的机票数为 1,而某个旅客现在需要定两张票时,就无法满足该顾客的需求,这时售票小姐让这个旅客留下他的电话号码,如果其他人退票,就可以优先让这个旅客定票。如果最终有人退票,则售票小姐打电话通知上述要定两张票的旅客,这时,该旅客就能够定到自己的票。<br />
  <br />
  我们可以将旅客看成是进程,而定票可看成是信号量上的 DOWN 操作,退票可看成是信号量上的 UP 操作,而信号量的初始值为机票总数,售票小姐则相当于操作系统的信号量管理器,由她(操作系统)决定旅客(进程)能不能完成操作,并且在新的条件成熟时,负责通知(唤醒)登记的(休眠的)旅客(进程)。<br />
  <br />
  在操作系统中,信号量的最简单形式是一个整数,多个进程可检查并设置信号量的值。这种检查并设置操作是不可被中断的,也称为“原子”操作。检查并设置操作的结果是信号量的当前值和设置值相加的结果,该设置值可以是正值,也可以是负值。根据检查和设置操作的结果,进行操作的进程可能会进入休眠状态,而当其他进程完成自己的检查并设置操作后,由系统检查前一个休眠进程是否可以在新信号量值的条件下完成相应的检查和设置操作。这样,通过信号量,就可以协调多个进程的操作。<br />
  <br />
  信号量可用来实现所谓的“关键段”。关键段指同一时刻只能有一个进程执行其中代码的代码段。也可用信号量解决经典的“生产者/消费者”问题,“生产者/消费者”问题和上述的定票问题类似。这一问题可以描述如下:<br />
  <br />
  两个进程共享一个公共的、固定大小的缓冲区。其中的一个进程,即生产者,向缓冲区放入信息,另外一个进程,即消费者,从缓冲区中取走信息(该问题也可以一般化为 m 个生产者和 n 个消费者)。当生产者向缓冲区放入信息时,如果缓冲区是满的,则生产者进入休眠,而当消费者从缓冲区中拿走信息后,可唤醒生产者;当消费者从缓冲区中取信息时,如果缓冲区为空,则消费者进入休眠,而当生产者向缓冲区写入信息后,可唤醒消费者。<br />
  <br />
  清单 2 中的例子实际是“生产者/消费者”问题的线程版本。<br />
  <br />
  清单 2 利用信号量解决“生产者/消费者”问题<br />
  <br />
  /* The classic producer-consumer example, implemented with semaphores.<br />
    All integers between 0 and 9999 should be printed exactly twice,<br />
    once to the right of the arrow and once to the left. */<br />
  <br />
  #include <br />
  #include <br />
  #include <br />
  <br />
  #define BUFFER_SIZE 16<br />
  <br />
  /* Circular buffer of integers. */<br />
  <br />
  struct prodcons {<br />
   int buffer;   /* 实际数据 */<br />
   int readpos, writepos;    /* 读取和写入的位置 */<br />
   sem_t sem_read;        /* 可读取的元素个数 */<br />
   sem_t sem_write;       /* 可写入的空位个数 */<br />
  };<br />
  <br />
  /* 初始化缓冲区 */<br />
  void init(struct prodcons * b)<br />
  {<br />
   sem_init(&amp;b-&gt;sem_write, 0, BUFFER_SIZE - 1);<br />
   sem_init(&amp;b-&gt;sem_read, 0, 0);<br />
   b-&gt;readpos = 0;<br />
   b-&gt;writepos = 0;<br />
  }<br />
  <br />
  /* 在缓冲区中保存一个整数 */<br />
  void put(struct prodcons * b, int data)<br />
  {<br />
   /* Wait until buffer is not full */<br />
   sem_wait(&amp;b-&gt;sem_write);<br />
   /* Write the data and advance write pointer */<br />
   b-&gt;buffer = data;<br />
   b-&gt;writepos ;<br />
   if (b-&gt;writepos &gt;= BUFFER_SIZE) b-&gt;writepos = 0;<br />
   /* Signal that the buffer contains one more element for reading */<br />
   sem_post(&amp;b-&gt;sem_read);<br />
  }<br />
  <br />
  /* 从缓冲区读取并删除数据 */<br />
  int get(struct prodcons * b)<br />
  {<br />
   int data;<br />
   /* Wait until buffer is not empty */<br />
   sem_wait(&amp;b-&gt;sem_read);<br />
   /* Read the data and advance read pointer */<br />
   data = b-&gt;buffer;<br />
   b-&gt;readpos ;<br />
   if (b-&gt;readpos &gt;= BUFFER_SIZE) b-&gt;readpos = 0;<br />
   /* Signal that the buffer has now one more location for writing */<br />
   sem_post(&amp;b-&gt;sem_write);<br />
   return data;<br />
  }<br />
  <br />
  /* 测试程序: 一个线程插入 1 到 10000 的整数,另一个线程读取并打印。*/<br />
  #define OVER (-1)<br />
  <br />
  struct prodcons buffer;<br />
  <br />
  void * producer(void * data)<br />
  {<br />
   int n;<br />
   for (n = 0; n &lt; 10000; n ) {<br />
    printf(&quot;%d ---&gt;\n&quot;, n);<br />
    put(&amp;buffer, n);<br />
   }<br />
   put(&amp;buffer, OVER);<br />
   return NULL;<br />
  }<br />
  <br />
  void * consumer(void * data)<br />
  {<br />
   int d;<br />
   while (1) {<br />
    d = get(&amp;buffer);<br />
    if (d == OVER) break;<br />
    printf(&quot;---&gt; %d\n&quot;, d);<br />
   }<br />
   return NULL;<br />
  }<br />
  <br />
  int main(void)<br />
  {<br />
   pthread_t th_a, th_b;<br />
   void * retval;<br />
  <br />
   init(&amp;buffer);<br />
  <br />
   /* 建立生产者和消费者线程。*/<br />
   pthread_create(&amp;th_a, NULL, producer, 0);<br />
   pthread_create(&amp;th_b, NULL, consumer, 0);<br />
  <br />
   /* 等待生产者和消费者结束。 */<br />
   pthread_join(th_a, &amp;retval);<br />
   pthread_join(th_b, &amp;retval);<br />
   return 0;<br />
  }<br />
  <br />
  在清单 2 中,程序首先建立了两个线程分别扮演生产者和消费者的角色。生产者负责将 1 到 1000 的整数写入缓冲区,而消费者负责从同一个缓冲区中读取并删除由生产者写入的整数。因为生产者和消费者是两个同时运行的线程,并且要使用同一个缓冲区进行数据交换,因此必须利用一种机制进行同步。清单 2 中的程序就利用信号量实现了同步。<br />
  <br />
  起初程序初始化了两个信号量(init()函数),分别表示可读取的元素数目(sem_read)和可写入的空位个数(sem_write),并分别初始化为 0 和缓冲区大小减1。在生产者调用 put() 函数写入时,它首先对 sem_write 进行DOWN 操作(即 sem_wait 调用),看是否能够写入,如果此时 sem_write 信号量的值大于零,则 sem_wait 可以立即返回,否则生产者将在该 sem_write 信号量上等待。生产者在将数据写入之后,在 sem_read 信号量上进行 UP 操作(即sem_post调用)。此时如果有消费者等待在 sem_read 信号量上,则可以被系统唤醒而继续运行。消费者线程的操作恰恰相反,该线程调用 get() 函数时,首先在 sem_read 上进行 DOWN 操作,当读取数据并删除之后,在 sem_write 信号量上进行 UP 操作。<br />
  <br />
  通过上面的两个例子,读者可以对线程之间的互操作有一个大概了解。如果读者对 System V IPC 机制比较熟悉的话,也可以作一番比较。可以看到,多线程的最大好处是,除堆栈之外,几乎所有的数据均是共享的,因此线程间的通讯效率最高;但最大坏处是,因为共享所有数据,从而非常容易导致线程之间互相破坏数据。<br />
  <br />
  2.3 MiniGUI 和多线程 <br />
  MiniGUI 1.0 版本采用了多线程机制,也就是说,MiniGUI 以及运行在 MiniGUI 之上的所有应用程序均运行在同一个地址空间之内。比起其他基于进程的 GUI 系统来说,虽然缺少了地址保护,但运行效率却是最高的。<br />
  <br />
  3 基于 PThread 的微客户/服务器结构<br />
  <br />
  3.1 多线程的分层设计 <br />
  从整体结构上看,MiniGUI 是分层设计的,层次结构见图 1。在最底层,GAL 和 IAL 提供底层图形接口以及鼠标和键盘的驱动;中间层是 MiniGUI 的核心层,其中包括了窗口系统必不可少的各个模块;最顶层是 API,即编程接口。<br />
<br />
文章出处:http://www.diybl.com/course/6_system/linux/linuxjq/2007211/17150.html
vfdff(作者)
2009-07-04 17:17
2
http://www.ucgui.com/zuoping.asp<br />
<br />
嵌入式的一些资料的下载(ucgui/ucos等) <br />
<br />
嵌入式图形系统uc/GUI 3.24版源码下载(包含vc下的示例程序): <br />
嵌入式图形系统MiniGUI 1.3.0版源码下载: <br />
MiniGUI下Windows环境的模拟器及五子棋程序下载: <br />
嵌入式图形系统 LGUI源码下载<br />
嵌入式操作系统 uc/OS 2.52 版源码下载:<br />
Uc/os在80x86上的移值版本, 编译成DOS下的EXE文件.<br />
Uc/os在arm7~9 上的移值版本, 编译成linux下的ELF文件, 通过自由开放源码软件----skyeye虚拟仿真机运行, 在LINUX下环境下运行.<br />
Skyeye 0.9源码下载:<br />
嵌入式的uc/fs文件系统下载:<br />
嵌入式的网络协议实现 uc/tcpip 下载:<br />
另外一嵌入式网络协议实现Lwip 0.6 下载: <br />
还有一个中文的操作系统PYOS的早期版的...<br />
&nbsp;&nbsp;&nbsp; 12.&nbsp;&nbsp;&nbsp;PYOS----国内人牛人推出的中文图形化操作,虽然现在的版本还是比较简单,我所选择的版本比现在的还要早,因为我觉得这样的话,更用利于学习的人了解一个操作系统到底是如何写成的,其实这个版本的PYOS只能算是一个开机便能自己运行的系统程序而已.是针对80X86保护模式体系下的,有自己的引导,加载部分,它一开机便能自己运行,了解这个,你可以大大的了解为什么PE文件是多么的方便与复杂,一点击就由系统来运行了, 但是要做一个自己引导自己运行的系统程序,就不那么容易,PYOS正好满足你这方面的兴趣与问题,我对此源码有一定学习,有什么问题可能交流...<br />
<br />
&nbsp;&nbsp;&nbsp; 以下是PYOS的一截图...<br />
<br />
&nbsp;&nbsp;&nbsp; 还有一个LINUX早期版本的操作系统, linux0.11版本...<br />
<br />
&nbsp;&nbsp;&nbsp; 13.&nbsp;&nbsp;&nbsp;linux0.11版本----关于这个版本的学习, 在网上比较流行, 而且有一个论坛专门学习讨论这个版本的LINUX, www.oldlinux.org, 学习这个版本的原因是, 它本身是一个比较完备然而又非常简单的早期LINUX系统, 总代码量为14000行.对于学习来说, 是比较适合的.<br />
<br />
&nbsp;&nbsp;&nbsp; linux0.11中文注解源码下载... <br />
&nbsp;&nbsp;&nbsp; linux0.11原文注解源码下载... <br />
&nbsp;&nbsp;&nbsp; 还有, 对于这个版本的学习, 最好去www.oldlinux.org. 再就是下载一个Bochs-2.1.1版的虚拟机来....<br />
<br />
&nbsp;&nbsp;&nbsp; 另外还提供了阅读这些源码非常方便的一个工具InSight3.0...<br />
<br />
&nbsp;&nbsp;&nbsp; 14.&nbsp;&nbsp;&nbsp;InSight3.0----非常方便的源码阅读工具,利用它你可以很方便的找到你要找的函数及变量,结构体等等的声明之处/定义之处,而不须要先编译源程序...<br />
 <br />
 <br />
<br />
几个调试工具系统工具的下载.....<br />
&nbsp;&nbsp;&nbsp; 15.Sysinternals公司的系列调试工具----这里面包含了很多的工具, 其中有DbgView这个非常方便的工具, 如进行VC编时, 在程序中加一句OutputDebugString(&quot;debug info&quot;), 就可输出信息到DbgView这个工具中查看,非常方便.<br />
<br />
&nbsp;&nbsp;&nbsp; 其中还有进程查看工具,对于很多的进程都可以杀掉,超强杀进程; 还有监视系统的进程活动(创建与消失),线程活动的工具; 还有监视磁盘绝对读写的;监视文件存取的;监视注册表读写的. 监视网络协议的,等等很多的工具...<br />
<br />
&nbsp;&nbsp;&nbsp; 16.汉字平台下载----这是差不多十年前的东西了, 差不多95年吧, 不过作者在这里面实现了在DOS的汉字显示及输入技术, 图形系统, mose支持而且还实现了几个输入法, 有全拼及五笔输入, 还支持词库及造词等功能. 我们都知道, 在WINDOWS下, 汉字输入其实也是很多朋友比较关心的一个技术, 在WINDOWS下写输入法, 要按照特定的接口来写, 但是对于DOS下的. 则自由多了, 朋友们可以看看这套汉字系统的作者是如何解决汉字输入的<br />
<br />
&nbsp;&nbsp;&nbsp; 17.自由拼音输入法----为了比较学习, 我这里还提供一个WINDOWS下的拼音输入法, 大家可以比较一下, WINDOWS下的输入法与DOS下的输入法的差别. 现想一想输入法的本质. 欢迎大家留下自己的字习心得...<br />
<br />
 <br />
<br />
<br />
  <br />
 <br />
 <br />
18.UCFS2.36版下载(内含文档)----最新版的UCFS下载, 请关注http://www.micrium.com/,不过告诉你一个下载的技术.就是直接打开下载要填单的HTML页面, 然后直接找.zip,就可以找到要下载的东东.不用填单了, 填单的下载非常不稳定.很慢..找到LINK,我们就有FALSHGET来..很快呵..<br />
&nbsp;&nbsp;&nbsp;19.ucgui44b0 UCGUI在44BO上的移植.pdf文档下载.<br />
<br />
&nbsp;&nbsp;&nbsp;20.ucgui44b0移值简单测试分析 对于上面的移值文档,这里编写了一个测试用例,大家看看.<br />
<br />
&nbsp;&nbsp;&nbsp;21.ucgui简单分析.rar 网上一个朋对UCGUI整作的一个简单分析, 大家看看,虽然不是很详细, 但比较有整体性.<br />
<br />
&nbsp;&nbsp;&nbsp;22.kingmos嵌入式集成系统源码-----国内超强的嵌入式集成操作系统, 开源的, 宣传当中说是os+gui+fs+网络+数据库+编译连接工具链+完整手机应用+其它应用. 大家可以去下载一个学习版看看, 看看到底是否如此, 如果真如此, 国人之福啊!!!!!!, 本站空间有限, 希望须要的朋友赶紧下载啊!!吐血推荐!!!!!<br />
<br />
&nbsp;&nbsp;&nbsp;23.Minigui1.6版各种文档及WIN环境下模拟器下载-----minigui这一国产的嵌入式图形支持系统, 号称跨平台, 适合做为多种嵌入式系统的图形支持系统, 而且最近与风河的VXWORKS搭上了关系,&nbsp;&nbsp;的确发展不俗, 这里提供了MINIGUI的编程文档,用户文档下载, 并提供了MINIGUI在WIN下面的模拟器, 可以让WIN下面的朋友进行MINIGUI的图形编程.<br />
<br />
&nbsp;&nbsp;&nbsp;24.arm学习报告一二三-----网上广为流传的ARM学习资料, 作者功务深厚, 精神可佳, 是学习ARM开发的上好资料, 其中包括&quot;ARM学习报告003——Bios源码分析.pdf&quot;,&quot;BootLoader源代码级分析第一部分-GNU之映象机理.pdf&quot;,&quot;ARM映象文件及执行机理.rar&quot;三部分组成.<br />
<br />
&nbsp;&nbsp;&nbsp;25.MiniguiDOS版的GUI图形系统-----这个是MINIGUI最原始的版本. 在提供DOS下在GUI实现, 了解这个版本可以了解MINIGUI的历史, 它原来叫WYMGUI,完全带个人色彩. 其中有DOC文档 做了详细的介绍说明. 大家看看.<br />
<br />
&nbsp;&nbsp;26,MINGUI网站所有可下载东西打包---这个包里包含了所有MINIGUI中所有可下载的东东,有些网友在它的网站上下载时很麻烦, 要注册会员什么的,所以我一次性把它全下载了.大家看看.?<br />
<br />
&nbsp;&nbsp;27,MINIGUI在VC下的模拟器下载---这当中包含了可以在WIN下面的VC中进行MINIGUI编程及源码调试的模拟器环境, 大家看看.不错.还有一库文件下载<br />
<br />
http://www.ucgui.com/ucgui/mow-lib-0.2.tar.gz<br />
<br />
&nbsp;&nbsp;28.UCOS2.80VC下环境下模拟环境下载. 提供在VC环境下调试及进行UCOS编程的便利环境.<br />
<br />
http://www.ucgui.com/ucgui/ucos280.rar
游客请输入验证码
浏览1936624次