VxWorks for LPC2210应用编程实战zz

发信人: gdtyy (gdtyy), 信区: Embedded
标  题: VxWorks for LPC2210应用编程实战
发信站: 水木社区 (Mon Jun 25 23:25:15 2007), 站内

***********************************
* VxWorks for LPC2210应用编程实战 *
***********************************
                      ------ 《ecos增值包》选配之VxWorks应用编程实战
    2007/04/22  [email protected]  www.armecos.com

    vxWorks_romResident.bin试用版下载 483K

    《ecos增值包》用户可以选配VxWorks for LPC2210,以便在EASYARM2200或
SMARTARM2200上进行VxWorks应用程序开发。该选件不单独出售,不含BSP源码,需另行购买
开发环境。如过您满足这些要求,那么希望下面的文章能对您开发VxWorks应用程序有所帮
助。

    VxWorks和ecos一样,都是多任务操作系统,都用GNU工具链开发,只是API函数名略有
不同,因此,我们分别用ecos中介绍过的两个demo程序对照讲解VxWorks应用编程的开发方
法。

    与ucos51和ecos相似,第一次使用操作系统,先弄个多任务跑跑,demo1演示了多任务
并发运行(注:本站也出售ucos51软件包,51工程师也可以跑OS)。3个线程任务同时打印信息
,A线程每秒打印一次,B线程每3秒打印一次,C线程每6秒打印一次。对比这些程序,其实
就是API函数名字不同啦,思路完全相同,这说明OS抽象了硬件和时间流,使我们更接近应
用的实质。下面是demo1源码:

#define STACK_SIZE 2000

void taska(int arg);
void taskb(int arg);
void taskc(int arg);

void demo1(void)
{
    printf("Demo1 Start....../n");

    taskSpawn("taska", 90, 0, STACK_SIZE, taska, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    taskSpawn("taskb", 90, 0, STACK_SIZE, taskb, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    taskSpawn("taskc", 90, 0, STACK_SIZE, taskc, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}

void taska(int arg)
{
    for(;;)
        {
        printf("/tAAAAAA111111 is active.thread data is %d./n", arg);
        taskDelay(100);
        }
}

void taskb(int arg)
{
    for(;;)
        {
        printf("/tBBBBBB333333 is active.thread data is %d./n", arg);
        taskDelay(300);
        }
}

void taskc(int arg)
{
    for(;;)
        {
        printf("/tCCCCCC666666 is active.thread data is %d./n", arg);
        taskDelay(600);
        }
}

    由上可见,VxWorks中创建任务使用taskSpawn,延时使用taskDelay。下表对比了创建
任务和任务延时在ucos51、ecos、VxWorks中的名称。
    ------------------------------------------------------
    |         |      创建任务       |      任务延时      |
    ------------------------------------------------------
    | ucos51  |    OSTaskCreate     |     OSTimeDly      |
    ------------------------------------------------------
    |  ecos   |  cyg_thread_create  |  cyg_thread_delay  |
    ------------------------------------------------------
    | VxWorks |     taskSpawn       |     taskDelay      |
    ------------------------------------------------------

    VxWorks函数语法:

    任务号 = taskSpawn(名称,优先级,选项,堆栈大小,任务函数名,参数1,...参数
10);
    taskDelay(延时tick数);

    测试程序运行结果,Demo1程序创建了3个任务A、B、C,优先级全为10,A每秒显示一次
,B每3秒显示一次,C每6秒显示一次。从显示结果看,显示3个A后显示1个B,显示6个A和2
个B后显示1个C,结果显然正确。

    (demo1运行效果图)

    下面的demo2例子是控制GPIO让蜂鸣器发声的应用程序,响1秒停1秒,周而复始。

#define HAL_WRITE_UINT32( _register_, _value_ ) /
        (*((volatile unsigned int *)(_register_)) = (_value_))

#define LPC2XXX_GPIO_IO0SET       0xE0028004
#define LPC2XXX_GPIO_IO0DIR       0xE0028008
#define LPC2XXX_GPIO_IO0CLR       0xE002800C

#define STACK_SIZE 2000
#define BEEPCON 0x0000080

void task(void);

void demo2(void)
{
    printf("Demo2 Start....../n");

    taskSpawn("task", 90, 0, STACK_SIZE, task, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}

void task(void)
{
    HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0DIR,BEEPCON);

    for(;;)
        {
        HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0SET,BEEPCON);
        taskDelay(100);
        HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0CLR,BEEPCON);
        taskDelay(100);
        }
}

    由上可见,VxWorks支持直接寄存器操作,使用平板内存模式,和ecos操作硬件I/O的方
法一样。

    注意:应用程序使用/**/做注释,如果使用"//"注释,需要去除-ansi编译选项。

    下面图示说明使用方法:

    首先将vxWorks_romResident.bin文件烧写在板子的flash里,设置好跳线。上电后将看
到控制台shell界面,

    打开Tornado,新建downloadable项目,

    (新建项目图)1、2、3
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101550549.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101617722.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101639274.jpg[/img]

    增加demo文件并编译,会提示生成依赖文件,选OK。

    4、5
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101659764.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101716328.jpg[/img]

    设置Target Server(配置文件设置),使用串口通信,9600波特率,好象最高速率为
38400,太高就不容易连接成功,用网络的话就比较快。注意:Core File and Symbols里的
File文件要与烧写在flash里的VxWorks一致,即带调试信息的ELF文件。连接成功会显示成
功信息,托盘里出现一个象靶子一样的图标。

    6、7、8、9
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101736432.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101751982.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/200742310187477.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101821792.jpg[/img]

    下载.out文件

    10
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101848188.jpg[/img]

    启动目标调试器,点那个象蚂蚁一样的图标。打开源文件设置断点什么的,然后点那个
奔跑小人图标,就可以调试了,支持单步、全速等各种调试手段。开始时会询问运行任务函
数名称和参数,如图设置即可。

    13、14、11
    [img]http://bbs.21ic.com/upfiles/img/20074/200742310197112.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101921536.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101937197.jpg[/img]
    串口0控制台运行效果

    12
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423101956852.jpg[/img]

    点击->i图标可以启动主机shell,输入i可以查看任务运行情况。刚开始有4个任务,执
行任务、日志任务、shell终端、wdb调试驻留任务。当运行demo1后再输入i查询,可以看到
多出了3个新任务:taska、taskb、taskc,正是我们在demo1里创建的3个任务。可以清楚看
到任务优先级和延迟剩余时间及状态等信息。

    15、16
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423102015154.jpg[/img]
    [img]http://bbs.21ic.com/upfiles/img/20074/2007423102030305.jpg[/img]
--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.149.56.*]
 

你可能感兴趣的:(VxWorks for LPC2210应用编程实战zz)