why do we need a new interface instead of adding a new parameter(cpu) in old interface, in this case rtdm_task_init.

For backward compatibility?

On 2021年02月20日 13:53, hongzha1 via Xenomai wrote:
Initialise and start a real-time task on specified cpu

Signed-off-by: hongzha1 <hongzhan.c...@intel.com>

diff --git a/include/cobalt/kernel/rtdm/driver.h 
b/include/cobalt/kernel/rtdm/driver.h
index 733c49df8..6cdace324 100644
--- a/include/cobalt/kernel/rtdm/driver.h
+++ b/include/cobalt/kernel/rtdm/driver.h
@@ -1024,6 +1024,9 @@ typedef void (*rtdm_task_proc_t)(void *arg);
  int rtdm_task_init(rtdm_task_t *task, const char *name,
                   rtdm_task_proc_t task_proc, void *arg,
                   int priority, nanosecs_rel_t period);
+int rtdm_task_init_on_cpu(rtdm_task_t *task, int cpu, const char *name,
+               rtdm_task_proc_t task_proc, void *arg,
+               int priority, nanosecs_rel_t period);
  int __rtdm_task_sleep(xnticks_t timeout, xntmode_t mode);
  void rtdm_task_busy_sleep(nanosecs_rel_t delay);

diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c
index b914fa312..7452850b7 100644
--- a/kernel/cobalt/rtdm/drvlib.c
+++ b/kernel/cobalt/rtdm/drvlib.c
@@ -157,6 +157,79 @@ int rtdm_task_init(rtdm_task_t *task, const char *name,

  EXPORT_SYMBOL_GPL(rtdm_task_init);

+/**
+ * @brief Initialise and start a real-time task on specified cpu
+ *
+ * After initialising a task, the task handle remains valid and can be
+ * passed to RTDM services until either rtdm_task_destroy() or
+ * rtdm_task_join() was invoked.
+ *
+ * @param[in,out] task Task handle
+ * @param[in] cpu that task want to run on
+ * @param[in] name Optional task name
+ * @param[in] task_proc Procedure to be executed by the task
+ * @param[in] arg Custom argument passed to @c task_proc() on entry
+ * @param[in] priority Priority of the task, see also
+ * @ref rtdmtaskprio "Task Priority Range"
+ * @param[in] period Period in nanoseconds of a cyclic task, 0 for non-cyclic
+ * mode. Waiting for the first and subsequent periodic events is
+ * done using rtdm_task_wait_period().
+ *
+ * @return 0 on success, otherwise negative error code
+ *
+ * @coretags{secondary-only, might-switch}
+ */
+int rtdm_task_init_on_cpu(rtdm_task_t *task, int cpu, const char *name,
+               rtdm_task_proc_t task_proc, void *arg,
+               int priority, nanosecs_rel_t period)
+{
+       union xnsched_policy_param param;
+       struct xnthread_start_attr sattr;
+       struct xnthread_init_attr iattr;
+       int err;
+
+       if (!realtime_core_enabled())
+               return -ENOSYS;
+
+       iattr.name = name;
+       iattr.flags = 0;
+       iattr.personality = &xenomai_personality;
+       iattr.affinity = *cpumask_of(cpu);
+       param.rt.prio = priority;
+
+       err = xnthread_init(task, &iattr, &xnsched_class_rt, &param);
+       if (err)
+               return err;
+
+       /* We need an anonymous registry entry to obtain a handle for fast
+        * mutex locking.
+        */
+       err = xnthread_register(task, "");
+       if (err)
+               goto cleanup_out;
+
+       if (period > 0) {
+               err = xnthread_set_periodic(task, XN_INFINITE,
+                                           XN_RELATIVE, period);
+               if (err)
+                       goto cleanup_out;
+       }
+
+       sattr.mode = 0;
+       sattr.entry = task_proc;
+       sattr.cookie = arg;
+       err = xnthread_start(task, &sattr);
+       if (err)
+               goto cleanup_out;
+
+       return 0;
+
+cleanup_out:
+       xnthread_cancel(task);
+       return err;
+}
+EXPORT_SYMBOL_GPL(rtdm_task_init_on_cpu);
+
  #ifdef DOXYGEN_CPP /* Only used for doxygen doc generation */
  /**
   * @brief Destroy a real-time task


Reply via email to