当前位置 博文首页 > 文章内容

    Nucleus 实时操作系统中断(下)

    作者: 栏目:未分类 时间:2020-07-10 18:01:35

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    Nucleus 实时操作系统中断(下)

    Nucleus RTOS兼容性              

    由于中断在Nucleus SE中的实现方式与Nucleus rto截然不同,因此不应期望有特定的兼容性。Nucleus RTOS有一个本机/低级/高级中断方案,这在某种程度上类似于Nucleus SE中的本机中断和管理中断。             

    低级和高级ISR             

    低级ISR             

    低级中断服务程序(LISR)作为普通ISR执行,包括使用当前堆栈。Nucleus RTOS在调用LISR之前保存上下文,并在LISR返回后恢复上下文。因此,lisr可以用C编写,并且可以调用其他C例程。然而,只有少数Nucleus RTOS服务可用于LISR。如果中断处理需要额外的Nucleus RTOS服务,则必须激活高级中断服务程序(HISR)。Nucleus RTOS支持多个lisr的嵌套。             

    高级ISR             

    HISR是动态创建和删除的。每个HISR都有自己的堆栈空间和自己的控制块。每个内存都由应用程序提供。当然,HISR必须在LISR激活之前创建。             

    由于HISR有自己的堆栈和控制块,所以如果它试图访问已经被访问的Nucleus RTOS数据结构,则可以暂时阻止HISR。             

    HISR有三个优先级。如果在处理低优先级HISR期间激活了高优先级HISR,则低优先级HISR被抢占的方式与任务被抢占的方式大致相同。相同优先级的hisr按照它们最初激活的顺序执行。在恢复正常任务调度之前,将处理所有激活的HISR。             

    Nucleus RTOS中断API调用             

    Nucleus RTOS有许多API调用来支持其中断结构。这些都不是在Nucleus SE中实现的。             

    对于本机中断,API调用提供以下功能:             

    控制(启用/禁用)中断(本地和全局)             

    设置中断向量             

    对于低电平中断:             

    向内核注册一个低级ISR             

    对于高级中断:             

    创建/删除高级中断             

    激活高级中断             

    获取应用程序中(当前)的高级中断数              

    获取指向所有高级中断的控制块的指针             

    获取指向当前高级中断控制块的指针             

    获取有关高级中断的信息             

    全局控制中断             

    此服务以独立于任务的方式启用或禁用中断。因此,由该服务禁用的中断将保持禁用状态,直到随后对此服务的调用启用为止。             

    服务调用原型:

    INT NU_Control_Interrupts(INT new_level);

    参数:             

    new_level–系统的新中断级别。菜单禁用中断(禁用所有中断)和菜单启用中断(启用所有中断)选项始终可用。根据体系结构,还可以使用其他选项。             

    返回:             

    此服务返回以前级别的已启用中断。             

    本地控制中断             

    此服务以依赖于任务的方式启用或禁用中断。此服务将状态寄存器更改为指定的值。状态寄存器将被设置回下一个上下文开关上一次调用NU_Control_Interrupts()时设置的值。             

    服务调用原型:

    INT NU_Local_Control_Interrupts(INT new_level);

    参数:             

    new_level–当前任务的新中断级别。菜单禁用中断(禁用所有中断)和菜单启用中断(启用所有中断)选项始终可用。根据体系结构,还可以使用其他选项。             

    返回:             

    此服务返回以前级别的已启用中断。             

    设置中断向量             

    此服务用自定义中断服务例程(ISR)替换vector指定的中断向量。              

    服务调用原型:

    VOID *NU_Setup_Vector(INT vector, VOID *new);

    参数:             

    vector–用于注册中断的中断向量             

    新–ISR将在vector注册             

    返回:             

    此服务返回一个指向先前在中断向量上注册的ISR的指针。             

    注册LISR中断             

    此服务将LISR函数与中断向量相关联。系统上下文在调用指定的LISR之前自动保存,并在LISR返回后恢复。             

    服务调用原型:

    STATUS NU_Register_LISR(INT vector, VOID(*lisr_entry)(INT), 
    VOID (**old_lisr)(INT));

    Parameters:

    vector – the interrupt vector at which to register the interrupt
    lisr_entry – the function to register at the vector; a value of NU_NULL clears the vector
    old_lisr – the subroutine previously registered at the specified vector

    Returns:

    NU_SUCCESS – successful completion of the service
    NU_INVALID_VECTOR – the specified vector is invalid
    NU_NOT_REGISTERED – the vector is not currently registered as de-registration was specified by lisr_entry 
    NU_NO_MORE_LISRS – the maximum number of registered LISRs has been exceeded

    Create a HISR

    This service creates a High-Level Interrupt Service Routine (HISR).

    Service call prototype:

    STATUS NU_Create_HISR(NU_HISR *hisr, CHAR *name, 
    VOID (*hisr_entry)(VOID), OPTION priority, VOID  *stack_pointer, UNSIGNED stack_size);

    Parameters:

    hisr – pointer to a user-supplied HISR control block
    name – pointer to a 7-character, null-terminated name for the HISR
    hisr_entry – the function entry point of the HISR
    priority – there are three HISR priorities (0-2); priority 0 is the highest
    stack_pointer – pointer to the HISR’s stack area
    stack_size – number of bytes in the HISR stack

    Returns:

    NU_SUCCESS – successful completion of the service
    NU_INVALID_HISR – the HISR control block pointer is NULL or is already in use
    NU_INVALID_ENTRY – the HISR entry pointer is NULL 
    NU_INVALID_PRIORITY – the HISR priority is invalid
    NU_INVALID_MEMORY – the stack pointer is NULL 
    NU_INVALID_SIZE – the stack size is too small

    Delete a HISR

    This service deletes a previously created HISR.

    Service call prototype:

    STATUS NU_Delete_HISR(NU_HISR *hisr);

    Parameters:

    hisr – pointer to a user-supplied HISR control block

    Returns:

    NU_SUCCESS – successful completion of the service
    NU_INVALID_HISR – the HISR pointer is invalid

    激活HISR             

    此服务将激活HISR。如果指定的HISR当前正在执行,则在当前执行完成之前不会处理此激活请求。每个激活请求执行一次HISR。             

    服务调用原型:

    TATUS NU_Activate_HISR (NU_HISR *hisr);

    Parameters:

    hisr – pointer to the HISR control block

    Returns:

    NU_SUCCESS – successful completion of the service
    NU_INVALID_HISR – the HISR control block pointer is not valid

    Obtain the Number of HISRs in a System

    This service returns the number of established HISRs. All created HISRs are considered established. Deleted HISRs are no longer considered established.

    Service call prototype:

    UNSIGNED NU_Established_HISRs(VOID);

    Parameters:

    none

    Returns:

    This service call returns the number of established HISRs in the system

    Obtain Pointers to HISR Control Blocks

    This service builds a sequential list of pointers to all established HISRs in the system.

    Service call prototype:

    UNSIGNED  NU_HISR_Pointers(NU_HISR  **pointer_list, 
    UNSIGNED maximum_pointers);

    Parameters:

    pointer_list – pointer to an array of NU_HISR pointers; this array will be filled with pointers of established HISRs in the system
    maximum_pointers – the maximum number of NU_HISR pointers to place into the array; typically, this will be the size of the pointer_list array

    Returns:

    This service call returns the number of HISRS that are active in the system

    Obtain a Pointer to the Current HISR

    This service returns the currently executing HISR’s pointer.

    Service call prototype:

    NU_HISR *NU_Current_HISR_Pointer(VOID);

    Parameters:

    none

    Returns:

    This service call returns a pointer the currently executing HISR’s control block. If the caller is not an HISR, the value returned is NU_NULL .

    Obtain Information About a HISR

    This service returns various information about the specified HISR.

    Service call prototype:

    STATUS NU_HISR_Information(NU_HISR *hisr, char *name, 
    UNSIGNED  *scheduled_count, DATA_ELEMENT  *priority, 
    VOID  **stack_base, UNSIGNED *stack_size, 
    UNSIGNED *minimum_stack);

    Parameters:

    hisr – pointer to the HISR
    name – pointer to an 8-character destination area for the HISR’s name; this includes space for the null terminator
    scheduled_count – pointer to a variable for holding the total number of times this HISR has been scheduled
    priority – pointer to a variable for holding the HISR’s priority
    stack_base – pointer to a pointer for holding the original stack pointer; this is the same pointer supplied during creation of the HISR
    stack_size – pointer to a variable for holding the total size of the HISR’s stack
    minimum_stack – pointer to a variable for holding the minimum amount of available stack space detected during HISR execution

    Returns:

    NU_SUCCESS – successful completion of the service
    NU_INVALID_HISR – the HISR pointer is invalid

    API Calls from ISRs

    API Calls from LISRs

    A LISR may only make use of the following Nucleus RTOS services:

    NU_Activate_HISR()
    NU_Local_Control_Interrupts()
    NU_Current_HISR_Pointer()
    NU_Current_Task_Pointer()
    NU_Retrieve_Clock()

    API Calls from HISRs

    HISRs are allowed access to most Nucleus RTOS services, with the exception of self-suspension services. Additionally, since an HISR cannot suspend on a Nucleus RTOS service, the “suspend” parameter must always be set to NU_NO_SUSPEND .