发信人: 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.*]