书接上文,RTP里如果想要调用Kernel里的函数,可以通过System Call,那如何添加自己的System Call呢?
VxWorks默认提供的那些System Call是通过静态声明的方式添加的,这种方式比较麻烦,还需要编译VSB。VxWorks567还是建议使用动态加载的方式。
例如,我们在Kernel里写了几个函数
代码语言:javascript复制int test0()
{
int ret = 0;
printf("nKernel: %s() return %dn", __FUNCTION__, ret);
return ret;
}
int test1(int arg1)
{
int ret = 1;
printf("nKernel: %s(%d) return %dn", __FUNCTION__, arg1, ret);
return ret;
}
int test2(int arg1, int arg2)
{
int ret = 2;
printf("nKernel: %s(%d, %d) return %dn", __FUNCTION__, arg1, arg2, ret);
return ret;
}
int test3(int arg1, char *arg2, int arg3)
{
int ret = 3;
printf("nKernel: %s(%d, %s, %d) return %dn", __FUNCTION__, arg1, arg2, arg3, ret);
return ret;
}
Kernel里执行的很正常
如果在RTP里调用它们
代码语言:javascript复制int main()
{
int p0 = 1;
char *p1 = "22";
int p2 = 333;
test0();
test1(p0);
test2(p0,p2);
test3(p0,p1,p2);
return 0;
}
build时就会报错了,更别提执行了
怎么做呢?需要把Kernel的函数封装到一个Handler里,然后把这个Handler注册到系统的System Call Group里。然后,RTP里通过操作系统提供的Trap来访问这个Handler。
第一步:在Kernel里创建struct数据类型,用来表示Kernel函数的入参