FreeCalypso > hg > freecalypso-sw
changeset 348:e63ab4a97e24
OSL: os_isr.c done
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Thu, 08 May 2014 02:58:05 +0000 |
parents | c9dfa0e20640 |
children | a163da322bc5 |
files | gsm-fw/gpf/osl/os_isr.c |
diffstat | 1 files changed, 76 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/gsm-fw/gpf/osl/os_isr.c Wed May 07 20:18:11 2014 +0000 +++ b/gsm-fw/gpf/osl/os_isr.c Thu May 08 02:58:05 2014 +0000 @@ -13,7 +13,10 @@ #include "os_types.h" #include "os_glob.h" +typedef unsigned char u_char; + extern T_OS_OSISR_TABLE_ENTRY OSISRTable[]; +extern OS_HANDLE os_int_pool_handle; GLOBAL LONG os_isr_init(void) @@ -67,3 +70,76 @@ *old_state = 1; return(OS_OK); } + +GLOBAL LONG +os_DeleteOSISR(OS_HANDLE hisr_handle) +{ + OS_INT_STATE old_state, state; + + if (hisr_handle <= 0 || hisr_handle > MaxOSISRs) + return(OS_ERROR); + if (OSISRTable[hisr_handle].hisr_cb.tc_activation_count) + return(OS_ERROR); + os_DisableInterrupts(&old_state); + if (os_DeallocateMemory(os_MyHandle(), OSISRTable[hisr_handle].stack) + == OS_ERROR) { +error: os_SetInterruptState(old_state, &state); + return(OS_ERROR); + } + if (NU_Delete_HISR(&OSISRTable[hisr_handle].hisr_cb) != NU_SUCCESS) + goto error; + OSISRTable[hisr_handle].name[0] = 0; + os_SetInterruptState(old_state, &state); + return(OS_OK); +} + +GLOBAL LONG +os_CreateOSISR(char *name, void (*OSISR_entry)(void), + int stacksize, int priority, + int flags, OS_HANDLE *hisr_handle) +{ + OS_HANDLE handle; + T_VOID_STRUCT *hisr_stack; + OS_INT_STATE old_state, state; + + if (priority < 0 || priority > 2) + return(OS_ERROR); + priority = 2 - priority; + os_DisableInterrupts(&old_state); + for (handle = 1; handle <= MaxOSISRs; handle++) + if (!strncmp(OSISRTable[handle].name, name, + RESOURCE_NAMELEN - 1)) { +error: os_SetInterruptState(old_state, &state); + return(OS_ERROR); + } + for (handle = 1; handle <= MaxOSISRs; handle++) + if (!OSISRTable[handle].name[0]) + break; + if (handle > MaxOSISRs) + goto error; + if (os_AllocateMemory(os_MyHandle(), &hisr_stack, stacksize, + 0xFFFFFFFF, os_int_pool_handle) == OS_ERROR) + goto error; + memset((u_char *)hisr_stack, INITIAL_STACK_VALUE, stacksize); + *hisr_stack = GUARD_PATTERN; + if (NU_Create_HISR(&OSISRTable[handle].hisr_cb, name, OSISR_entry, + priority, (VOID *)hisr_stack, stacksize) + != NU_SUCCESS) + goto error; + strncpy(OSISRTable[handle].name, name, RESOURCE_NAMELEN); + OSISRTable[handle].name[RESOURCE_NAMELEN-1] = 0; + *hisr_handle = handle; + os_SetInterruptState(old_state, &state); + return(OS_OK); +} + +GLOBAL LONG +os_ActivateOSISR(OS_HANDLE hisr_handle) +{ + if (hisr_handle <= 0 || hisr_handle > MaxOSISRs) + return(OS_ERROR); + if (NU_Activate_HISR(&OSISRTable[hisr_handle].hisr_cb) == NU_SUCCESS) + return(OS_OK); + else + return(OS_ERROR); +}