mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-28 02:36:37 +08:00
OS X porting: Make unit tests compile on OS X
This commit is contained in:
@@ -120,7 +120,6 @@ ifeq ($(CONFIG_BOARD),)
|
|||||||
$(error Board config does not define CONFIG_BOARD)
|
$(error Board config does not define CONFIG_BOARD)
|
||||||
endif
|
endif
|
||||||
ARCHDEFINES += -DCONFIG_ARCH_BOARD_$(CONFIG_BOARD) \
|
ARCHDEFINES += -DCONFIG_ARCH_BOARD_$(CONFIG_BOARD) \
|
||||||
-D__PX4_LINUX -D__PX4_POSIX \
|
|
||||||
-Dnoreturn_function= \
|
-Dnoreturn_function= \
|
||||||
-I$(PX4_BASE)/src/modules/systemlib \
|
-I$(PX4_BASE)/src/modules/systemlib \
|
||||||
-I$(PX4_BASE)/src/lib/eigen \
|
-I$(PX4_BASE)/src/lib/eigen \
|
||||||
@@ -128,6 +127,14 @@ ARCHDEFINES += -DCONFIG_ARCH_BOARD_$(CONFIG_BOARD) \
|
|||||||
-I$(PX4_BASE)/mavlink/include/mavlink \
|
-I$(PX4_BASE)/mavlink/include/mavlink \
|
||||||
-Wno-error=shadow
|
-Wno-error=shadow
|
||||||
|
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
ifeq ($(UNAME_S),Linux)
|
||||||
|
ARCHDEFINES += -D__PX4_POSIX -D__PX4_LINUX
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
ARCHDEFINES += -D__PX4_POSIX -D__PX4_DARWIN
|
||||||
|
endif
|
||||||
|
|
||||||
# optimisation flags
|
# optimisation flags
|
||||||
#
|
#
|
||||||
ARCHOPTIMIZATION = $(MAXOPTIMIZATION) \
|
ARCHOPTIMIZATION = $(MAXOPTIMIZATION) \
|
||||||
|
|||||||
@@ -135,6 +135,9 @@ I2C::init()
|
|||||||
int
|
int
|
||||||
I2C::transfer(const uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len)
|
I2C::transfer(const uint8_t *send, unsigned send_len, uint8_t *recv, unsigned recv_len)
|
||||||
{
|
{
|
||||||
|
#ifndef __PX4_LINUX
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
struct i2c_msg msgv[2];
|
struct i2c_msg msgv[2];
|
||||||
unsigned msgs;
|
unsigned msgs;
|
||||||
struct i2c_rdwr_ioctl_data packets;
|
struct i2c_rdwr_ioctl_data packets;
|
||||||
@@ -191,11 +194,15 @@ I2C::transfer(const uint8_t *send, unsigned send_len, uint8_t *recv, unsigned re
|
|||||||
} while (retry_count++ < _retries);
|
} while (retry_count++ < _retries);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
I2C::transfer(struct i2c_msg *msgv, unsigned msgs)
|
I2C::transfer(struct i2c_msg *msgv, unsigned msgs)
|
||||||
{
|
{
|
||||||
|
#ifndef __PX4_LINUX
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
struct i2c_rdwr_ioctl_data packets;
|
struct i2c_rdwr_ioctl_data packets;
|
||||||
int ret;
|
int ret;
|
||||||
unsigned retry_count = 0;
|
unsigned retry_count = 0;
|
||||||
@@ -227,16 +234,18 @@ I2C::transfer(struct i2c_msg *msgv, unsigned msgs)
|
|||||||
} while (retry_count++ < _retries);
|
} while (retry_count++ < _retries);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int I2C::ioctl(device::file_t *filp, int cmd, unsigned long arg)
|
int I2C::ioctl(device::file_t *filp, int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
//struct i2c_rdwr_ioctl_data *packets = (i2c_rdwr_ioctl_data *)(void *)arg;
|
//struct i2c_rdwr_ioctl_data *packets = (i2c_rdwr_ioctl_data *)(void *)arg;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
#ifdef __PX4_LINUX
|
||||||
case I2C_RDWR:
|
case I2C_RDWR:
|
||||||
warnx("Use I2C::transfer, not ioctl");
|
warnx("Use I2C::transfer, not ioctl");
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
/* give it to the superclass */
|
/* give it to the superclass */
|
||||||
return VDev::ioctl(filp, cmd, arg);
|
return VDev::ioctl(filp, cmd, arg);
|
||||||
|
|||||||
@@ -66,6 +66,11 @@
|
|||||||
#define DEVIOCGDEVICEID _DEVICEIOC(2)
|
#define DEVIOCGDEVICEID _DEVICEIOC(2)
|
||||||
|
|
||||||
#ifdef __PX4_POSIX
|
#ifdef __PX4_POSIX
|
||||||
|
|
||||||
|
#ifndef SIOCDEVPRIVATE
|
||||||
|
#define SIOCDEVPRIVATE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DIOC_GETPRIV SIOCDEVPRIVATE
|
#define DIOC_GETPRIV SIOCDEVPRIVATE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -77,6 +77,40 @@ static void hrt_unlock(void)
|
|||||||
sem_post(&_hrt_lock);
|
sem_post(&_hrt_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef clock_gettime
|
||||||
|
#include <mach/mach_time.h>
|
||||||
|
#define MAC_NANO (+1.0E-9)
|
||||||
|
#define MAC_GIGA UINT64_C(1000000000)
|
||||||
|
#define CLOCK_MONOTONIC 1
|
||||||
|
#define clockid_t int
|
||||||
|
|
||||||
|
static double px4_timebase = 0.0;
|
||||||
|
static uint64_t px4_timestart = 0;
|
||||||
|
|
||||||
|
int clock_gettime(clockid_t clk_id, struct timespec *t)
|
||||||
|
{
|
||||||
|
if (clk_id != CLOCK_MONOTONIC) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX multithreading locking
|
||||||
|
if (!px4_timestart) {
|
||||||
|
mach_timebase_info_data_t tb = { 0 };
|
||||||
|
mach_timebase_info(&tb);
|
||||||
|
px4_timebase = tb.numer;
|
||||||
|
px4_timebase /= tb.denom;
|
||||||
|
px4_timestart = mach_absolute_time();
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(t, 0, sizeof(*t));
|
||||||
|
|
||||||
|
double diff = (mach_absolute_time() - px4_timestart) * px4_timebase;
|
||||||
|
t->tv_sec = diff * MAC_NANO;
|
||||||
|
t->tv_nsec = diff - (t->tv_sec * MAC_GIGA);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get absolute time.
|
* Get absolute time.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -86,6 +86,21 @@
|
|||||||
#define PX4_WARN(...) __px4_log_verbose("WARN", __VA_ARGS__)
|
#define PX4_WARN(...) __px4_log_verbose("WARN", __VA_ARGS__)
|
||||||
#define PX4_ERR(...) __px4_log_verbose("ERROR", __VA_ARGS__)
|
#define PX4_ERR(...) __px4_log_verbose("ERROR", __VA_ARGS__)
|
||||||
|
|
||||||
|
#elif defined(__PX4_DARWIN)
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#define __px4_log_threads(level, ...) { \
|
||||||
|
printf("%-5s %ld ", level, pthread_self());\
|
||||||
|
printf(__VA_ARGS__);\
|
||||||
|
printf(" (file %s line %d)\n", __FILE__, __LINE__);\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PX4_DEBUG(...) __px4_log_omit("DEBUG", __VA_ARGS__)
|
||||||
|
#define PX4_INFO(...) __px4_log("INFO", __VA_ARGS__)
|
||||||
|
#define PX4_WARN(...) __px4_log_verbose("WARN", __VA_ARGS__)
|
||||||
|
#define PX4_ERR(...) __px4_log_verbose("ERROR", __VA_ARGS__)
|
||||||
|
|
||||||
#elif defined(__PX4_ROS)
|
#elif defined(__PX4_ROS)
|
||||||
|
|
||||||
#define PX4_DBG(...)
|
#define PX4_DBG(...)
|
||||||
|
|||||||
@@ -68,10 +68,16 @@ typedef int px4_task_t;
|
|||||||
#define SCHED_PRIORITY_MAX sched_get_priority_max(SCHED_FIFO)
|
#define SCHED_PRIORITY_MAX sched_get_priority_max(SCHED_FIFO)
|
||||||
#define SCHED_PRIORITY_MIN sched_get_priority_min(SCHED_FIFO)
|
#define SCHED_PRIORITY_MIN sched_get_priority_min(SCHED_FIFO)
|
||||||
#define SCHED_PRIORITY_DEFAULT sched_get_priority_max(SCHED_FIFO)
|
#define SCHED_PRIORITY_DEFAULT sched_get_priority_max(SCHED_FIFO)
|
||||||
|
#elif defined(__PX4_DARWIN)
|
||||||
|
#define SCHED_PRIORITY_MAX sched_get_priority_max(SCHED_FIFO)
|
||||||
|
#define SCHED_PRIORITY_MIN sched_get_priority_min(SCHED_FIFO)
|
||||||
|
#define SCHED_PRIORITY_DEFAULT sched_get_priority_max(SCHED_FIFO)
|
||||||
#elif defined(__PX4_QURT)
|
#elif defined(__PX4_QURT)
|
||||||
#define SCHED_PRIORITY_MAX 0
|
#define SCHED_PRIORITY_MAX 0
|
||||||
#define SCHED_PRIORITY_MIN 0
|
#define SCHED_PRIORITY_MIN 0
|
||||||
#define SCHED_PRIORITY_DEFAULT 0
|
#define SCHED_PRIORITY_DEFAULT 0
|
||||||
|
#else
|
||||||
|
#error "No target OS defined"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef int px4_task_t;
|
typedef int px4_task_t;
|
||||||
|
|||||||
@@ -55,15 +55,19 @@ add_definitions(-DERROR=-1)
|
|||||||
add_definitions(-DOK=0)
|
add_definitions(-DOK=0)
|
||||||
add_definitions(-D_UNIT_TEST=)
|
add_definitions(-D_UNIT_TEST=)
|
||||||
add_definitions(-D__PX4_POSIX)
|
add_definitions(-D__PX4_POSIX)
|
||||||
add_definitions(-D__PX4_LINUX)
|
|
||||||
add_definitions(-D__PX4_POSIX)
|
|
||||||
|
|
||||||
# check
|
# check
|
||||||
add_custom_target(unittests COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
|
add_custom_target(unittests COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
|
||||||
|
|
||||||
function(add_gtest)
|
function(add_gtest)
|
||||||
foreach(test_name ${ARGN})
|
foreach(test_name ${ARGN})
|
||||||
target_link_libraries(${test_name} gtest_main pthread rt )
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
target_link_libraries(${test_name} gtest_main pthread )
|
||||||
|
add_definitions(-D__PX4_DARWIN)
|
||||||
|
else()
|
||||||
|
target_link_libraries(${test_name} gtest_main pthread rt )
|
||||||
|
add_definitions(-D__PX4_LINUX)
|
||||||
|
endif()
|
||||||
add_test(NAME ${test_name} COMMAND ${test_name} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
add_test(NAME ${test_name} COMMAND ${test_name} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
add_dependencies(unittests ${test_name})
|
add_dependencies(unittests ${test_name})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|||||||
Reference in New Issue
Block a user