点击查看《Xenomai/IPIPE源代码情景解析》
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!
6.2.2 Xenomai3:创建实时线程第一弹之改头换面pthread_create
按照《6.2.1 Xenomai3: hello world演示线程创建》演示的例子,“helloworld”线程是由pthread_create创建的。pthread_create 是 POSIX 线程(pthread)库中的一个函数,用于创建一个新的线程。
使用gdb ./hello进行调试,执行break 56在第56行设置断点。执行run开始运行,在第56行中断。

执行break pthread_create,在pthread库的pthread_create.c中第625行即pthread_create函数设置中断断点。
执行c,触发中断。
执行bt命令,得到当前的函数执行堆栈。

在hello.c的第56行,原先是直接调用libpthread库的pthread_create函数,但是从堆栈信息来看,反而改头换面,调用了libcobalt库的__wrap_pthread_create函数。这是如何做到的?
从《6.2.1 Xenomai3: hello world演示线程创建》的makefile可知,编译链接时使用了Xenomai posix skin:
获取编译参数
root@u2204:~/ipipe-arm64/xenomai_install# DESTDIR=$(pwd) usr/xenomai/bin/xeno-config --skin=posix --cflags
-I/root/ipipe-arm64/xenomai_install/usr/xenomai/include/cobalt -I/root/ipipe-arm64/xenomai_install/usr/xenomai/include -march=armv8-a -D_GNU_SOURCE -D_REENTRANT -fasynchronous-unwind-tables -D__COBALT__ -D__COBALT_WRAP__
获取链接参数
root@u2204:~/ipipe-arm64/xenomai_install# DESTDIR=$(pwd) usr/xenomai/bin/xeno-config --skin=posix --ldflags
-Wl,--no-as-needed -Wl,@/root/ipipe-arm64/xenomai_install/usr/xenomai/lib/cobalt.wrappers -Wl,@/root/ipipe-arm64/xenomai_install/usr/xenomai/lib/modechk.wrappers /root/ipipe-arm64/xenomai_install/usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrap=main -Wl,--dynamic-list=/root/ipipe-arm64/xenomai_install/usr/xenomai/lib/dynlist.ld -L/root/ipipe-arm64/xenomai_install/usr/xenomai/lib -lcobalt -lmodechk -lpthread -lrt -march=armv8-a
关键点,是链接参数中的一个标志:
-Wl,@/root/xenomai/xenomai-v3.2.1/lib/cobalt/cobalt.wrappers
-Wl,@/root/xenomai/xenomai-v3.2.1/lib/cobalt/cobalt.wrappers
//文件内容
# cat lib/cobalt/cobalt.wrappers
--wrap pthread_attr_init
--wrap pthread_create
--wrap pthread_setschedparam
--wrap pthread_getschedparam
--wrap pthread_setschedprio
--wrap pthread_yield
--wrap sched_yield
--wrap sched_get_priority_min
--wrap sched_get_priority_max
--wrap sched_setscheduler
--wrap sched_getscheduler
--wrap pthread_kill
--wrap

最低0.47元/天 解锁文章
1227






