static void OSTmr_Task (void *p_arg)
{
INT8U err;
OS_TMR *ptmr;
OS_TMR *ptmr_next;
OS_TMR_CALLBACK pfnct;
OS_TMR_WHEEL *pspoke;
INT16U spoke;
p_arg = p_arg; /* Prevent compiler warning for not using 'p_arg' */
for (;;) {
OSSemPend(OSTmrSemSignal, 0u, &err); /* Wait for signal indicating time to update timers */
OSSchedLock();
OSTmrTime++; /* Increment the current time */
spoke = (INT16U)(OSTmrTime % OS_TMR_CFG_WHEEL_SIZE); /* Position on current timer wheel entry */
pspoke = &OSTmrWheelTbl[spoke];
ptmr = pspoke->OSTmrFirst;
while (ptmr != (OS_TMR *)0) {
ptmr_next = (OS_TMR *)ptmr->OSTmrNext; /* Point to next timer to update because current ... */
/* ... timer could get unlinked from the wheel. */
if (OSTmrTime == ptmr->OSTmrMatch) { /* Process each timer that expires */
OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
if (ptmr->OSTmrOpt == OS_TMR_OPT_PERIODIC) {
OSTmr_Link(ptmr, OS_TMR_LINK_PERIODIC); /* Recalculate new position of timer in wheel */
} else {
ptmr->OSTmrState = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */
}
pfnct = ptmr->OSTmrCallback; /* Execute callback function if available */
if (pfnct != (OS_TMR_CALLBACK)0) {
(*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg);
}
}
ptmr = ptmr_next;
}
OSSchedUnlock();
}
}
开发者ID:Akagi201,项目名称:uCOS-II,代码行数:38,代码来源:os_tmr.c
示例7: lcddisplaytime_task
/*
* This task is called once a second to update the LCD display with the
* current system time.
*/
void lcddisplaytime_task(void *pdata)
{
struct timeval time = {0, 0};
struct timezone zone = {0, 0};
struct tm time_struct;
struct tm *pt_time_struct = &time_struct;
alt_u8 char_array1[32];
alt_u8 char_array2[32];
INT8U ucos_retcode = OS_NO_ERR;
OSSemPend(lcd_sem, 0, &ucos_retcode);
while(1)
{
OSSchedLock();
if(gettimeofday(&time, &zone) < 0)
{
printf("Error get the time of day %s\n", strerror(errno));
exit(0);
}
OSSchedUnlock();
pt_time_struct = gmtime(&time.tv_sec);
strftime(char_array1, 32, "%a %b %d,%Y", pt_time_struct);
printf("DATE: %s\n", char_array1);
strftime(char_array2, 32, "%I:%M:%S %p GMT", pt_time_struct);
printf("TIME: %s\n", char_array2);
OSSemPost(lcd_sem);
OSTimeDlyHMSM(0,0,10,0);
}
}
//.........这里部分代码省略.........
eHeapResult = _adi_osal_MemAlloc((void**) &pTLSBuffer, sizeof(ADI_OSAL_SLOT_VALUE) * _adi_osal_gnNumSlots);
#pragma diag(pop)
RESUME_PROFILING();
if (ADI_OSAL_SUCCESS != eHeapResult )
{
*phThread = ADI_OSAL_INVALID_THREAD;
/* Free the previously allocated memory because of a failure case */
_adi_osal_MemFree(hThreadNode);
return (ADI_OSAL_MEM_ALLOC_FAILED);
}
hThreadNode->pThreadLocalStorageBuffer = pTLSBuffer;
}
/* Creating a task by calling native OS call.*/
/* The scheduler needs to be locked so that the TaskCreation and the Name assignement
can be done atomically. It is important because the OSTaskNameSet takes the priority
as an argument, and the priority could have been changed within the task itself which
starts right after OSTaskCreateExt is called */
PAUSE_PROFILING();
OSSchedLock();
RESUME_PROFILING();
PAUSE_PROFILING();
/* the OSTCBExtPtr TCB entry (pext) is used for storing the pointer to the ADI_OSAL_THREAD_INFO structure so that
it can be found when given the Thread Priority (uCOS task handle) */
nRetValue = OSTaskCreateExt (pThreadAttr->pThreadFunc,
pThreadAttr->pParam,
pStackTop,
(INT8U) (nAssignedPrio & 0xFFu),
(INT16U) nAssignedPrio,
pStackStart,
nStkSize,
(void *)hThreadNode,
(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR) ) ;
RESUME_PROFILING();
switch (nRetValue)
{
case OS_ERR_NONE:
/* set the Name of the task. Maximum characters in the
name of the task allowed is "OS_TASK_NAME_SIZE".
If it exceeds, it will be truncated to OS_TASK_NAME_SIZE*/
#pragma diag(push)
#pragma diag(suppress:misra_rule_11_4 : "typecasting to the type expexted by uC/OS is necessary, also necessary for the return value")
#pragma diag(suppress:misra_rule_11_5 : "the API between the OSAL and uCOS force a const --> non-const conversion.")
/* converting from a const to non-const variable could be a risk, but since the data is getting
copied anyway it's not an issue here.*/
/* Supression since typecasting "szTaskName" which is char_t to INT8U */
PAUSE_PROFILING();
OSTaskNameSet((INT8U) nAssignedPrio,(INT8U*) pThreadAttr->szThreadName, &nErr);
RESUME_PROFILING();
if(nErr == OS_ERR_NONE)
{
/* The ADI_OSAL_THREAD_INFO structure is used as the thread handle */
*phThread = (ADI_OSAL_THREAD_HANDLE) hThreadNode;
eRetStatus = ADI_OSAL_SUCCESS;
}
else
{
eRetStatus = ADI_OSAL_FAILED;
}
break;
#pragma diag(pop)
/* Priority of the specified task is already exists */
case OS_ERR_PRIO_EXIST:
eRetStatus= ADI_OSAL_PRIORITY_IN_USE;
break;
/* Specified priority is out of range */
case OS_ERR_PRIO_INVALID:
eRetStatus = ADI_OSAL_BAD_PRIORITY;
break;
/* Not enough memory to create task */
case OS_ERR_TASK_NO_MORE_TCB:
eRetStatus = ADI_OSAL_MEM_ALLOC_FAILED;
break;
default:
eRetStatus = ADI_OSAL_FAILED;
break;
}
PAUSE_PROFILING();
OSSchedUnlock();
RESUME_PROFILING();
if(eRetStatus != ADI_OSAL_SUCCESS)
{
*phThread = ADI_OSAL_INVALID_THREAD;
if (hThreadNode != NULL)
{
_adi_osal_MemFree(hThreadNode->pThreadLocalStorageBuffer);
_adi_osal_MemFree(hThreadNode);
}
}
return(eRetStatus);
}
//.........这里部分代码省略.........
{
*phThread = ADI_OSAL_INVALID_THREAD;
return (eHeapResult);
}
/* save information about the thread into its structure */
hThreadNode->nThreadPrio = (ADI_OSAL_PRIORITY) nAssignedPrio;
/* Creating a task by calling native OS call.*/
/* The scheduler needs to be locked so that the TaskCreation and the Name
assignement can be done atomically. It is important because the
OSTaskNameSet takes the priority as an argument, and the priority could
have been changed within the task itself which starts right after
OSTaskCreateExt is called */
OSSchedLock();
/* the OSTCBExtPtr TCB entry (pext) is used for storing the pointer to the
* ADI_OSAL_THREAD_INFO structure so that
* it can be found when given the Thread Priority (uCOS task handle)
*/
nRetValue = OSTaskCreateExt (pThreadAttr->pThreadFunc,
pThreadAttr->pTaskAttrParam,
pStackTop,
(INT8U) (nAssignedPrio & 0xFFu),
(INT16U) nAssignedPrio,
pStackStart,
nStkSize,
(void *)hThreadNode,
(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR) ) ;
switch (nRetValue)
{
case OS_ERR_NONE:
/* set the Name of the task. Maximum characters in the
name of the task allowed is "OS_TASK_NAME_SIZE".
If it exceeds, it will be truncated to OS_TASK_NAME_SIZE*/
#pragma diag(push)
#pragma diag(suppress:misra_rule_11_4 : "typecasting to the type expexted by uC/OS is necessary, also necessary for the return value")
#pragma diag(suppress:misra_rule_11_5 : "the API between the OSAL and uCOS force a const --> non-const conversion.")
hThreadNode->nThreadSignature = ADI_OSAL_THREAD_SIGNATURE;
/* converting from a const to non-const variable could be a risk, but since the
data is getting copied anyway it's not an issue here.*/
/* Supression since typecasting "szTaskName" which is char_t to INT8U */
OSTaskNameSet((INT8U) nAssignedPrio,
(INT8U*) pThreadAttr->szThreadName,
&nErr);
if(nErr == OS_ERR_NONE)
{
/* The ADI_OSAL_THREAD_INFO structure is used as the thread handle */
*phThread = (ADI_OSAL_THREAD_HANDLE) hThreadNode;
eRetStatus = ADI_OSAL_SUCCESS;
}
else
{
eRetStatus = ADI_OSAL_FAILED;
}
break;
#pragma diag(pop)
#ifdef OSAL_DEBUG
/* Priority of the specified task is already exists */
case OS_ERR_PRIO_EXIST:
eRetStatus= ADI_OSAL_PRIORITY_IN_USE;
break;
/* Specified priority is out of range */
case OS_ERR_PRIO_INVALID:
eRetStatus = ADI_OSAL_BAD_PRIORITY;
break;
case OS_ERR_TASK_CREATE_ISR:
eRetStatus = ADI_OSAL_CALLER_ERROR;
break;
/* Not enough memory to create task */
case OS_ERR_TASK_NO_MORE_TCB:
eRetStatus = ADI_OSAL_MEM_ALLOC_FAILED;
break;
#endif
default:
eRetStatus = ADI_OSAL_FAILED;
break;
} /* end of switch */
OSSchedUnlock();
if(eRetStatus != ADI_OSAL_SUCCESS)
{
*phThread = ADI_OSAL_INVALID_THREAD;
if (NULL != hThreadNode)
{
hThreadNode->nThreadSignature=ADI_OSAL_INVALID_THREAD_SIGNATURE;
_adi_osal_MemFree(hThreadNode);
}
}
return(eRetStatus);
}
void alt_uCOSIIErrorHandler(INT8U error_code, void *expanded_diagnosis_ptr)
{
FAULT_LEVEL fault_level;
if(error_code == OS_NO_ERR)
{
return;
}
fault_level = SYSTEM;
OSSchedLock(); /* Disable Task Switching but still service other IRQs */
switch (error_code)
{
case OS_PRIO_EXIST:
fprintf(stderr, "Attempted to assign task priority aready in use.\n");
break;
case OS_PRIO_INVALID:
fprintf(stderr, "Specified task priority higher than allowed max.\n");
fprintf(stderr, "Task can't be assigned a priority higher than %d\n",
OS_LOWEST_PRIO);
break;
case OS_NO_MORE_TCB:
fprintf(stderr, "Task Control Blocks have been exhausted\n");
fprintf(stderr, "Current max number of tasks is %d\n",OS_MAX_TASKS);
break;
case OS_MBOX_FULL:
fault_level = NONE;
fprintf(stderr, "Attempted Post to Mailbox already holding message\n");
break;
case OS_ERR_EVENT_TYPE:
fault_level = TASK;
fprintf(stderr,
"Attempted to access a resource with no match for the required data type.\n");
break;
case OS_ERR_PEVENT_NULL:
fprintf(stderr, "Attempting to access a resource pointing to NULL\n");
break;
case OS_ERR_POST_NULL_PTR:
fault_level = TASK;
fprintf(stderr, "Attempted to Post a NULL to a resource. \n");
break;
case OS_TIMEOUT:
fault_level = NONE;
fprintf(stderr, "Resource not received in specified time\n");
break;
case OS_ERR_PEND_ISR:
fprintf(stderr, "Attempting to pend for a resource in an ISR\n");
break;
case OS_TASK_DEL_IDLE:
fprintf(stderr, "Attempted to delete the IDLE task\n");
break;
case OS_TASK_DEL_ERR:
fault_level = NONE;
fprintf(stderr, "Attempted to delete a task that does not exist\n");
break;
case OS_TASK_DEL_ISR:
fprintf(stderr, "Attempted to delete a task from an ISR\n");
break;
case OS_Q_FULL:
fault_level = NONE;
fprintf(stderr, "Attempted to post to a full message queue\n");
break;
case OS_ERR_NOT_MUTEX_OWNER:
fault_level = TASK;
fprintf(stderr, "Attempted to post a mutex not owned by the task\n");
break;
case EXPANDED_DIAGNOSIS_CODE:
fault_level = SYSTEM;
printf(
"\n[MicroC/OS-II]: See STDERR for expanded diagnosis translation.");
fprintf(stderr, "\n[MicroC/OS-II]: Expanded Diagnosis: %s.",
(char *)expanded_diagnosis_ptr);
break;
default:
printf("\n[MicroC/OS-II]: (Not a MicroC/OS-II error) See STDERR.\n");
fprintf(stderr, "\n[MicroC/OS-II]:");
fprintf(stderr, "\nError_code %d.\n", error_code);
perror("\n[MicroC/OS-II]: (Not a MicroC/OS-II error), ERRNO: ");
break;
}
/* Process the error based on the fault level,
* reenable scheduler if appropriate. */
switch (fault_level) {
case TASK:
/* Error can be isolated by killing the task */
printf("\n[MicroC/OS-II]: See STDERR (FAULT_LEVEL is TASK).");
fprintf(stderr, "\n[MicroC/OS-II]: FAULT_LEVEL is TASK");
fprintf(stderr, "\n[MicroC/OS-II]: Task is being deleted.\n");
OSSchedUnlock(); /* Reenable Task Switching */
OSTaskDel(OS_PRIO_SELF);
/* Reinvoke uCOSII error handler in case task deletion fails, in
* which case fault_level for this secondary error will be SYSTEM. */
alt_uCOSIIErrorHandler(error_code, 0);
break;
case SYSTEM:
/* Total System Failure, Restart Required */
printf("\n[MicroC/OS-II]: See STDERR (FAULT_LEVEL is SYSTEM).");
//.........这里部分代码省略.........
请发表评论