当前位置: 首页 > news >正文

网站背景色网站设计评分标准

网站背景色,网站设计评分标准,南京网站工作室,asp.net实用网站开发版权声明#xff1a;本文为本文为博主原创文章#xff0c;转载请注明出处。如有错误#xff0c;欢迎指正。1. 引出问题上一篇文章xenomai内核解析--双核系统调用(一)以X86处理器为例#xff0c;分析了xenomai内核调用的流程#xff0c;读了以后可能会觉得缺了点什么#…版权声明本文为本文为博主原创文章转载请注明出处。如有错误欢迎指正。1. 引出问题上一篇文章xenomai内核解析--双核系统调用(一)以X86处理器为例分析了xenomai内核调用的流程读了以后可能会觉得缺了点什么你可能会有以下疑问系统中的两个内核都是POSIX接口实现系统调用那么我写一个POSIX接口的应用程序怎样知道它调用的内核或者说怎样成为运行在cobalt内核的RT应用而不是普通linux应用对于同一个POSIX接口可能我的程序中既需要xenomai内核提供服务(xenomai 系统调用)又需要调用linux内核提供服务(linux内核系统调用)或者说既有libcobalt又有glibc库他们是如何实现或区分的2. 编译链接对于问题1答案是由编译时链接的库决定如果普通的编译则该应用编译后是一个普通linux运用。如果要编译为xenomai应用则需要链接到xenomai库那如何设置编译链接参数编译安装xenomai库后可通过执行/usr/bin/xeno-config来获取。$/usr/bin/xeno-config --helpxeno-config --verbose--corecobalt--version3.1--ccgcc--ccld/usr/bin/wrap-link.sh gcc--archx86--prefix/usr--library-dir/usr/libUsage xeno-config OPTIONSOptions :--help--v,--verbose--version--cc--ccld--arch--prefix--[skin]posix|vxworks|psos|alchemy|rtdm|smokey|cobalt--auto-init|auto-init-solib|no-auto-init--mode-check|no-mode-check--cflags--ldflags--lib*-dir|libdir|user-libdir--core--info--compat复制代码例如编译一个POSIX接口的实时应用,参数--cflags表示编译指定接口(skin)--posix,就能得到编译该程序的gcc参数了$/usr/bin/xeno-config --posix --cflags-I/usr/include/xenomai/cobalt -I/usr/include/xenomai -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -D__COBALT_WRAP__复制代码再看链接--ldflags表示链接,如下得到链接参数$/usr/bin/xeno-config --ldflags --posix-Wl,--no-as-needed -Wl,/usr/lib/cobalt.wrappers -Wl,/usr/lib/modechk.wrappers /usr/lib/xenomai/bootstrap.o -Wl,--wrapmain -Wl,--dynamic-list/usr/lib/dynlist.ld -L/usr/lib -lcobalt -lmodechk -lpthread -lrt复制代码这样就将POSIX接口源码编译成一个xenomai可执行程序了。通常我们会将获取编译参数的操作直接放到Makefile里编译时直接执行获取使用这里给一个简单的Makefile示例如下XENO_CONFIG : /usr/xenomai/bin/xeno-configPROJPATH .CFLAGS : $(shell $(XENO_CONFIG) --posix --alchemy --cflags)LDFLAGS : $(shell $(XENO_CONFIG) --posix --alchemy --ldflags)INCFLAGS -I$(PROJPATH)/include/EXECUTABLE : rt-tasksrc $(wildcard ./*.c)obj $(patsubst %.c, %.o, $(src))all: $(EXECUTABLE)$(EXECUTABLE): $(obj)$(CC) -g -o $ $^ $(INCFLAGS) $(CFLAGS) $(LDFLAGS)%.o:%.c$(CC) -g -o $ -c $ $(INCFLAGS) $(CFLAGS) $(LDFLAGS).PHONY: cleanclean:rm -f $(EXECUTABLE) $(obj)复制代码3. libcobalt中的实现下面来看问题2既然我们已将一个接口链接到实时内核库libcobalt当然由实时内核库libcobalt来区分该发起linux内核调用还是xenomai内核系统。与上一篇文章一样以一个POSIX接口pthread_cretate()来解析libcobalt中的实现。xenomai线程的创建流程比较复杂需要先让linux创建普通线程然后再由xenomai创建该线程的shadow 线程即xenomai调度的实时线程很符合我们上面的提出的问题2。 说到这先简答介绍一下xenomai实时线程的创建详细的创建流程后面会写专门写一篇文章解析敬请期待。pthread_cretate()不是一个系统调用由NPTL(Native POSIX Threads Library)实现(NPTL是Linux 线程实现的现代版由UlrichDrepper 和Ingo Molnar 开发以取代LinuxThreads)NPTL负责一个用户线程的用户空间栈创建、内存分配、初始化等工作与linux内核配合完成线程的创建。每一线程映射一个单独的内核调度实体(KSEKernel Scheduling Entity)。内核分别对每个线程做调度处理。线程同步操作通过内核系统调用实现。xenomai coblat作为实时任务的调度器每个实时线程需要对应到 coblat调度实体如果要创建实时线程就需要像linux那样NPTL与linux 内核深度结合那么coblat与libcoblat实现将会变得很复杂。在这里xenomai使用了一种方式由NPTL方式去完成实时线程实体的创建(linux部分)在普通线程的基础上附加一些属性对应到xenomai cobalt内核实体时能被实时内核cobalt调度。所以libcoblat库中的实时线程创建函数pthread_cretate最后还是需要使用 glibc的pthread_cretate函数xenomai只是去扩展glibc pthread_cretate创建的线程使这个线程可以在实时内核cobalt调度。pthread_cretate()在libcobalt中pthread.h文件中定义如下COBALT_DECL(int, pthread_create(pthread_t *ptid_r,const pthread_attr_t *attr,void *(*start) (void *),void *arg));复制代码COBALT_DECL宏在wrappers.h中如下,展开上面宏会为pthread_create()生成三个类型函数#define __WRAP(call)__wrap_ ## call#define __STD(call)__real_ ## call#define __COBALT(call)__cobalt_ ## call#define __RT(call)__COBALT(call)#define COBALT_DECL(T, P)\__typeof__(T) __RT(P);\__typeof__(T) __STD(P); \__typeof__(T) __WRAP(P)int __cobalt_pthread_create(pthread_t *ptid_r,const pthread_attr_t *attr,void *(*start) (void *),void *arg);int __wrap_pthread_create(pthread_t *ptid_r,const pthread_attr_t *attr,void *(*start) (void *),void *arg);int __real_pthread_create(pthread_t *ptid_r,const pthread_attr_t *attr,void *(*start) (void *),void *arg);复制代码声明pthread_create()函数的这三个宏意思为:__RT(P):__cobalt_pthread_create 表示Cobalt实现的POSIX函数__STD(P):__real_pthread_create表示原始的POSIX函数(Linux glibc实现)cobalt库内部通过它来表示调用原始的POSIX函数(glibc NPTL).__WRAP(P)__wrap_pthread_create是__cobalt_pthread_create 的弱别名如果编译器编译时知道有该函数其它的实现该函数就会被覆盖。主要关注前面两个对于最后一个宏如果外部库想覆盖已有的函数应提供其自己的__wrap_pthread_create()实现来覆盖Cobalt实现的pthread_create()版本。 原始的Cobalt实现仍可以引用为__COBALT(pthread_create)。由宏COBALT_IMPL来定义#define COBALT_IMPL(T, I, A)\__typeof__(T) __wrap_ ## I A __attribute__((alias(__cobalt_ __stringify(I)), weak));\__typeof__(T) __cobalt_ ## I A复制代码最后cobalt库函数pthread_create实现主体为(xenomai3.x.x\lib\cobalt\thread.c)COBALT_IMPL(int, pthread_create, (pthread_t *ptid_r,const pthread_attr_t *attr,void *(*start) (void *), void *arg)){pthread_attr_ex_t attr_ex;......return pthread_create_ex(ptid_r, attr_ex, start, arg);}复制代码COBALT_IMPL定义了__cobalt_pthread_create函数及该函数的一个弱别名__wrap_pthread_create,调用这两个函数执行的是同一个函数体。对于 NPTL函数pthread_create,在Cobalt库里使用__STD()修饰展开后即__real_pthread_create()其实只是NPTL pthread_create()的封装__real_pthread_create()会直接调用 NPTL pthread_create,在lib\cobalt\wrappers.c实现如下/* pthread */__weakint __real_pthread_create(pthread_t *ptid_r,const pthread_attr_t * attr,void *(*start) (void *), void *arg){return pthread_create(ptid_r, attr, start, arg);}复制代码它调用的就是glibc中的pthread_create函数.同样我们接着__cobalt_pthread_create()看哪里调用的.int pthread_create_ex(pthread_t *ptid_r,const pthread_attr_ex_t *attr_ex,void *(*start) (void *), void *arg){......__STD(sem_init(iargs.sync, 0, 0));ret __STD(pthread_create(lptid, attr, cobalt_thread_trampoline, iargs));/*__STD 调用标准库的函数*/if (ret) {__STD(sem_destroy(iargs.sync));return ret;}__STD(clock_gettime(CLOCK_REALTIME, timeout));.....}复制代码下面再看另一个例子实时任务在代码中使用了linux的网络套接字(xenomai任务也是一个linux任务也可以使用linux来提供服务只不过会影响实时性)有以下代码....int sockfd,ret;struct sockaddr_in addr;sockfd socket(PF_INET, SOCK_STREAM, 0);.....bind(sockfd, (struct sockaddr *)my_addr,sizeof(struct sockaddr_in));....复制代码该代码编译时链接到了libcobaltsocket()函数即libcobalt中的__cobalt_socket()其定义在xenomai-3.x.x\lib\cobalt\rtdm.c,如下COBALT_IMPL(int, socket, (int protocol_family, int socket_type, int protocol)){int s;s XENOMAI_SYSCALL3(sc_cobalt_socket, protocol_family,socket_type, protocol);if (s 0) {s __STD(socket(protocol_family, socket_type, protocol));}return s;}复制代码可以看到libcobalt中的函数会先尝试调用实时内核cobalt的系统调用 当cobalt系统调用不成功的时候才继续尝试通过__STD()宏来调用linux系统调用(cobalt内核根据socket协议类型参数PF_INET,SOCK_STREAM判断)这样就有效的分清了是linux系统调用还是xenomai系统调用。一般情况下可以直接在代码中使用__STD()宏指明我们调用的linux内核的服务,修改如下....int sockfd,ret;struct sockaddr_in addr;sockfd __STD(socket(PF_INET, SOCK_STREAM, 0));.....__STD(bind(sockfd, (struct sockaddr *)my_addr,sizeof(struct sockaddr_in)));....复制代码现在一切都明了了一个函数编译时通过参数链接到xenomai库后通过__STD()宏来表示使用linux接口。4. 总结在实时程序或实时库libcobalt中通过__STD()宏来表示使用linux接口。对于一个未指明的接口libcobalt会先尝试发起xenomai系统调用不成功会接着尝试linux内核系统调用。
http://www.huolong8.cn/news/47409/

相关文章:

  • 在线网页游戏网站搜索竞价
  • 专业的网站建设公司电话互联网网站建设问卷调查
  • 芜湖那里帮人做销售网站建筑招聘最好的网站
  • 网站开发的硬件环境是什么桥头网站建设公司
  • 建设网站价格网站开发工具的
  • 南昌企业网站建设哪家好免费建设com网站
  • 一年网站维护wordpress网站插件下载失败
  • 外贸网站有哪些平台工程项目信息查询平台
  • 班级网站建设活动方案开源软件开发平台
  • 域名和网站建设静态网站末班
  • 东莞资深网站建设做介绍翻译英文网站
  • 哪类网站赚钱 优帮云潍坊做网站的网络公司
  • 做网站需要icp经营许可证网站建设的来源
  • 网站设计学习机构怎么做照片网站
  • 网站能不能自己做wordpress插件路径
  • 百度用户服务中心人工24小时电话深圳seo优化外包公司
  • 做同城购物网站做导航网站赚钱
  • php网站识别手机优秀网站设计平台
  • 公司企业网站设计尺寸参考消息电子版官网
  • 腾讯微信山东区建站推广中心wordpress安装好之后怎么用
  • 营销型网站的价格中英文切换网站
  • wordpress content widgetsseowhy
  • txt做网站如何加图片北京装饰公司十大排名
  • seo站内优化培训wordpress免登录支付
  • 外贸做的亚马逊网站是哪个北京网页制作公司
  • 莆田有哪几家做网站设计的晋江网站建设联系电话
  • 终身免费网站建设加强企业网站建设的通知
  • 镇平做网站wordpress+高性能
  • 广州网站建设大公司排名查看邮箱注册的网站
  • 福永响应式网站建设软件开发的步骤