mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-26 06:33:33 +08:00
Revert "STM32 NuttX driver: Edge-triggered poll(), sort of fixes #35"
This reverts commit 22787651e6.
This commit is contained in:
@@ -194,7 +194,8 @@ class CanDriver : public uavcan::ICanDriver, uavcan::Noncopyable
|
|||||||
public:
|
public:
|
||||||
template <unsigned RxQueueCapacity>
|
template <unsigned RxQueueCapacity>
|
||||||
CanDriver(CanRxItem (&rx_queue_storage)[UAVCAN_STM32_NUM_IFACES][RxQueueCapacity])
|
CanDriver(CanRxItem (&rx_queue_storage)[UAVCAN_STM32_NUM_IFACES][RxQueueCapacity])
|
||||||
: if0_(bxcan::Can[0], update_event_, 0, rx_queue_storage[0], RxQueueCapacity)
|
: update_event_(*this)
|
||||||
|
, if0_(bxcan::Can[0], update_event_, 0, rx_queue_storage[0], RxQueueCapacity)
|
||||||
#if UAVCAN_STM32_NUM_IFACES > 1
|
#if UAVCAN_STM32_NUM_IFACES > 1
|
||||||
, if1_(bxcan::Can[1], update_event_, 1, rx_queue_storage[1], RxQueueCapacity)
|
, if1_(bxcan::Can[1], update_event_, 1, rx_queue_storage[1], RxQueueCapacity)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -34,9 +34,11 @@ class BusEvent
|
|||||||
chibios_rt::CounterSemaphore sem_;
|
chibios_rt::CounterSemaphore sem_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BusEvent()
|
BusEvent(CanDriver& can_driver)
|
||||||
: sem_(0)
|
: sem_(0)
|
||||||
{ }
|
{
|
||||||
|
(void)can_driver;
|
||||||
|
}
|
||||||
|
|
||||||
bool wait(uavcan::MonotonicDuration duration);
|
bool wait(uavcan::MonotonicDuration duration);
|
||||||
|
|
||||||
@@ -56,15 +58,13 @@ public:
|
|||||||
|
|
||||||
#elif UAVCAN_STM32_NUTTX
|
#elif UAVCAN_STM32_NUTTX
|
||||||
|
|
||||||
/**
|
|
||||||
* All bus events are reported as POLLIN.
|
|
||||||
*/
|
|
||||||
class BusEvent : uavcan::Noncopyable
|
class BusEvent : uavcan::Noncopyable
|
||||||
{
|
{
|
||||||
static const unsigned MaxPollWaiters = 8;
|
static const unsigned MaxPollWaiters = 8;
|
||||||
|
|
||||||
::file_operations file_ops_;
|
::file_operations file_ops_;
|
||||||
::pollfd* pollset_[MaxPollWaiters];
|
::pollfd* pollset_[MaxPollWaiters];
|
||||||
|
CanDriver& can_driver_;
|
||||||
bool signal_;
|
bool signal_;
|
||||||
|
|
||||||
static int openTrampoline(::file* filp);
|
static int openTrampoline(::file* filp);
|
||||||
@@ -75,13 +75,15 @@ class BusEvent : uavcan::Noncopyable
|
|||||||
int close(::file* filp);
|
int close(::file* filp);
|
||||||
int poll(::file* filp, ::pollfd* fds, bool setup);
|
int poll(::file* filp, ::pollfd* fds, bool setup);
|
||||||
|
|
||||||
|
unsigned makePollMask() const;
|
||||||
|
|
||||||
int addPollWaiter(::pollfd* fds);
|
int addPollWaiter(::pollfd* fds);
|
||||||
int removePollWaiter(::pollfd* fds);
|
int removePollWaiter(::pollfd* fds);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const char* const DevName;
|
static const char* const DevName;
|
||||||
|
|
||||||
BusEvent();
|
BusEvent(CanDriver& can_driver);
|
||||||
~BusEvent();
|
~BusEvent();
|
||||||
|
|
||||||
bool wait(uavcan::MonotonicDuration duration);
|
bool wait(uavcan::MonotonicDuration duration);
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ int BusEvent::poll(::file* filp, ::pollfd* fds, bool setup)
|
|||||||
ret = addPollWaiter(fds);
|
ret = addPollWaiter(fds);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
fds->revents |= fds->events & POLLIN;
|
fds->revents |= fds->events & makePollMask();
|
||||||
if (fds->revents != 0)
|
if (fds->revents != 0)
|
||||||
{
|
{
|
||||||
(void)sem_post(fds->sem);
|
(void)sem_post(fds->sem);
|
||||||
@@ -114,11 +114,26 @@ int BusEvent::poll(::file* filp, ::pollfd* fds, bool setup)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned BusEvent::makePollMask() const
|
||||||
|
{
|
||||||
|
const uavcan::CanSelectMasks select_masks = can_driver_.makeSelectMasks();
|
||||||
|
unsigned poll_mask = 0;
|
||||||
|
if (select_masks.read != 0)
|
||||||
|
{
|
||||||
|
poll_mask |= POLLIN;
|
||||||
|
}
|
||||||
|
if (select_masks.write != 0)
|
||||||
|
{
|
||||||
|
poll_mask |= POLLOUT;
|
||||||
|
}
|
||||||
|
return poll_mask;
|
||||||
|
}
|
||||||
|
|
||||||
int BusEvent::addPollWaiter(::pollfd* fds)
|
int BusEvent::addPollWaiter(::pollfd* fds)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < MaxPollWaiters; i++)
|
for (unsigned i = 0; i < MaxPollWaiters; i++)
|
||||||
{
|
{
|
||||||
if (pollset_[i] == NULL)
|
if (pollset_[i] == nullptr)
|
||||||
{
|
{
|
||||||
pollset_[i] = fds;
|
pollset_[i] = fds;
|
||||||
return 0;
|
return 0;
|
||||||
@@ -133,15 +148,16 @@ int BusEvent::removePollWaiter(::pollfd* fds)
|
|||||||
{
|
{
|
||||||
if (fds == pollset_[i])
|
if (fds == pollset_[i])
|
||||||
{
|
{
|
||||||
pollset_[i] = NULL;
|
pollset_[i] = nullptr;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BusEvent::BusEvent()
|
BusEvent::BusEvent(CanDriver& can_driver)
|
||||||
: signal_(false)
|
: can_driver_(can_driver)
|
||||||
|
, signal_(false)
|
||||||
{
|
{
|
||||||
std::memset(&file_ops_, 0, sizeof(file_ops_));
|
std::memset(&file_ops_, 0, sizeof(file_ops_));
|
||||||
std::memset(pollset_, 0, sizeof(pollset_));
|
std::memset(pollset_, 0, sizeof(pollset_));
|
||||||
@@ -185,9 +201,9 @@ void BusEvent::signalFromInterrupt()
|
|||||||
for (unsigned i = 0; i < MaxPollWaiters; i++)
|
for (unsigned i = 0; i < MaxPollWaiters; i++)
|
||||||
{
|
{
|
||||||
::pollfd* const fd = pollset_[i];
|
::pollfd* const fd = pollset_[i];
|
||||||
if (fd != NULL)
|
if (fd != nullptr)
|
||||||
{
|
{
|
||||||
fd->revents |= fd->events & POLLIN;
|
fd->revents = fd->events & makePollMask();
|
||||||
if ((fd->revents != 0) && (fd->sem->semcount <= 0))
|
if ((fd->revents != 0) && (fd->sem->semcount <= 0))
|
||||||
{
|
{
|
||||||
(void)sem_post(fd->sem);
|
(void)sem_post(fd->sem);
|
||||||
|
|||||||
Reference in New Issue
Block a user