概述
可根据手册进行 can-festival 源码移植与开发,其中包含有 xenomai 的编译方法,可快速移植并测试实时程序
在 Linux 系统中, CAN 总线接口设备作为网络设备被系统进行统一管理,所以使用标准 posix socket 接口操作 can 设备,在编译实时程序时只需在链接时添加 xenomai 库即可完成 posix rt 程序编译
在使用 rtcan 驱动时,通过 Alchemy 接口操作 rtcan 设备即可
详细规则如下
// ...
// 通过 RTCAN_SOCKET 宏控制驱动普通 can 设备以及 rtcan 设备
#define RTCAN_SOCKET
#ifdef RTCAN_SOCKET
#include "rtdm/rtcan.h"
#define CAN_IFNAME "rtcan%s"
#define CAN_SOCKET rt_dev_socket
#define CAN_CLOSE rt_dev_close
#define CAN_RECV rt_dev_recv
#define CAN_SEND rt_dev_send
#define CAN_BIND rt_dev_bind
#define CAN_IOCTL rt_dev_ioctl
#define CAN_SETSOCKOPT rt_dev_setsockopt
#define CAN_ERRNO(err) (-err)
#else
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include "linux/can.h"
#include "linux/can/raw.h"
#include "net/if.h"
#ifndef PF_CAN
#define PF_CAN 29
#endif
// ...
在链接时需添加如下链接库即可
Warning
target_link_libraries(canfestival_can_socket PUBLIC
-Wl,--no-as-needed -Wl,@${XENO_LIBS_DIR}/cobalt.wrappers
-Wl,@${XENO_LIBS_DIR}/modechk.wrappers ${XENO_LIBS_DIR}/xenomai/bootstrap.o
-Wl,--wrap=main
-Wl,--dynamic-list=${XENO_LIBS_DIR}/dynlist.ld
alchemy copperplate
cobalt modechk
)
以 linux 系统为例, 安装方式如下
Warning 其他部分则需要调整 can-festival 源码中 times-xxx 的实现部分
目录结构
├── drivers
│ ├── can_socket
│ │ ├── can_socket.c
│ │ └── CMakeLists.txt
│ ├── timers_unix
│ │ ├── Makefile
│ │ ├── Makefile.in
│ │ ├── timers_unix.c
│ ├── timers_xeno
│ │ ├── Makefile
│ │ ├── Makefile.in
│ │ └── timers_xeno.c
│ └── unix
│ ├── libcanfestival_unix.a
│ ├── Makefile
│ ├── Makefile.in
│ ├── unix.c
用户需根据目标产物更换不用协议层驱动
set(
SRC_LISTS
example/TestMasterMicroMod/TestMasterMicroMod.c
example/TestMasterMicroMod/TestMaster.c
# ...
# ...
src/timer.c
# drivers/timers_unix/timers_unix.c # 编译标准 posix 接口的协议层驱动实现
drivers/timers_xeno/timers_xeno.c # 编译 Alchemy 接口的协议层驱动实现
drivers/unix/unix.c
)
add_executable(${CMAKE_PROJECT_NAME} ${SRC_LISTS})