当前位置:首页 > 芯闻号 > 充电吧
[导读]uorb_main int uorb_main(int argc, char *argv[]) {     if (argc < 2) {

uorb_main
int
uorb_main(int argc, char *argv[])
{
    if (argc < 2) {
        usage();                                                                                            //使用说明
        return -EINVAL;
    }

    /*
     * Start/load the driver.                                                                                //开始或加载驱动
     */
    if (!strcmp(argv[1], "start")) {

        if (g_dev != nullptr) {                                                                               //判断是否已经启动
            PX4_WARN("already loaded");
            /* user wanted to start uorb, its already running, no error */
            return 0;
        }

        if (!uORB::Manager::initialize()) {                                                                     //初始化uORB::Manager
            PX4_ERR("uorb manager alloc failed");
            return -ENOMEM;
        }

        /* create the driver */                                                                                //创建一个驱动设备
        g_dev = uORB::Manager::get_instance()->get_device_master(uORB::PUBSUB);

        if (g_dev == nullptr) {
            return -errno;
        }

#if !defined(__PX4_QURT) && !defined(__PX4_POSIX_EAGLE) && !defined(__PX4_POSIX_EXCELSIOR)
        /* FIXME: this fails on Snapdragon (see https://github.com/PX4/Firmware/issues/5406),
         * so we disable logging messages to the ulog for now. This needs further investigations.
         */
        px4_log_initialize();
#endif

        return OK;
    }

    /*
     * Print driver information.                                                                            //打印设备信息status
     */
    if (!strcmp(argv[1], "status")) {
        if (g_dev != nullptr) {
            g_dev->printStatistics(true);

        } else {
            PX4_INFO("uorb is not running");
        }

        return OK;
    }
                                                                                                            //topming'li     if (!strcmp(argv[1], "top")) {
        if (g_dev != nullptr) {
            g_dev->showTop(argv + 2, argc - 2);

        } else {
            PX4_INFO("uorb is not running");
        }

        return OK;
    }

    usage();
    return -EINVAL;
} uORB::Manager::initialize():
bool uORB::Manager::initialize()
{
    if (_Instance == nullptr) {
        _Instance = new uORB::Manager();                                            //创建了一个新的uORB实例
    }

    return _Instance != nullptr;
} uORB::Manager:

/**
 * This is implemented as a singleton. This class manages creating the                                //这是一个实施的单例,这个class管理创建uORB节点给每个uORB topics
 * uORB nodes for each uORB topics and also implements the behavor of the                             //并且也实施uORB的API行为
 * uORB Api's.
 */
class uORB::Manager : public uORBCommunicator::IChannelRxHandler
{
public:
    // public interfaces for this class.                                                                    //公共的类接口

    /**                                                                                                    //初始化单例,调用这个在所有事情之前
     * Initialize the singleton. Call this before everything else.
     * @return true on success                                                                             //返回true是成功
     */
    static bool initialize();

    /**                                                                                                    //获取instance的方法
     * Method to get the singleton instance for the uORB::Manager.
     * Make sure initialize() is called first.                                                             //确保initialize()先被调用
     * @return uORB::Manager*                                                                                //返回创建的uORB::Manager*
     */
    static uORB::Manager *get_instance()
    {
        return _Instance;
    }

    /**
     * Get the DeviceMaster for a given Flavor. If it does not exist,                                        //给定一个flavoe,会返回DeciveMaster* 如果不存在会创建并且初始化
     * it will be created and initialized.
     * Note: the first call to this is not thread-safe.                                                      //第一次调用thread-safe不是这个?
     * @return nullptr if initialization failed (and errno will be set)                                        //初始化失败返回一个nullptr
     */
    uORB::DeviceMaster *get_device_master(Flavor flavor);

    // ==== uORB interface methods ====
    /**
     * Advertise as the publisher of a topic.                                                                    //广告作为发布话题
     *
     * This performs the initial advertisement of a topic; it creates the topic                                  //执行初始化的广告topic;它创造topic
     * node in /obj if required and publishes the initial data.
     *
     * Any number of advertisers may publish to a topic; publications are atomic
     * but co-ordination between publishers is not provided by the ORB.
     *
     * Internally this will call orb_advertise_multi with an instance of 0 and                                    //函数内部调用了orb_advertis_multi
     * default priority.
     *
     * @param meta    The uORB metadata (usually from the ORB_ID() macro)                                            //uORB metadata(通常来自ORB_ID()宏)作为topic
     * for the topic.
     * @param data    A pointer to the initial data to be published.                                                 //数据指针
     * For topics updated by interrupt handlers, the advertisement                                                //中断处理函数
     * must be performed from non-interrupt context.                                                              //必须执行无中断的内容
     * @param queue_size  Maximum number of buffered elements. If this is 1, no queuing is                         //最大的buffer元素个数,如果是1,没有队列被使用
     * used.
     * @return    nullptr on error, otherwise returns an object pointer                                              //返回空指针如果错误,否则返回一个类指针
     * that can be used to publish to the topic.                                                                  //那个可以用来公布topic
     * If the topic in question is not known (due to an                                                           //如果topic在问题中不被知道(由于ORB_DEFINE不和ORB_DECLARE一致)
     * ORB_DEFINE with no corresponding ORB_DECLARE)
     * this function will return nullptr and set errno to ENOENT.                                                 //这个函数将会返回nullptr并且设置errno到ENOENT
     */
    orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data, unsigned int queue_size = 1)
    {
        return orb_advertise_multi(meta, data, nullptr, ORB_PRIO_DEFAULT, queue_size);
    }

    /**
     * Advertise as the publisher of a topic.
     *
     * This performs the initial advertisement of a topic; it creates the topic
     * node in /obj if required and publishes the initial data.
     *
     * Any number of advertisers may publish to a topic; publications are atomic
     * but co-ordination between publishers is not provided by the ORB.
     *
     * The multi can be used to create multiple independent instances of the same topic                                            //用来创建多个独立接口用于相同的topic
     * (each instance has its own buffer).                                                                                         //每个接口都有自己的buff
     * This is useful for multiple publishers who publish the same topic. The subscriber
     * then subscribes to all instances and chooses which source he wants to use.
     *
     * @param meta    The uORB metadata (usually from the ORB_ID() macro)                                                            //meta通常来自于ORB_ID()宏,是uORB的metadata
     * for the topic.
     * @param data    A pointer to the initial data to be published.                                                                //data是一个初始化要发布数据的指针
     * For topics updated by interrupt handlers, the advertisement                                                               //通过中断处理函数更新,
     * must be performed from non-interrupt context.
     * @param instance  Pointer to an integer which will yield the instance ID (0-based)                                          //一个整形指针,用于接口ID(0-based)
     * of the publication. This is an output parameter and will be set to the newly                                              //创建接口等等,0是第一个广告,1是下一个,如此往下
     * created instance, ie. 0 for the first advertiser, 1 for the next and so on.
     * @param priority  The priority of the instance. If a subscriber subscribes multiple                                         //接口的优先级
     * instances, the priority allows the subscriber to prioritize the best
     * data source as long as its available. The subscriber is responsible to check
     * and handle different priorities (@see orb_priority()).
     * @param queue_size  Maximum number of buffered elements. If this is 1, no queuing is                                        //最大的buffer元素个数,如果是1,没有queuing被使用
     * used.
     * @return ERROR on error, otherwise returns a handle                                                                        //返回ERROR在错误时,否则返回一个句柄。用于创建一个topic和publish
     * that can be used to publish to the topic.
     * If the topic in question is not known (due to an
     * ORB_DEFINE with no corresponding ORB_DECLARE)
     * this function will return -1 and set errno to ENOENT.
     */
    orb_advert_t orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance,
                     int priority, unsigned int queue_size = 1) ;


    /**
     * Unadvertise a topic.
     *
     * @param handle  handle returned by orb_advertise or orb_advertise_multi.                                                                        //用于取消一个topic, handle是orb_advertise_multi返回的handle
     * @return 0 on success
     */
    int orb_unadvertise(orb_advert_t handle);

    /**
     * Publish new data to a topic.                                                                                                                   //发布一个新的
     *
     * The data is atomically published to the topic and any waiting subscribers
     * will be notified. Subscribers that are not waiting can check the topic
     * for updates using orb_check and/or orb_stat.
     *
     * @param meta    The uORB metadata (usually from the ORB_ID() macro)                                                                                //从ORB_ID宏的metadata
     * for the topic.
     * @handle    The handle returned from orb_advertise.                                                                                                //orb_advertise返回的handle
     * @param data    A pointer to the data to be published.                                                                                             //publish的数据的指针
     * @return    OK on success, ERROR otherwise with errno set accordingly.                                                                             //返回OK如果成功
     */
    int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data) ;

    /**
     * Subscribe to a topic.                                                                                                                          //订阅一个topic
     *
     * The returned value is a file descriptor that can be passed to poll()
     * in order to wait for updates to a topic, as well as topic_read,
     * orb_check and orb_stat.
     *
     * Subscription will succeed even if the topic has not been advertised;
     * in this case the topic will have a timestamp of zero, it will never
     * signal a poll() event, checking will always return false and it cannot
     * be copied. When the topic is subsequently advertised, poll, check,
     * stat and copy calls will react to the initial publication that is
     * performed as part of the advertisement.
     *
     * Subscription will fail if the topic is not known to the system, i.e.
     * there is nothing in the system that has declared the topic and thus it
     * can never be published.
     *
     * Internally this will call orb_subscribe_multi with instance 0.
     *
     * @param meta    The uORB metadata (usually from the ORB_ID() macro)                                                                                    //订阅主题的metadata
     * for the topic.
     * @return ERROR on error, otherwise returns a handle
     * that can be used to read and update the topic.
     */
    int orb_subscribe(const struct orb_metadata *meta) ;

    /**
     * Subscribe to a multi-instance of a topic.                                                                                                        //订阅多个主题
     *
     * The returned value is a file descriptor that can be passed to poll()
     * in order to wait for updates to a topic, as well as topic_read,
     * orb_check and orb_stat.
     *
     * Subscription will succeed even if the topic has not been advertised;
     * in this case the topic will have a timestamp of zero, it will never
     * signal a poll() event, checking will always return false and it cannot
     * be copied. When the topic is subsequently advertised, poll, check,
     * stat and copy calls will react to the initial publication that is
     * performed as part of the advertisement.
     *
     * Subscription will fail if the topic is not known to the system, i.e.
     * there is nothing in the system that has declared the topic and thus it
     * can never be published.
     *
     * If a publisher publishes multiple instances the subscriber should
     * subscribe to each instance with orb_subscribe_multi
     * (@see orb_advertise_multi()).
     *
     * @param meta    The uORB metadata (usually from the ORB_ID() macro)
     * for the topic.
     * @param instance  The instance of the topic. Instance 0 matches the
     * topic of the orb_subscribe() call, higher indices
     * are for topics created with orb_advertise_multi().
     * @return ERROR on error, otherwise returns a handle
     * that can be used to read and update the topic.
     * If the topic in question is not known (due to an
     * ORB_DEFINE_OPTIONAL with no corresponding ORB_DECLARE)
     * this function will return -1 and set errno to ENOENT.
     */
    int orb_subscribe_multi(const struct orb_metadata *meta, unsigned instance) ;

    /**
     * Unsubscribe from a topic.
     *
     * @param handle  A handle returned from orb_subscribe.
     * @return    OK on success, ERROR otherwise with errno set accordingly.
     */
    int orb_unsubscribe(int handle) ;                                                                                                //取消订阅一个主题,handle是orb_subscribe返回的句柄

    /**
     * Fetch data from a topic.
     *
     * This is the only operation that will reset the internal marker that
     * indicates that a topic has been updated for a subscriber. Once poll
     * or check return indicating that an updaet is available, this call
     * must be used to update the subscription.
     *
     * @param meta    The uORB metadata (usually from the ORB_ID() macro)
     * for the topic.
     * @param handle  A handle returned from orb_subscribe.
     * @param buffer  Pointer to the buffer receiving the data, or NULL
     * if the caller wants to clear the updated flag without
     * using the data.
     * @return    OK on success, ERROR otherwise with errno set accordingly.
     */
    int orb_copy(const struct orb_metadata *meta, int handle, void *buffer) ;                                                        //从主题中获取数据,buffer就是接收数据存放的位置

    /**
     * Check whether a topic has been published to since the last orb_copy.
     *
     * This check can be used to determine whether to copy the topic when
     * not using poll(), or to avoid the overhead of calling poll() when the
     * topic is likely to have updated.
     *
     * Updates are tracked on a per-handle basis; this call will continue to
     * return true until orb_copy is called using the same handle. This interface
     * should be preferred over calling orb_stat due to the race window between
     * stat and copy that can lead t                                  

               

                           

            

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭