凌阳科技大学计划论坛

首页 » eCos技术讨论专区 » 新手玩eCos » 菜鸟学eCos (一、第一个程序LED)
lameck - 2008-4-10 11:57:00
菜鸟学eCos

    这几天学了一点ecos操作系统,并试着在SPCE3200上移植,因为刚刚接触ecos,对环境等还都环太熟悉,在移植过程中遇到了一些问题,呵呵,虽然都是些很简单的问题,可也把我这只鸟难了半天,这里把过程和经验写下来,希望对和我一样的鸟有些帮助:

菜鸟的第一个eCos程序:

  在SPCE3200实验仪上移植eCos操作系统,做一个跑马灯程序.

准备工作:

        1.安装cygwin环境; 

        2.准备tools,这里用gnu4.2forcygwin;

        3.安装eCos配置工具(eCos config tool);

      (具体操作请参考《跟我学eCos嵌入式操作系统在SPCE3200上的应用——环境配置篇》)

注意:这3个步骤须都做正确了,才可以进行后边的工作,我之前就是tools选错了,结果在后边编译ecos库时出现了错误。后来换了tools之后就好了。可以通过对模板中SPCE3200的默认配置进行编译,编译出错,那可能就是你的tools选错了。如果可能顺利通过编译,就可以继续进行下边实验了。

实验步骤:(具体请参考: 《实验指导书——SPCE3200实验箱(eCos基础实验篇)》)

1.S+core IDE中建立"ScoreIDE eCos Project"工程,命名为:eCos_LED

2.针对该工程配置eCos,建立配置文件(.ecc)

      (1).在eCos config tool使用默认模板建立eCos源码包

      (2).并添加"File IO","IOB support for Score SPCE3200"两个组件包

(Build->Packages...,选择添加"File IO","IOB support for Score SPCE3200"两项)

    (3).保存为defautl.ecc

3.编译源码包.

以上几步后会生成"default_install","default_build","default_mlt"三个文件夹,和defautl.ecc文件。

4.在第1步中所建的工程中cyg_user_start.c中编写代码。

  拷贝3中生成的"default_install"目录到S+core工程(eCos_LED工程)目录下,覆盖IDE自动生成的"default_install"目录

5.编译程序,并下载到实验仪运行,可以看见实验仪上的led开始闪烁了。

说明:

一、ecos应用程序的入口函数是:cyg_user_start(),这个函数需要做的事情有:

      1.创建线程,根据需要创建一个或多个。

      2.启动线程,创建的每个线程都需要启动一次。

二、本实验应用程序主要有两步:

      1. cyg_user_start(): 创建线程MainThread,并启动它。

      2. MainThread(): MainThread()线程,实现LED闪烁的功能。

总结知识点:

1>.配置文件(* .ecc文件):

  保存了在ecos confgi tools中对ecos的配置信息。

  在保存.ecc文件时,会生成库建立过程需要的合适文件。使用GNU工具编译源码,生成最终输出文件,ecos库文件libtarget.a。其它一些必要文件,如:附加库文件和链接器脚本文件,也由配置工具生成。

2>.ecos映像:

  ecos的建立过程主要就是生成ecos库。即libtarget.a。库文件输出到安装版本树型目录中即ecos_install\lib目录下。也会生成其它目标文件,如链接器脚本文件。有时还会生成其它文件。

3>. ecos库文件的建立过程使用makefiles和make来帮助生成ecos库。

4>. ecos映像建立过程涉及四个树型目录结构:源代码、建立版本和安装版本树型目录结构、和eCos_mlt目录:

      (ecos\packages)源代码树型目录:就是ecos源代码库,它位于packages目录下。

      (ecos_build)建立版本树型目录:由配置工具生成,包含中间文件,如makefiles和目标文件等。一般地,配置中的每个包在建立版本树型结构中都有自己的目录,该目录用来保存该包的makefiles和目标文件。一般情况下,新建的配置时(还没有编译),生成的ecos_build目录下只有一些和编译相关的makefiles文件。编译后该目录下的子目录会存放一些生成的和该配置有关的中间文件。

      (ecos_install)安装版本树型目录:安装版本树型是ecos主要库文件所在位置并输出头文件,这些头文件在建立应用程序时要用到。库文件位于lib目录下,而头文件位于include目录下。

默认情况下,建立版本和安装版本的树型目录中均包含相同的工作目录。一般情况下,新建的配置时(还没有编译),生成的ecos_install目录下,include里只有一些必须的头文件,lib里什么都没有;而在编译之后,include里会增加一些和配置相关的头文件,lib里会存放编译生成的库文件和部分目标文件.

      (ecos_mlt)目录:存放配置工具MLT文件。


//cyg_user_start.c代码参考:

//====================================================

//文 件 名:cyg_user_start.c

//功能描述: eCos工程入口

//维护记录:

//====================================================

#include <cyg/hal/hal_arch.h>          // CYGNUM_HAL_STACK_SIZE_TYPICAL

#include <cyg/kernel/kapi.h>

#include <cyg/fileio/fileio.h>

#include <stdio.h>

#include <stdlib.h>

#include <cyg/io/spce3200_iob.h>

#include <cyg/infra/testcase.h>        // test macros

#include <unistd.h>

void MainThread(cyg_addrword_t data);

cyg_uint8 MainThread_Stack[4096];                                // 线程用到的堆栈

cyg_handle_t hMainThread;                                            // 线程句柄

cyg_thread infohMainThread;                                          // 线程信息结构体

//====================================================

// 语法格式:void cyg_user_start(void)

// 功能描述: 主函数

// 入口参数: 无

// 出口参数: 无

//====================================================

void cyg_user_start(void)

{

      /************************************************/

      /*  TODO: add your init code here                    */

      /************************************************/   

      //创建MainThread线程                                                               

      cyg_thread_create(20,                                                          // 线程优先级

                                  MainThread,                                            // 线程函数

                                  0,                                                            // 线程参数

                                  "Main Thread",                                          // 线程名称

                                  (void *)MainThread_Stack,                        // 线程堆栈基址

                                  4096,                                                      // 线程堆栈大小

                                  &hMainThread,                                        // 返回线程句柄

                                  &infohMainThread);                                  // 返回线程信息结构体

      cyg_thread_resume(hMainThread);                                        // 启动MainThread线程

}

//====================================================

// 语法格式:void MainThread(cyg_addrword_t data)

// 功能描述: 主线程

// 入口参数: data  -      由OS传递

// 出口参数: 无

//====================================================

void MainThread(cyg_addrword_t data)                                  // MainThrea线程

{

      /************************************************/

      /*  TODO: add your init code here                        */

      /************************************************/

      cyg_int32 fd_LED;

      cyg_uint32 Key;

      printf("\nRunLED thread strat\n");

      fd_LED = open("/dev/iob", O_WRONLY | O_NONBLOCK);     

      Key = 0x0000ff00;

      cyg_fs_fsetinfo(fd_LED,CYGNUM_DEVS_IOB_SPCE3200_ATTRIB,&Key,4);

      Key = 0x1;

      while(1)

              {

                    write(fd_LED,&Key,1);

                    printf(" Key = %d\n", Key);

                    Key = Key << 1;

                    if(Key > 0x20)

                            Key = 0x01;

                    cyg_thread_delay(50);               

              }   

}

qxq005 - 2008-4-10 19:13:00
呵呵,好~~一起学~~!!
luckymxq - 2008-4-12 16:02:00
添加“File IO”、“IOB support for Score SPCE3200”两个组件包时,是在ecos confgi tools中的Build下选择Packages,然后会出来一个对话框,这时只需在左边的框中找到这两个组件添天到右边然后确定即可.
 1 
查看完整版本: 菜鸟学eCos (一、第一个程序LED)