⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intr.c

📁 xenomai 很好的linux实时补丁
💻 C
📖 第 1 页 / 共 2 页
字号:
 * @param intr The descriptor address of the interrupt object to * enable. * * @return 0 is returned upon success. Otherwise: * * - -EINVAL is returned if @a intr is not a interrupt object * descriptor. * * - -EIDRM is returned if @a intr is a deleted interrupt object * descriptor. * * Environments: * * This service can be called from: * * - Kernel module initialization/cleanup code * - Kernel-based task * - User-space task * * Rescheduling: never. */int rt_intr_enable (RT_INTR *intr){    int err;    spl_t s;    xnlock_get_irqsave(&nklock,s);    intr = xeno_h2obj_validate(intr,XENO_INTR_MAGIC,RT_INTR);    if (!intr)        {        err = xeno_handle_error(intr,XENO_INTR_MAGIC,RT_INTR);        goto unlock_and_exit;        }        err = xnintr_enable(&intr->intr_base); unlock_and_exit:    xnlock_put_irqrestore(&nklock,s);    return err;}/*!  * \fn int rt_intr_disable (RT_INTR *intr) * \brief Disable an interrupt object. * * Disables the hardware interrupt line associated with an interrupt * object. This operation invalidates further interrupt requests from * the given source until the IRQ line is re-enabled anew through * rt_intr_enable(). * * @param intr The descriptor address of the interrupt object to * enable. * * @return 0 is returned upon success. Otherwise: * * - -EINVAL is returned if @a intr is not a interrupt object * descriptor. * * - -EIDRM is returned if @a intr is a deleted interrupt object * descriptor. * * Environments: * * This service can be called from: * * - Kernel module initialization/cleanup code * - Kernel-based task * - User-space task * * Rescheduling: never. */int rt_intr_disable (RT_INTR *intr){    int err;    spl_t s;    xnlock_get_irqsave(&nklock,s);    intr = xeno_h2obj_validate(intr,XENO_INTR_MAGIC,RT_INTR);    if (!intr)        {        err = xeno_handle_error(intr,XENO_INTR_MAGIC,RT_INTR);        goto unlock_and_exit;        }        err = xnintr_disable(&intr->intr_base); unlock_and_exit:    xnlock_put_irqrestore(&nklock,s);    return err;}/** * @fn int rt_intr_inquire(RT_INTR *intr, RT_INTR_INFO *info) * @brief Inquire about an interrupt object. * * Return various information about the status of a given interrupt * object. * * @param intr The descriptor address of the inquired interrupt * object. * * @param info The address of a structure the interrupt object * information will be written to. * @return 0 is returned and status information is written to the * structure pointed at by @a info upon success. Otherwise: * * - -EINVAL is returned if @a intr is not a interrupt object * descriptor. * * - -EIDRM is returned if @a intr is a deleted interrupt object * descriptor. * * Environments: * * This service can be called from: * * - Kernel module initialization/cleanup code * - Interrupt service routine * - Kernel-based task * - User-space task * * Rescheduling: never. */int rt_intr_inquire (RT_INTR *intr,		     RT_INTR_INFO *info){    int err = 0;    spl_t s;    xnlock_get_irqsave(&nklock,s);    intr = xeno_h2obj_validate(intr,XENO_INTR_MAGIC,RT_INTR);    if (!intr)        {        err = xeno_handle_error(intr,XENO_INTR_MAGIC,RT_INTR);        goto unlock_and_exit;        }        strcpy(info->name,intr->name);    info->hits = intr->intr_base.hits;    info->irq = intr->intr_base.irq; unlock_and_exit:    xnlock_put_irqrestore(&nklock,s);    return err;}/*!  * \fn int rt_intr_create (RT_INTR *intr,const char *name,unsigned irq,int mode) * \brief Create an interrupt object from user-space. * * Initializes and associates an interrupt object with an IRQ line * from a user-space application. In this mode, the basic principle is * to define some interrupt server task which routinely waits for the * next incoming IRQ event through the rt_intr_wait() syscall. * * When an interrupt occurs on the given @a irq line, any task pending * on the interrupt object through rt_intr_wait() is imediately awaken * in order to deal with the hardware event. The interrupt service * code may then call any Xenomai service available from user-space. * * @param intr The address of a interrupt object descriptor Xenomai will * use to store the object-specific data.  This descriptor must always * be valid while the object is active therefore it must be allocated * in permanent memory. * * @param name An ASCII string standing for the symbolic name of the * interrupt object. When non-NULL and non-empty, this string is copied * to a safe place into the descriptor, and passed to the registry package * if enabled for indexing the created interrupt objects. *  * @param irq The hardware interrupt channel associated with the * interrupt object. This value is architecture-dependent. * * @param mode The interrupt object creation mode. The following flags * can be OR'ed into this bitmask: * * - I_NOAUTOENA asks Xenomai not to re-enable the IRQ line before awakening * the interrupt server task. This flag is functionally equivalent as * always returning RT_INTR_NOENABLE from a kernel space interrupt * handler. * * - I_PROPAGATE asks Xenomai to propagate the IRQ down the pipeline; in * other words, the interrupt occurrence is chained to Linux after it * has been processed by the Xenomai task. This flag is functionally * equivalent as always returning RT_INTR_PROPAGATE from a kernel space * interrupt handler. * * @return 0 is returned upon success. Otherwise: * * - -ENOMEM is returned if the system fails to get enough dynamic * memory from the global real-time heap in order to register the * interrupt object. * * - -EBUSY is returned if the interrupt line is already in use by * another interrupt object. Only a single interrupt object can be * associated to any given interrupt line using rt_intr_create() at * any time, regardless of the caller's execution space (kernel or * user). * * Environments: * * This service can be called from: * * - User-space task * * Rescheduling: possible. * * @note The interrupt source associated to the interrupt descriptor * remains masked upon creation. rt_intr_enable() should be called for * the new interrupt object to unmask it. *//** * @fn int rt_intr_wait(RT_INTR *intr, RTIME timeout) * @brief Wait for the next interrupt. * * This user-space only call allows the current task to suspend * execution until the associated interrupt event triggers. The * priority of the current task is raised above all other Xenomai tasks - * except those also undergoing an interrupt or alarm wait (see * rt_alarm_wait()) - so that it would preempt any of them under * normal circumstances (i.e. no scheduler lock). * * Interrupt receipts are logged if they cannot be delivered * immediately to some interrupt server task, so that a call to * rt_intr_wait() might return immediately if an IRQ is already * pending on entry of the service. * * @param intr The descriptor address of the awaited interrupt. * * @param timeout The number of clock ticks to wait for an interrupt * to occur (see note). Passing TM_INFINITE causes the caller to block * indefinitely until an interrupt triggers. Passing TM_NONBLOCK is * invalid. * * @return A positive value is returned upon success, representing the * number of pending interrupts to process. Otherwise: * * - -ETIMEDOUT is returned if no interrupt occurred within the * specified amount of time. * * - -EINVAL is returned if @a intr is not an interrupt object * descriptor, or @a timeout is equal to TM_NONBLOCK. * * - -EIDRM is returned if @a intr is a deleted interrupt object * descriptor, including if the deletion occurred while the caller was * waiting for its next interrupt. * * - -EINTR is returned if rt_task_unblock() has been called for the * current task before the next interrupt occurrence. * * Environments: * * This service can be called from: * * - User-space task * * Rescheduling: always, unless an interrupt is already pending on * entry. * * @note This service is sensitive to the current operation mode of * the system timer, as defined by the rt_timer_start() service. In * periodic mode, clock ticks are interpreted as periodic jiffies. In * oneshot mode, clock ticks are interpreted as nanoseconds. *//** * @fn int rt_intr_bind(RT_INTR *intr,const char *name,RTIME timeout) * @brief Bind to an interrupt object. * * This user-space only service retrieves the uniform descriptor of a * given Xenomai interrupt object identified by its IRQ number. If the * object does not exist on entry, this service blocks the caller * until an interrupt object of the given number is created. An * interrupt is registered whenever a kernel-space task invokes the * rt_intr_create() service successfully for the given IRQ line. * * @param intr The address of an interrupt object descriptor retrieved * by the operation. Contents of this memory is undefined upon * failure. * * @param name An ASCII string standing for the symbolic name of the * interrupt object to search for. * * @param timeout The number of clock ticks to wait for the * registration to occur (see note). Passing TM_INFINITE causes the * caller to block indefinitely until the object is * registered. Passing TM_NONBLOCK causes the service to return * immediately without waiting if the object is not registered on * entry. * * @return 0 is returned upon success. Otherwise: * * - -EFAULT is returned if @a intr is referencing invalid memory. * * - -EINVAL is returned if @a irq is invalid. * * - -EINTR is returned if rt_task_unblock() has been called for the * waiting task before the retrieval has completed. * * - -EWOULDBLOCK is returned if @a timeout is equal to TM_NONBLOCK * and the searched object is not registered on entry. * * - -ETIMEDOUT is returned if the object cannot be retrieved within * the specified amount of time. * * - -EPERM is returned if this service should block, but was called * from a context which cannot sleep (e.g. interrupt, non-realtime or * scheduler locked). * * Environments: * * This service can be called from: * * - User-space task (switches to primary mode) * * Rescheduling: always unless the request is immediately satisfied or * @a timeout specifies a non-blocking operation. * * @note This service is sensitive to the current operation mode of * the system timer, as defined by the rt_timer_start() service. In * periodic mode, clock ticks are interpreted as periodic jiffies. In * oneshot mode, clock ticks are interpreted as nanoseconds. *//** * @fn int rt_intr_unbind(RT_INTR *intr) * * @brief Unbind from an interrupt object. * * This user-space only service unbinds the calling task from the * interrupt object previously retrieved by a call to rt_intr_bind(). * * @param intr The address of a interrupt object descriptor to unbind * from. * * @return 0 is always returned. * * This service can be called from: * * - User-space task. * * Rescheduling: never. *//*@}*/EXPORT_SYMBOL(rt_intr_create);EXPORT_SYMBOL(rt_intr_delete);EXPORT_SYMBOL(rt_intr_enable);EXPORT_SYMBOL(rt_intr_disable);EXPORT_SYMBOL(rt_intr_inquire);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -