您的位置:首页 > 编程语言

VxWorks for LPC2210应用编程实战zz

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

***********************************
* VxWorks for LPC2210应用编程实战 *
***********************************
------ 《ecos增值包》选配之VxWorks应用编程实战
2007/04/22 asdjf@163.com 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




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

4、5



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

6、7、8、9





下载.out文件

10


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

13、14、11



串口0控制台运行效果

12


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

15、16


--

※ 来源:·水木社区 http://newsmth.net·[FROM: 61.149.56.*]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: