Merge pull request #2498 from mcharleb/bringup-m5

POSIX: Critical fix for vdev_posix
This commit is contained in:
Lorenz Meier 2015-07-01 15:13:29 +02:00
commit 9c7450248f
3 changed files with 5 additions and 24 deletions

View File

@ -54,24 +54,10 @@ using namespace device;
extern "C" {
struct timerData {
sem_t &sem;
struct timespec &ts;
timerData(sem_t &s, struct timespec &t) : sem(s), ts(t) {}
~timerData() {}
};
static void timer_cb(void *data)
{
struct timerData *td = (struct timerData *)data;
if (td->ts.tv_sec) {
sleep(td->ts.tv_sec);
}
usleep(td->ts.tv_nsec/1000);
sem_post(&(td->sem));
sem_t *p_sem = (sem_t *)data;
sem_post(p_sem);
PX4_DEBUG("timer_handler: Timer expired");
}
@ -211,7 +197,6 @@ int px4_poll(px4_pollfd_struct_t *fds, nfds_t nfds, int timeout)
int count = 0;
int ret;
unsigned int i;
struct timespec ts;
PX4_DEBUG("Called px4_poll timeout = %d", timeout);
sem_init(&sem, 0, 0);
@ -242,8 +227,7 @@ int px4_poll(px4_pollfd_struct_t *fds, nfds_t nfds, int timeout)
// Use a work queue task
work_s _hpwork;
struct timerData td(sem, ts);
hrt_work_queue(&_hpwork, (worker_t)&timer_cb, (void *)&td, 1000*timeout);
hrt_work_queue(&_hpwork, (worker_t)&timer_cb, (void *)&sem, 1000*timeout);
sem_wait(&sem);
// Make sure timer thread is killed before sem goes

View File

@ -421,10 +421,6 @@ uORB::DeviceNode::appears_updated(SubscriberData *sd)
break;
}
// FIXME - the calls to hrt_called and hrt_call_after seem not to work in the
// POSIX build
#ifndef __PX4_POSIX
/*
* If the interval timer is still running, the topic should not
* appear updated, even though at this point we know that it has.
@ -445,7 +441,6 @@ uORB::DeviceNode::appears_updated(SubscriberData *sd)
sd->update_interval,
&uORB::DeviceNode::update_deferred_trampoline,
(void *)this);
#endif
/*
* Remember that we have told the subscriber that there is data.

View File

@ -46,12 +46,14 @@ void hrt_work_queue_init(void);
int hrt_work_queue(struct work_s *work, worker_t worker, void *arg, uint32_t usdelay);
void hrt_work_cancel(struct work_s *work);
static inline void hrt_work_lock(void);
static inline void hrt_work_lock()
{
//PX4_INFO("hrt_work_lock");
sem_wait(&_hrt_work_lock);
}
static inline void hrt_work_unlock(void);
static inline void hrt_work_unlock()
{
//PX4_INFO("hrt_work_unlock");