refactor(uORB): out-line PublicationMulti methods to save flash

publish(), advertise() and get_instance() were instantiated per topic
type and the advertise-check in publish() was additionally inlined at
every call site. Move them into a type-independent PublicationMultiBase
compiled once.

Saves 5.5 kB of flash on px4_fmu-v6x_default.
This commit is contained in:
Balduin
2026-07-07 14:08:05 +02:00
committed by Ramon Roche
parent 17d08c5db3
commit 4791b70c15
2 changed files with 53 additions and 31 deletions

View File

@@ -40,6 +40,7 @@
*/
#include "Publication.hpp"
#include "PublicationMulti.hpp"
namespace uORB
{
@@ -62,4 +63,33 @@ bool PublicationBase::publish(const void *data)
return (Manager::orb_publish(get_topic(), _handle, data) == PX4_OK);
}
bool PublicationMultiBase::advertise()
{
if (!advertised()) {
int instance = 0;
_handle = orb_advertise_multi(get_topic(), nullptr, &instance);
}
return advertised();
}
bool PublicationMultiBase::publish(const void *data)
{
if (!advertised()) {
advertise();
}
return (orb_publish(get_topic(), _handle, data) == PX4_OK);
}
int PublicationMultiBase::get_instance()
{
// advertise if not already advertised
if (advertise()) {
return Manager::orb_get_instance(_handle);
}
return -1;
}
} // namespace uORB

View File

@@ -51,8 +51,27 @@ namespace uORB
/**
* Base publication multi wrapper class
*/
class PublicationMultiBase : public PublicationBase
{
public:
bool advertise();
int get_instance();
protected:
PublicationMultiBase(ORB_ID id) :
PublicationBase(id)
{}
// type-independent publish; data points to a message of the topic's type
bool publish(const void *data);
};
/**
* Publication multi wrapper class
*/
template<typename T>
class PublicationMulti : public PublicationBase
class PublicationMulti : public PublicationMultiBase
{
public:
@@ -62,45 +81,18 @@ public:
* @param meta The uORB metadata (usually from the ORB_ID() macro) for the topic.
*/
PublicationMulti(ORB_ID id) :
PublicationBase(id)
PublicationMultiBase(id)
{}
PublicationMulti(const orb_metadata *meta) :
PublicationBase(static_cast<ORB_ID>(meta->o_id))
PublicationMultiBase(static_cast<ORB_ID>(meta->o_id))
{}
bool advertise()
{
if (!advertised()) {
int instance = 0;
_handle = orb_advertise_multi(get_topic(), nullptr, &instance);
}
return advertised();
}
/**
* Publish the struct
* @param data The uORB message struct we are updating.
*/
bool publish(const T &data)
{
if (!advertised()) {
advertise();
}
return (orb_publish(get_topic(), _handle, &data) == PX4_OK);
}
int get_instance()
{
// advertise if not already advertised
if (advertise()) {
return Manager::orb_get_instance(_handle);
}
return -1;
}
bool publish(const T &data) { return PublicationMultiBase::publish(&data); }
};
/**