搜索
bottom↓
回复: 49

自由软件模式的嵌入式系统实验室的建立

[复制链接]

出0入0汤圆

发表于 2011-3-20 08:01:47 | 显示全部楼层 |阅读模式
目前的一些信息和移植过程请暂时参考
http://blog.csdn.net/rickleaf

只要我有时间,我会把整理过的东西贴到阿莫这里。

本人是一个嵌入式系统的爱好者,移植和应用过多种嵌入式系统。工作以来主要从事WinCE,Linux和Android的开发。

一直有一个梦想,希望像我一样的嵌入式系统爱好和工作者,能够在没有硬件的条件下去了解和开发这样的系统。

现在,自由的操作系统层出不穷,对移植和开发的文档却依然晦涩难懂。我希望我们能在这样的虚拟的平台上(比如我现在专注的

mini2440 QEMU)把我们的每一次移植都能够图文并茂的通过docbook 记录在案,这将能更大的提升自由软件文档的阅读效果。

我们不专注于系统本身,但是我们专注于这样的虚拟应用。我们会不遗余力的把我们的文档和代码贡献给任何人。

当然也会提供给我们移植的操作系统的组织。在这样的环境中,我希望大家和我能继续共同成长。

虽然我已经过了而立之年,但是我感觉我依旧浑身充满了力量。

我建立的自由软件项目,名称是eMBosLab, 在未来的日子里,我将把我仅省的力量投入进来。

让更多的人能够通过这样一个平台,学习甚至研究嵌入式系统,更轻松的投入到工作中。

我还会和朋友一起通过docbook的方式,记录我们的每一次成长历程。


项目刚开始,目前仅仅整理好 RTEMS for mini2440 qemu的代码


项目的源代码首页 (原文件名:emboslab.png)

ECOS for mini2440 qemu的代码正在整理中,下周末之前会上传


emwin for ecos mini2440 qemu (原文件名:emwin_for_ecos.png)


ecos http 服务器 for mini2440 qemu (原文件名:ecos_webserver.png)


ecos microwindows for synthetic  (原文件名:ecos_synthetic.png)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-3-20 08:37:20 | 显示全部楼层
支持lz。

出0入0汤圆

发表于 2011-3-20 08:43:53 | 显示全部楼层
沙发,支持楼主。

出0入9汤圆

发表于 2011-3-20 09:16:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-20 10:40:35 | 显示全部楼层
强烈地支持!

出0入264汤圆

发表于 2011-3-20 11:12:51 | 显示全部楼层
支持

出0入0汤圆

发表于 2011-3-20 11:23:37 | 显示全部楼层
又一牛人

出0入0汤圆

发表于 2011-3-20 11:37:48 | 显示全部楼层
赞!期待后面的!

出0入8汤圆

发表于 2011-3-20 12:03:06 | 显示全部楼层
支持

出0入0汤圆

发表于 2011-3-20 12:20:31 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-3-21 09:15:21 | 显示全部楼层
因为一楼的帖子已经无法编辑,再发一更新贴
最新更新内容如下:

1. eMBosLab RTEMS:

更新内容:
RTEMS for emboslab 增加mini2440 qemu BSP
下载方法
git clone git://emboslab.git.sourceforge.net/gitroot/emboslab/rtems-4.9.5-emboslab


(原文件名:RTEMS_emboslab.png)

2. eMBosLab eCos:

更新内容:

20110321 18:00 增加MINI2440 BSP源代码,包括FLASH驱动,DM9000网卡驱动极其LCD支持
20110321 10:00 eCos for emboslab 合并了yaffs和nand 模块

下载方法
hg clone hg://emboslab.hg.sourceforge.net/hgweb/emboslab/ecos-emboslab


(原文件名:ecos_emboslab.png)

出0入0汤圆

 楼主| 发表于 2011-3-25 11:21:19 | 显示全部楼层
代码已经更新了,RTEMS的DM9000网卡已经测试通过,请大家去更新代码

RTEMS 网页服务器 在mini2440 qemu的效果 (原文件名:RTEMS_webserver.png)

出0入0汤圆

 楼主| 发表于 2011-3-29 20:23:10 | 显示全部楼层
需要大家关注一下

出0入0汤圆

发表于 2011-3-31 16:58:37 | 显示全部楼层
关注中……

出0入0汤圆

 楼主| 发表于 2011-4-1 08:50:35 | 显示全部楼层
感谢大家支持

出0入0汤圆

发表于 2011-4-1 09:24:01 | 显示全部楼层
支持楼主!

出0入0汤圆

发表于 2011-4-1 13:23:05 | 显示全部楼层
Great

出0入0汤圆

 楼主| 发表于 2011-4-2 08:02:25 | 显示全部楼层
最新消息,目前Touch和Microwindows已经成功运行,
修复些bug以后会上传到实验室。

请大家多多关注,后续会有更多惊喜
1. 修复MINI2440 QEMU的BUG

开始的我用ecos里面仅有的两个ARM下面的touch 驱动来做一个中断测试,

都快疯了,没有任何反应。

后来看到RT-Thread的例子可以正常运行,于是才想看看他们呢对MINI2440 QEMU的修改。



真的要感谢所有自由组织的无私奉献。



果然,MINI2440的QEMU采用的是S3C2410的TOUCH接口,里面关于PenDown和PenUP的寄存器位都木有。



代码已经上传到了emboslab git 库中qemu-mini2440的ecos-emboslab 分支,这里还是简要介绍一下。



--------------------------------- hw/s3c2410.c ---------------------------------

index d1e4c92..bdf8a73 100644

@@ -1630,6 +1630,14 @@ static void s3c_adc_tick(void *opaque)

         qemu_mod_timer(s->tst, qemu_get_clock(vm_clock) +

                         (ticks_per_sec >> 5));

     }

/*

这个是QEMU实现ARM中断方式的机制

可以这样理解:如果对QEMU的窗口做Penup的时候,触发一个专断给CPU。

*/

+    else

+    {

+        if (((s->ts & 3) == 3) && (s->ts & (1<<8)) && (s->enable))

+            qemu_irq_raise(s->tcirq);

+

+ qemu_mod_timer(s->tst, qemu_get_clock(vm_clock) +

+                        (ticks_per_sec >> 5));

+    }

}



static void s3c_adc_event(void *opaque,

@@ -1689,7 +1697,7 @@ static void s3c_adc_write(void *opaque, target_phys_addr_t addr,

         break ;



     case S3C_ADCTSC:

-        s->ts = value & 0xff;

+        s->ts = value & 0x1ff; /*增加了Pendown和Penup的控制位*/

         break ;



     case S3C_ADCDLY:
2. 实现触摸屏驱动(尚有BUG)

目前官方的触屏驱动有两个,我们看下

ricky@ricky-laptop:ecos-emboslab$ cd packages/devs/touch/arm/
ricky@ricky-laptop:arm$ ls
aaed2000  ipaq

如果让Microwindows支持Touch只要实现这样的一个标准的Touch驱动就可以了。

在Microwindows的部分调用这个标准的ecos字符形设备就可以了。

不过从代码看来,ecos并没有对Touch驱动有严格的API定义,所以在网上你能看到很多种实现方法。

既然Microwindows用了字符形的设备,那么我们也就按照这个架构实现一下吧。

我们先看一下ecos的字符形设备是什么样子的,具体的请看ecos的参考手册(如何生成最新的参考手册,我会在另一篇博客中讲述)

CHAR_DEVIO_TABLE(mini2440_ts_handlers,
                 NULL,                                   // Unsupported write() function
                 ts_read,
                 ts_select,
                 ts_get_config,
                 ts_set_config);

CHAR_DEVTAB_ENTRY(mini2440_ts_device,
                  CYGDAT_DEVS_TOUCH_MINI2440_NAME, /*这个是字符形设备的描述符 , 在CDL文件中定义 "/dev/ts" ,和Linux的驱动文件很相似 */
                  NULL,                                   // Base device name
                  &mini2440_ts_handlers,
                  ts_init,
                  ts_lookup,  /*重点看这个函数:当设备被open的时候这个callback函数会被调用*/
                  NULL);                                  // Private data pointer

关于如何实现更好的touch架构,本人还在研究。

现在的方案是

在设备初始化的时候配置硬件资源和终端设置,

在设备被打开,也就是ts_lookup里面创建中断响应函数,把转化好的touch 数据放到队列中等待上层(Microwindows)

来读取。

看下初始化部分

static bool      
ts_init(struct cyg_devtab_entry *tab)
{
    cyg_uint32 _dummy;
    HAL_WRITE_UINT32(ADCCON,S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(9));
    HAL_WRITE_UINT32(ADCDLY,50000);
    HAL_WRITE_UINT32(ADCTSC,WAIT4INT(0));  /*这里就是使能,PenDownUP终端*/

    //HAL_WRITE_UINT32(INTMSK, BIT_ALLMSK);
    HAL_READ_UINT32(SUBSRCPND, _dummy);
    _dummy |= BIT_SUB_TC;
    _dummy |= BIT_SUB_ADC;
    HAL_WRITE_UINT32(SUBSRCPND, _dummy);

   
    cyg_drv_interrupt_acknowledge(CYGNUM_HAL_INTERRUPT_ADC);
    cyg_selinit(&ts_select_info);
    /* install interrupt handler */
    HAL_READ_UINT32(INTSUBMSK, _dummy);
    _dummy &= ~BIT_SUB_ADC;
    _dummy &= ~BIT_SUB_TC;
    HAL_WRITE_UINT32(INTSUBMSK, _dummy);
    HAL_INTERRUPT_UNMASK(CYGNUM_HAL_INTERRUPT_ADC);
    return true ;
}

/*设备打开函数,创建了AD C中断的挂钩函数cyg_mini2440_ts_isr和cyg_mini2440_ts_dsr*/

    if (!_is_open) {
        _is_open = true;
      
       cyg_drv_interrupt_create(CYGNUM_HAL_INTERRUPT_ADC,
                             0,
                             (CYG_ADDRWORD)0,
                             cyg_mini2440_ts_isr,
                             cyg_mini2440_ts_dsr,
                             &ts_thread_handle,
                             &ts_thread_data);
       cyg_drv_interrupt_attach(ts_thread_handle);
       cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_ADC);
    }
    return ENOERR;
}

罗嗦两句,ecos在创建的时候就参考了很多linux的风格,比如我们看到上面的isr和dsr很像Linux对中断处理的上半和下半。

具体的实现机理本人也在研究呢,目前位置我只是知道如何应用。

isr中希望用户能快速的响应终端,在isr结束的时候往往有下面的代码

   cyg_drv_interrupt_acknowledge (CYGNUM_HAL_INTERRUPT_ADC);

上面的这行主要是在函数返回前开启这个中断

   return CYG_ISR_HANDLED | CYG_ISR_CALL_DSR ;

后面这个有两个含义,第一个是告诉系统这个中断我已经知道了,做了我应该做的事情。第二个含义就是红色的部分会在函数返回之后

出发这个终端的DSR处理程序。

那么这个touch驱动到底需要还是不需要DSR呢,本人下不了结论。

本人是做Linux的,知道Linux一般的input driver一般用到后半的多是处理report机制,

为了不把问题复杂化,我们现让硬件能动起来,欢迎其他人给我建议

2440的Touch中断处理暂时比较简单

if (res& (1 << 10)) /*ADC的采用的后要继续出发PenDownUP中断*/
   {
       //diag_printf("ADC Interrupt\n");
       HAL_READ_UINT32(SUBSRCPND, reg);
       reg |= BIT_SUB_ADC;
       HAL_WRITE_UINT32(SUBSRCPND, reg);
     
       x = read_ts_x();
       y = read_ts_y();
      
       lastX = x;  lastY = y;
      
       //diag_printf("X = %x, Y = %x\n", x, y);
       HAL_WRITE_UINT32(ADCTSC,WAIT4INT(1));

   }
   if (res& (1 << 9)){ /*PenDownUp中断记录Touch的按下和抬起,同时出发ADC的采样*/
       //diag_printf("TS Interrupt\n");
      
       HAL_READ_UINT32(SUBSRCPND, reg);
       reg |= BIT_SUB_TC;
       HAL_WRITE_UINT32(SUBSRCPND, reg);

       HAL_READ_UINT32(ADCDAT0, data0);
       HAL_READ_UINT32(ADCDAT1, data1);
      
   
       updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
      
       if(updown)
       {           
           x = read_ts_x();
            y = read_ts_y();
            //diag_printf("X = %x, Y = %x\n", x, y);
        //diag_printf("pen_down#######################################################################\n");
            if ((x < X_THRESHOLD) || (y < Y_THRESHOLD)) {
                // Ignore 'bad' samples
                 }
            lastX = x;  lastY = y;
            HAL_WRITE_UINT32(ADCTSC, S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST);
        HAL_READ_UINT32(ADCCON, reg);
            reg |= S3C2410_ADCCON_ENABLE_START;
            HAL_WRITE_UINT32(ADCCON, reg);
            pen_down = true;
       }
       else
       {
               x = lastX;
            y = lastY;
            HAL_WRITE_UINT32(ADCTSC,WAIT4INT(0));
            pen_down = false;
        //diag_printf("pen_up#######################################################################\n");
       }
   }


   /*把合理的数据处理后放入一个events数组中,等待上层来读取*/         
   if (num_events < MAX_EVENTS) {
            num_events++;
            ev = &_events[_event_put++];
            if (_event_put == MAX_EVENTS) {
                _event_put = 0;
            }
            ev->button_state = pen_down ? 0x04 : 0x00;
            ev->xPos = x;
            ev->yPos = y;
            if (ts_select_active) {
                ts_select_active = false;
                cyg_selwakeup(&ts_select_info);
            }
        }
3. 修正eCos自带Microwindows的ecos_app错误

目前发现的一个问题是,ecos之前曾经采纳了一个牛的patch,他应用HAL_TABLE实现了基于Microwindows的APP定义方式。

很巧妙,那么什么是HAL_TABLE呢,我们可以理解为为了实现更好的表的管理的一种机制,可以把我们要存放的表通过宏

放到内存中的某个位置,大家可以在google上找一下,ecos在这个部分应用还是比较有特点的。

尤其是在二维表的处理上有很多特别的应用,redboot的一些命令就是例子

ecos_mw_app.h

typedef void fun(CYG_ADDRWORD);
typedef struct _mw_app_entry {
    char         *name;
    fun          *entry;
    int          prio;
    fun          *init;
    cyg_handle_t t;
    cyg_thread   t_obj;
    char         stack[STACKSIZE];
} CYG_HAL_TABLE_TYPE _mw_app_entry_t;

#define _mw_app(_name_,_id_,_pri_,_init_)               \
externC void _id_##_thread(CYG_ADDRWORD data);          \
_mw_app_entry_t _mw_app_##_pri_##_##_id_           \
   CYG_HAL_TABLE_QUALIFIED_ENTRY(_mw_apps,_pri_) =      \
     { _name_, _id_##_thread, _pri_, _init_};

#define ECOS_MW_STARTUP_PRIORITY 11
#define ECOS_MW_NANOX_PRIORITY   (ECOS_MW_STARTUP_PRIORITY+1)
#define ECOS_MW_KND_PRIORITY     (ECOS_MW_STARTUP_PRIORITY+2)
#define ECOS_MW_NANOWM_PRIORITY  (ECOS_MW_STARTUP_PRIORITY+4)
#define ECOS_MW_APP_PRIORITY     (ECOS_MW_STARTUP_PRIORITY+5)

ecos_app.c

CYG_HAL_TABLE_BEGIN( __MW_APP_TAB__, _mw_apps );
CYG_HAL_TABLE_END( __MW_APP_TAB_END__, _mw_apps );
extern struct _mw_app_entry __MW_APP_TAB__[], __MW_APP_TAB_END__;

为什么提到这个呢,到目前位置我不能十分的确定是这个机制有问题还是QEMU本身对于内存管理的问题。

如果我在Microwindows访问我的设备文件,就是open我们之前创建的/dev/ts这个时候貌似用HAL_TABLE存放的UI线程信息就读不到了。

如果可以打message,可以看到不能创建我们要的Microwindows的一些线程,当然也就不能看到画面了。

比较简单的做法就是参考ecos之前的代码,或者干脆去看官方Microwindows的代码,用一个数组去存放线程信息。

struct nx_thread _threads[] = {
    { "System startup", startup_thread,    11 },
    { "Nano-X server",  nanox_thread,      12 },
    { "Nano-WM",        nanowm_thread,     14 },
    /*{ "Nano-KBD",       nxkbd_thread,      13 },*/
#ifdef USE_NXSCRIBBLE
    { "Scribble",       nxscribble_thread, 20 },
#endif
#ifdef USE_LANDMINE
    { "Landmine",       landmine_thread,   19 },
#endif
#ifdef USE_NTETRIS
    { "Nano-Tetris",    ntetris_thread,    18 },

# endif
#ifdef USE_WORLD
    { "World Map",      world_thread,      21 },
#endif
    { "demo",            demo_thread,      22 },
};

接下来你就看到Microwindows了,进入下一个环节。
4. Show图


(原文件名:microwindows_and_touch.png)

出0入0汤圆

 楼主| 发表于 2011-4-6 09:35:02 | 显示全部楼层
(源代码会在整理以后上传到实验室,emboslab的ecos仓库,请留意我的置顶)

本帖原创,转载请注明出处,谢谢。(rickleaf)

csdn: http://blog.csdn.net/rickleaf/archive/2011/04/04/6301971.aspx

1. 什么是flnx, 为什么要做flnx到ecos的移植

提及flnx的时候首先要了解一下fltk,fltk是 Fast Light Toolkit 的缩写,他是一个跨平台的GUI开发库。

FLTK在设计之初就考虑了,如何能应用在不同的窗口管理架构之下。而且,FLTK有着自己独到的事件处理方法。

如果您在Linux的系统下,还可以用FLUID作为图形开发的工具,方便的生成可视化UI。

下图就是ubuntu 10.04下面的FLUID

(原文件名:linux_fltk_fluid.png)
说到这里大家可能会开始对FLTK感兴趣了,那就去他的官方网站看看吧

http://www.fltk.org/

到现在为止我没还没有谈到FLNX, 既然FLTK能运行在很多窗口管理架构之下,当然也能运行在Nano-X之下。

之前我们已经花了很多经历把ecos的Nano-X在mini2440 QEMU平台下面运行起来了,那么FLNX也可以运行在ecos下面吗?

我在网上搜索了一下,还是有成功案例的,但是可能是推广等多种问题这部分用的人并不是很多。

对于系统而言,无论那种UI方案,如果在性能允许的情况下,大家都希望能应用方便,我也一样。

我们后面来看看如果把FLNX模块化的放入ecos的packages仓库中
2. FLNX的移植,把FLNX放入ecos的packages中

首先我们要仿照其他的services下面的gfx的模块建立一个flnx的目录(尽量小写吧,这个也是不多的coding style之一)

先看看我建立的flnx目录

ricky@ricky-laptop:services$ pwd
/opt/ecos/ecos-hg/packages/services
ricky@ricky-laptop:services$ ls -l gfx/
总用量 36
drwxr-xr-x 3 ricky ricky 4096 2011-03-17 17:15 emwin
drwxrwxr-x 3 ricky ricky 4096 2011-04-04 19:41 flnx
drwxr-xr-x 3 ricky ricky 4096 2011-02-12 10:05 jpeg-6b
drwxr-xr-x 3 ricky ricky 4096 2011-02-21 17:18 microwin
drwx------ 3 ricky ricky 4096 2011-01-30 15:24 minigui
drwxr-xr-x 3 ricky ricky 4096 2010-04-23 14:38 mw
drwxr-xr-x 3 ricky ricky 4096 2011-02-12 10:05 png
drwxr-xr-x 3 ricky ricky 4096 2011-02-22 17:16 pw
drwxr-xr-x 3 ricky ricky 4096 2011-02-12 10:05 qvfb
ricky@ricky-laptop:services$ ls -l gfx/flnx/
总用量 4
drwxr-xr-x 7 ricky ricky 4096 2011-04-04 19:40 current

然后我们把原始的flnx拷贝进来,把flnx的src目录拷贝到current下,把test目录拷贝为current下面的tests

然后建立一个cdl目录,放置makefile需要的配置文件

ricky@ricky-laptop:services$ ls -l gfx/flnx/current/
总用量 20
drwx------  2 ricky ricky 4096 2011-04-04 19:34 cdl
drwxr-xr-x 12 ricky ricky 4096 2011-04-03 14:09 flnx
drwxr-xr-x  3 ricky ricky 4096 2011-04-03 13:40 include
drwxrwxr-x  2 ricky ricky 4096 2011-04-04 21:02 src
drwxrwxr-x  2 ricky ricky 4096 2011-04-04 21:02 tests

后面我们要花些经历把需要编译的cxx文件写到flnx的cdl文件中(我命名这个packages的cdl文件名为flnx.cdl)

######DESCRIPTIONBEGIN####
#
# Author(s):      Ricky Wu
# Original data:  Ricky Wu
# Contributors:
# Date:           2011-04-04
#
#####DESCRIPTIONEND####
#
# ====================================================================

cdl_package CYGPKG_FLNX {
    display       "flnx"
    requires      CYGPKG_POSIX
    requires      CYGPKG_ISOINFRA
    requires      CYGINT_ISO_C_TIME_TYPES
    requires      CYGINT_ISO_STRERROR
    requires      CYGINT_ISO_ERRNO
    requires      CYGINT_ISO_ERRNO_CODES
    requires      CYGINT_ISO_MALLOC
    requires      CYGINT_ISO_STRING_BSD_FUNCS
    requires      CYGPKG_IO_FILEIO
    description   "flnx"

    # Note: separating the stack implementation from the common support leads
    # to some rather incestious config file relationships.
    define_proc {
    }

    compile                             \
        src/cmap.cxx                \
        src/dump_compose.c        \
        src/Fl_abort.cxx        \
        src/Fl_add_idle.cxx        \
        src/Fl_Adjuster.cxx        \
        src/Fl_Animator.cxx        \
        src/fl_arc.cxx                \
        src/fl_arci.cxx                \
        src/Fl_arg.cxx                \
        src/fl_ask.cxx                \
        src/Fl_Bitmap.cxx        \
        src/Fl_Box.cxx                \
        src/fl_boxtype.cxx        \
        src/Fl_Browser_.cxx        \
        src/Fl_Browser.cxx        \
        src/Fl_Browser_load.cxx            \
        src/Fl_Button.cxx        \
        src/fl_call_main.c        \
        src/Fl_Chart.cxx        \
        src/Fl_Check_Button.cxx            \
        src/Fl_Choice.cxx        \
        src/Fl_Clock.cxx        \
        src/Fl_Color_Chooser.cxx    \
        src/fl_color.cxx        \
        src/Fl_Counter.cxx        \
        src/fl_cursor.cxx        \
        src/fl_curve.cxx        \
        ... ...

    cdl_component CYGPKG_FLNX_OPTIONS {

有几点需要注意,H文件和资源文件是不能参与编译的。

cdl_option CYGPKG_FLNX_CFLAGS_ADD {
            display "Additional compiler flags"
            flavor  data
            no_define
            default_value { "-I$(PREFIX)/include/FL -I$(REPOSITORY)/$(PACKAGE)/src -D__FLNX_LIB__ -DNANO_X -D__ECOS -Dlint" }
            description   "
                This option modifies the set of compiler flags for
                building the flnx package.
                These flags are used in addition to the set of global flags."
        }

cdl中要实现之前flnx makefile中的第一的一些宏,不如既然我们要用在nano-x就要定一个 NANO-X

然后,我们要在ecos.db中加入我们package的信息,如下

package CYGPKG_FLNX {
        alias           { "flnx" flnx }
        directory       services/gfx/flnx
        script          flnx.cdl
        description     "FLNX"
}

这样我们的flnx就建成了。

我们在应用的时候先要

ecosconfig add mw  配置好nano-x的ecos支持

然后

ecosconfig add flnx

这样我们编译的系统就会有flnx的库文件了,在编译过程中会碰到一些错误,一般都是头文件缺失造成的。

iostream这个头直接注释掉就可以了,

如果friend class出错,就要在class之外现定义一个class
3.如何应用FLNX

如果您想引用flnx,必须对nano-x在ecos的应用有所了解,这是必须的。


在ecos中开始nano-x的支持,实际上就是一个thread作为nano-x的服务,一个之前fltk的引用程序必须作为一个thread来用。

有个这个信息,可以稍微写一个简单的应用。

下面的两个例子一个是hello,一个是form。


(原文件名:flnx-hello.png)


(原文件名:flnx-form.png)

出0入0汤圆

发表于 2011-4-6 09:37:58 | 显示全部楼层
看看---

出0入0汤圆

发表于 2011-4-6 10:30:58 | 显示全部楼层
顶顶更健康

出0入0汤圆

发表于 2011-4-6 10:40:07 | 显示全部楼层
好文章,顶

出0入0汤圆

 楼主| 发表于 2011-4-6 14:44:09 | 显示全部楼层
ecos 自带的Microwindows中加入mwin的支持

1. MWIN是什么啊

Microwindows 在发布之初,提供了两种API接口,WinAPI和Nano-X

之前本博客曾经讨论过如何应用ecos自带的Microwindows的Nano-X接口,并且应用了FLNX作为Nano-X下面轻量级的GUI库。

那么ecos下面的Microwindows的WINAPI支持吗?

2. MWIN的移植

参考了新版Microwindows的WINAPI对ecos是支持的,不过老板不的Microwindows采用的select函数和unix是共用的。

所以我稍微做了一次改动就可以在ecos上运行起来了。

首先是cdl,加入mwin的代码

cdl_component CYGBLD_MICROWINDOWS_MW {
        display   "Build the Windows-compatible API"
        default_value 0
        requires CYGPKG_KERNEL

        # NANO X
        compile                 \
            mwin/winclip.c \
            mwin/windefw.c \
            mwin/winevent.c \
            mwin/winexpos.c \
            mwin/winfont.c \
            mwin/wingdi.c \
            mwin/winmain.c \
            mwin/winrgn.c \
            mwin/winsbar.c \
            mwin/winuser.c      \
            mwin/bmp/microwin.c \
            mwin/bmp/penguin.c \
            mwin/winlib/draw3d.c \
            mwin/winlib/ptinsid.c \
            mwin/winlib/insetr.c \
            mwin/winlib/fastfill.c \
            mwin/winlib/graph3d.c \
            mwin/winlib/mwuser.c \
            mwin/winlib/button.c \
            mwin/winlib/edit.c \
            mwin/winlib/listbox.c \
            mwin/winlib/progbar.c \
            mwin/winlib/static.c \
            mwin/winlib/combobox.c \
            mwin/winlib/caret.c \
            mwin/winlib/scrlbar.c \
            ecos/ecos_winmain.c
       cdl_option CYGBLD_MICROWINDOWS_MW_DEMO {
            display  "Build complete eCos MicroWindows WAPI application"
            default_value 0
            make -priority 320 {
                <PREFIX>/bin/ecos_mwin.elf : $(PREFIX)/lib/target.ld $(PREFIX)/lib/vectors.o $(PREFIX)/lib/libtarget.a $(PREFIX)/lib/libextras.a $(REPOSITORY)/$(PACKAGE)/src/demos/mwin/mdemo.c
                        @sh -c "mkdir -p $(dir $@)"
                        $(CC) -c $(INCLUDE_PATH) $(CFLAGS) -o $(PREFIX)/lib/mdemo.o $(REPOSITORY)/$(PACKAGE)/src/demos/mwin/mdemo.c
                        $(CC) $(LDFLAGS) -L$(PREFIX)/lib -Ttarget.ld -o $@ $(PREFIX)/lib/mdemo.o
            }
        }
    }

要加入我们自己的ecos_winmain.c

#include <cyg/kernel/kapi.h>

#include <pkgconf/system.h>

extern void invoke_WinMain(int argc, char** argv);

#define STACK_SIZE (16*1024)

struct ecos_winmain_data
{
    cyg_thread thread;
    cyg_handle_t handle;
    char stack[STACK_SIZE] __attribute__ ((aligned(16)));
    int argc;
    char** argv;
};

static void winmain_mainloop(cyg_addrword_t data)
{
    struct ecos_winmain_data* winmain_data=(struct ecos_winmain_data*)data;
    invoke_WinMain(winmain_data->argc, winmain_data->argv);
}

void start_WinMain_thread(int priority, int argc, char** argv)
{
    static struct ecos_winmain_data winmain_data;
    winmain_data.argc=argc;
    winmain_data.argv=argv;

    cyg_thread_create(priority, winmain_mainloop, (cyg_addrword_t) &winmain_data,
              "winmain", (void *)  winmain_data.stack, STACK_SIZE,
              &winmain_data.handle, &winmain_data.thread);

    cyg_thread_resume(winmain_data.handle);
}

void start_WinMain(int argc, char** argv)
{
    invoke_WinMain(argc, argv);
}


#ifndef CYGPKG_LIBC_STARTUP

#include <cyg/infra/diag.h>


void exit(int status)
{
    diag_printf("exit(%d) was called !\n", status);
}

#endif
然后修改mdemo,让他能在ecos上运行
1. MWIN是什么啊

Microwindows 在发布之初,提供了两种API接口,WinAPI和Nano-X

之前本博客曾经讨论过如何应用ecos自带的Microwindows的Nano-X接口,并且应用了FLNX作为Nano-X下面轻量级的GUI库。

那么ecos下面的Microwindows的WINAPI支持吗?

2. MWIN的移植

参考了新版Microwindows的WINAPI对ecos是支持的,不过老板不的Microwindows采用的select函数和unix是共用的。

所以我稍微做了一次改动就可以在ecos上运行起来了。

首先是cdl,加入mwin的代码

cdl_component CYGBLD_MICROWINDOWS_MW {
        display   "Build the Windows-compatible API"
        default_value 0
        requires CYGPKG_KERNEL

        # NANO X
        compile                 \
            mwin/winclip.c \
            mwin/windefw.c \
            mwin/winevent.c \
            mwin/winexpos.c \
            mwin/winfont.c \
            mwin/wingdi.c \
            mwin/winmain.c \
            mwin/winrgn.c \
            mwin/winsbar.c \
            mwin/winuser.c      \
            mwin/bmp/microwin.c \
            mwin/bmp/penguin.c \
            mwin/winlib/draw3d.c \
            mwin/winlib/ptinsid.c \
            mwin/winlib/insetr.c \
            mwin/winlib/fastfill.c \
            mwin/winlib/graph3d.c \
            mwin/winlib/mwuser.c \
            mwin/winlib/button.c \
            mwin/winlib/edit.c \
            mwin/winlib/listbox.c \
            mwin/winlib/progbar.c \
            mwin/winlib/static.c \
            mwin/winlib/combobox.c \
            mwin/winlib/caret.c \
            mwin/winlib/scrlbar.c \
            ecos/ecos_winmain.c
       cdl_option CYGBLD_MICROWINDOWS_MW_DEMO {
            display  "Build complete eCos MicroWindows WAPI application"
            default_value 0
            make -priority 320 {
                <PREFIX>/bin/ecos_mwin.elf : $(PREFIX)/lib/target.ld $(PREFIX)/lib/vectors.o $(PREFIX)/lib/libtarget.a $(PREFIX)/lib/libextras.a $(REPOSITORY)/$(PACKAGE)/src/demos/mwin/mdemo.c
                        @sh -c "mkdir -p $(dir $@)"
                        $(CC) -c $(INCLUDE_PATH) $(CFLAGS) -o $(PREFIX)/lib/mdemo.o $(REPOSITORY)/$(PACKAGE)/src/demos/mwin/mdemo.c
                        $(CC) $(LDFLAGS) -L$(PREFIX)/lib -Ttarget.ld -o $@ $(PREFIX)/lib/mdemo.o
            }
        }
    }

要加入我们自己的ecos_winmain.c

#include <cyg/kernel/kapi.h>

#include <pkgconf/system.h>

extern void invoke_WinMain(int argc, char** argv);

#define STACK_SIZE (16*1024)

struct ecos_winmain_data
{
    cyg_thread thread;
    cyg_handle_t handle;
    char stack[STACK_SIZE] __attribute__ ((aligned(16)));
    int argc;
    char** argv;
};

static void winmain_mainloop(cyg_addrword_t data)
{
    struct ecos_winmain_data* winmain_data=(struct ecos_winmain_data*)data;
    invoke_WinMain(winmain_data->argc, winmain_data->argv);
}

void start_WinMain_thread(int priority, int argc, char** argv)
{
    static struct ecos_winmain_data winmain_data;
    winmain_data.argc=argc;
    winmain_data.argv=argv;

    cyg_thread_create(priority, winmain_mainloop, (cyg_addrword_t) &winmain_data,
              "winmain", (void *)  winmain_data.stack, STACK_SIZE,
              &winmain_data.handle, &winmain_data.thread);

    cyg_thread_resume(winmain_data.handle);
}

void start_WinMain(int argc, char** argv)
{
    invoke_WinMain(argc, argv);
}


#ifndef CYGPKG_LIBC_STARTUP

#include <cyg/infra/diag.h>


void exit(int status)
{
    diag_printf("exit(%d) was called !\n", status);
}

#endif
然后修改mdemo,让他能在ecos上运行

----------- packages/services/gfx/mw/current/src/demos/mwin/mdemo.c -----------
@@ -6,9 +6,10 @@
#define MWINCLUDECOLORS
#include "windows.h"
#include "wintern.h"        /* for MwSetDesktopWallpaper*/
-
#include "device.h"
-
+#if __ECOS
+#include "ecos_winmain.h"
+#endif
#if DOS_TURBOC
unsigned _stklen = 4096;
#endif
@@ -486,3 +487,10 @@
     }
     return 0;
}
+
+#if __ECOS
+void cyg_user_start(void)
+{
+    start_WinMain_thread(10,0,0);
+}
+#endif
3. 重新配置ecos 选择MW的MWIN方式,去掉nano-x的支持,编译mdemo

(原文件名:ecos-microwindows-mwin.png)

出0入0汤圆

 楼主| 发表于 2011-4-7 16:22:40 | 显示全部楼层
如果大家有什么希望完成的功能,请列一下。
实验室是大家的

出0入0汤圆

 楼主| 发表于 2011-4-8 16:47:20 | 显示全部楼层
实验室的代码已经全部更新了

加入了flnx,就是fltk的nano-x版本
加入是MINI2440和synthetic的touch驱动
让Microwindows的MWIN功能可以顺利应用。
加入了PNG,JPG等图形库
加入PW图形库,适合超小型LCD

代码可以通过下面连接浏览
http://emboslab.hg.sourceforge.net/hgweb/emboslab/ecos-emboslab/rev/9fcc1bff0f13

出0入0汤圆

发表于 2011-4-11 09:22:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-11 09:49:21 | 显示全部楼层
一直未在microwindows上面实现对freetype2汉字的支持,希望楼至赐教,不甚感激!

出0入0汤圆

 楼主| 发表于 2011-4-11 12:00:54 | 显示全部楼层
等周末我试试看,之前用microwidnows 0.90的字体是可以的

出0入0汤圆

发表于 2011-4-11 12:11:16 | 显示全部楼层

出0入0汤圆

发表于 2011-4-11 12:14:47 | 显示全部楼层
不得不支持一下!

出0入0汤圆

发表于 2011-4-11 13:21:09 | 显示全部楼层
在microwindows上显示英文字母和汉字时用freetype2可以,但是显示中文却不行,没有搞定编码的转换

出0入0汤圆

发表于 2011-4-11 13:21:27 | 显示全部楼层
在microwindows上显示英文字母和汉字时用freetype2可以,但是显示中文却不行,没有搞定编码的转换

出0入0汤圆

 楼主| 发表于 2011-4-13 13:50:05 | 显示全部楼层
好像不是这个问题,请问你用的是ecos的那个版本

出0入0汤圆

发表于 2011-4-15 08:31:39 | 显示全部楼层
jh

出0入0汤圆

发表于 2011-4-15 08:56:31 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-4-18 17:06:07 | 显示全部楼层
如何应用eMBosLab的ecos nand驱动和yaffs文件系统
http://blog.csdn.net/rickleaf/archive/2011/04/18/6331583.aspx

一、下载eMBosLab的ecos代码

hg http://emboslab.hg.sourceforge.net:8000/hgroot/emboslab/ecos-emboslab
二、下载nandflash模拟image

https://sourceforge.net/projects/emboslab/files

qemu-mini2440-emboslab-nandimage.tar.bz2
三、配置ecos并且支持yaffs和nandflash驱动

ecosconfig new mini2440 net

ecosconfig add io_nand

ecosconfig add yaffs

配置第一个分区为0-4000
四、编译tests测试yaffs

ecosconfig tree

make tests
五、测试yaffs文件系统

emboslab-qemu-mini2440

emboslab的ecos-emboslab分支编译好的qemu-arm-system

your_nand_bin

emboslab下载的nand仿真用的二进制文件

(dd生成的bin文件可能会显示全部都是坏块,需要清理一次才可以用,

emboslab提供的已经做好了清理,如果您知道怎么重建BBT可以用自己的image)

your_test_image

测试用的image, 你可以用install目录下面tests/fs/yaffs/current里面的二进制文件来测试

准备好以上的文件,我们就可以用下面的命令来运行测试了


emboslab-qemu-mini2440   -M mini2440 -m 128M -mtdblock your_nand_bin -kernel your_test_image -show-cursor -serial stdio

测试不是目的,只是给大家一个通过虚拟平台应用ecos上nand文件系统的方法,你也可以学习如何来写ecos上的nand驱动

等我空下来再把如何写ecos的nand驱动写给大家

(原文件名:ecos-mini2440-yaffs.png)

出0入0汤圆

 楼主| 发表于 2011-4-20 11:41:10 | 显示全部楼层
源代码已经全部上传了,请大家下载

出0入0汤圆

发表于 2011-4-21 07:07:18 | 显示全部楼层
:-D 也可试试RT-Thread + QEMU,

随着RT-Thread的发展,它会不逊色于国外的开源系统,如RTEMS、ecos;而且RT-Thread是开源、开放的,欢迎任何人参与进来。

出0入0汤圆

发表于 2011-4-21 08:14:36 | 显示全部楼层
mark 支持

出0入0汤圆

 楼主| 发表于 2011-4-21 13:15:29 | 显示全部楼层
本人强烈支持国产操作系统,尤其是RT-Thread这样优秀的系统。
emboslab并不是注重于操作系统本身,主要研究如何把虚拟系统用于实际项目。
主要是emboslab目前人力有限,而且ecos和RTEMS相对的功能模块稍微多一点所以先入手了。
另外就是我看到rt-thread已经有mini2440 qemu的版本了。

出0入0汤圆

发表于 2011-4-21 14:32:27 | 显示全部楼层
先占位,关注

出0入0汤圆

发表于 2011-4-26 14:08:00 | 显示全部楼层
关注!

出0入0汤圆

 楼主| 发表于 2011-4-29 17:49:48 | 显示全部楼层
上海免费培训即将开展,请注意本帖!

出0入0汤圆

 楼主| 发表于 2011-5-9 14:27:49 | 显示全部楼层
推迟到5.1以后

出0入0汤圆

发表于 2011-5-9 16:45:18 | 显示全部楼层
RTEMS编译的话,应该是要用rtems.com的4.9的gcc。

出0入0汤圆

 楼主| 发表于 2011-5-11 09:08:10 | 显示全部楼层
目前RTEMS的版本是4.9.5,如果是redhat或者是fedora系列可以直接下载RTEMS的4.9.5编译器。
如果使用的是ubuntu 10.04,需要自己重新通过源码编译 tool-chain
因为我用的ubuntu 10.04 amd64,如果有人需要我可以把这个共享给大家,其实编译器来比较简单。

出0入0汤圆

 楼主| 发表于 2011-5-23 11:36:57 | 显示全部楼层
eMBosLab eCos:
更新内容:

20110519 22:00

1. add flnx demo, you can enable it from ecos configuration file

2. fix nano-x demo configuration issue

出0入0汤圆

发表于 2011-5-24 02:12:29 | 显示全部楼层
学习中!

出0入0汤圆

 楼主| 发表于 2011-5-25 09:26:30 | 显示全部楼层
虚拟实验室RTEMS开发环境的配置(Windows)


1、开发工具下载
请安装msysgit http://code.google.com/p/msysgit/

请下载点击下载 emboslab RTEMS 开发工具包

解压以后有如下一些文件


(原文件名:rtems-windows-tools.PNG)

2、安装MinGW系列工具
依次安装如下几个文件,按默认设置

MinGW-5.1.4.exe

MSYS-1.0.10.exe

有个提示,敲入MinGW的安装目录,回车


(原文件名:aa.png)


msysDTK-1.0.1.exe

修改c:\msys\1.0\etc\fstab为如下内容

view plaincopy to clipboardprint?
c:/MinGW /mingw  
  
c:/opt /opt  
c:/opt/rtems-4.9 /opt/rtems-4.9  

在c:\msys\1.0\etc\profile添加如下内容

view plaincopy to clipboardprint?
export PATH=/opt/rtems-4.9/bin:$PATH  

3、安装RTEMS编译器
运行cmd命令行窗口(如果是windows 7请用管理员方式运行)

执行

C:\msys\1.0\msys.bat

start rtems4.9-tools-5.exe  (注意rtems4.9字符串开头的几个可执行文件要放在同一个目录中)

选择 autoconf 和 arm


(原文件名:rtems-tools-install.PNG)


因为要编译autoconf,所以可能需要比较长的时间,请耐心等待

4、下载eMBosLab的RTEMS和QEMU源码
下载emboslab的RTEMS

git clone git://emboslab.git.sourceforge.net/gitroot/emboslab/rtems-4.9.5-emboslab

下载emboslab的QEMU

git clone git://emboslab.git.sourceforge.net/gitroot/emboslab/qemu-mini2440

在qemu-mini2440做分支切换

git branch checkout -b ecos-emboslab remotes/origin/ecos-emboslab

4、编译emboslab版本的mini2440 QEMU模拟器
解压directx包到MinGW中

在MinGW中执行

tar -C /mingw -xzvf directx-devel.tar.gz

解压并且编译安装SDL

cd

tar -xzvf SDL-1.2.8.tar.gz (this will extract SDL package)
cd SDL-1.2.8
./configure --prefix=/mingw
make
make install

解压并安装zlib

cd
tar -xzvf zlib-1.2.2.tar.gz
cd zlib-1.2.2
./configure --prefix=/mingw
make test
make install

进到刚才下载好的qemu-mini2440的目录

./configure --target-list=arm-softmmu --static

make

就可以在arm-softmmu中看到qemu-system-arm.exe这个可执行文件了,由于是static方式,这个exe不依赖于任何库文件。

5、配置mini2440 BSP包括测试程序
运行cmd命令行窗口(如果是windows 7请用管理员方式运行)

执行

C:\msys\1.0\msys.bat

进入rtems-4.9.5-emboslab

执行

./bootstrap

生成rtems的配置脚本

建立和rtems-4.9.5-emboslab同级的rtems-build目录

进入rtems-build目录

cd rtems-build

执行

../rtems-4.9.5-emboslab/configure --target=arm-rtems4.9 --enable-rtemsbsp=mini2440 --enable-cxx --enable-tests=samples

然后编译

make

再安装

make install

6、应用mini2440 QEMU测试RTEMS测试程序
QEMU加载测试程序

以ticker.exe为例

start qemu-system-arm.exe -S -s -M mini2440 -kernel ticker.exe -show-cursor  -serial file:CON

ticker.exe          为要测试的应用程序,包括路径

-serial file:CON 表示输出串口信息到命令行(Linux的这个选项是 -serial stdio)

GDB下载并运行


arm-rtems4.9-gdb ticker.exe

target remote:1234

load

c


(原文件名:tick_demo.PNG)

出0入0汤圆

 楼主| 发表于 2011-6-28 12:01:32 | 显示全部楼层
自由软件需要大家继续支持
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-23 11:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表