sprintf() not callable from any OS ISR.

This commit is contained in:
Ron Sluiter
2010-03-15 20:51:23 +00:00
parent 3587ed0b9f
commit f0cf41d4ef
2 changed files with 31 additions and 35 deletions
+17 -16
View File
@@ -2,9 +2,10 @@
FILENAME... drvOms.cc
USAGE... Driver level support for OMS models VME8, VME44 and VS4.
Version: $Revision: 1.29 $
Modified By: $Author: sluiter $
Last Modified: $Date: 2009-09-08 18:27:58 $
Version: $Revision$
Modified By: $Author$
Last Modified: $Date$
HeadURL: $URL$
*/
/*
@@ -74,6 +75,7 @@ Last Modified: $Date: 2009-09-08 18:27:58 $
* - changed IRS to task comm. mechanism from epicsRingPointer
* to epicsRingByte.
* .14 06-18-09 rls - Make omsSetup() error messages more prominent.
* .15 03-15-10 rls - sprintf() not callable from any OS ISR.
*/
/*========================stepper motor driver ========================
@@ -793,10 +795,15 @@ static void motorIsr(int card)
epicsUInt8 status;
epicsUInt8 doneFlags;
char dataChar;
static char errmsg1[] = "\ndrvOms.cc:motorIsr: Invalid entry - card xx\n";
static char errmsg2[] = "\ndrvOms.cc:motorIsr: command error - card xx\n";
static char errmsg3[] = "\ndrvOms.cc:motorIsr: Rx ring overflow - card xx\n";
if (card >= total_cards || (pmotorState = motor_state[card]) == NULL)
{
errlogPrintf("Invalid entry-card #%d\n", card);
errmsg1[45-2] = '0' + card%10;
errmsg1[45-3] = '0' + (card/10)%10;
epicsInterruptContextMessage(errmsg1);
return;
}
@@ -814,11 +821,6 @@ static void motorIsr(int card)
/* Determine cause of entry */
#ifdef DEBUG
if (drvOMSdebug >= 10)
errlogPrintf("entry card #%d,status=0x%X,done=0x%X\n", card, status, doneFlags);
#endif
/* Motion done handling */
if (status & STAT_DONE)
/* Wake up polling task 'motor_task()' to issue callbacks */
@@ -828,12 +830,9 @@ static void motorIsr(int card)
if (status & STAT_ERROR)
{
pmotor->data = (epicsUInt8) CMD_CLEAR;
/* Send null character to indicate error */
#ifdef DEBUG
if (drvOMSdebug >= 1)
errlogPrintf("command error detected on card %d\n", card);
#endif
errmsg2[45-2] = '0' + card%10;
errmsg2[45-3] = '0' + (card/10)%10;
epicsInterruptContextMessage(errmsg2);
irqdata->irqErrno |= STAT_ERROR;
}
@@ -856,7 +855,9 @@ static void motorIsr(int card)
if (epicsRingBytesPut(irqdata->recv_rng, &dataChar, 1) == 0)
{
errlogPrintf("card %d recv ring full, lost '%c'\n", card, dataChar);
errmsg3[48-2] = '0' + card%10;
errmsg3[48-3] = '0' + (card/10)%10;
epicsInterruptContextMessage(errmsg3);
irqdata->irqErrno |= STAT_INPUT_BUF_FULL;
}
irqdata->recv_sem->signal();
+14 -19
View File
@@ -2,9 +2,10 @@
FILENAME... drvOms58.cc
USAGE... Motor record driver level support for OMS model VME58.
Version: $Revision: 1.29 $
Modified By: $Author: sluiter $
Last Modified: $Date: 2009-09-08 18:27:58 $
Version: $Revision$
Modified By: $Author$
Last Modified: $Date$
HeadURL: $URL$
*/
/*
@@ -107,6 +108,7 @@ Last Modified: $Date: 2009-09-08 18:27:58 $
* .36 03-14-08 rls - 64-bit compatiability.
* .37 02-05-09 rls - Have start_status() start ALL updates before waiting.
* .38 06-18-09 rls - Make oms58Setup() error messages more prominent.
* .39 03-15-10 rls - sprintf() not callable from any OS ISR.
*
*/
@@ -944,7 +946,7 @@ oms58Setup(int num_cards, /* maximum number of cards in rack */
/*****************************************************/
/* Interrupt service routine. */
/* motorIsr() */
/* motorIsr() */
/*****************************************************/
static void motorIsr(int card)
{
@@ -952,13 +954,14 @@ static void motorIsr(int card)
volatile struct vmex_motor *pmotor;
STATUS_REG statusBuf;
epicsUInt8 doneFlags, userIO, slipFlags, limitFlags, cntrlReg;
static char errmsg[60];
static char cmderrmsg[60];
static char errmsg1[] = "\ndrvOms58.cc:motorIsr: Invalid entry - card xx\n";
static char errmsg2[] = "\ndrvOms58.cc:motorIsr: command error - card xx\n";
if (card >= total_cards || (pmotorState = motor_state[card]) == NULL)
{
sprintf(errmsg, "%s(%d): Invalid entry-card #%d.\n", __FILE__, __LINE__, card);
epicsInterruptContextMessage(errmsg);
errmsg1[47-2] = '0' + card%10;
errmsg1[47-3] = '0' + (card/10)%10;
epicsInterruptContextMessage(errmsg1);
return;
}
@@ -990,15 +993,6 @@ static void motorIsr(int card)
pmotor->control.cntrlReg = (epicsUInt8) 0x90;
/* Questioniable Fix for undefined problem Ends Here. */
#ifdef DEBUG
if (drvOms58debug >= 10)
{
sprintf(errmsg, "%s(%d): entry card #%d,status=0x%X,done=0x%X\n",
__FILE__, __LINE__, card, statusBuf.All, doneFlags);
epicsInterruptContextMessage(errmsg);
}
#endif
/* Motion done handling */
if (statusBuf.Bits.done)
/* Wake up polling task 'motor_task()' to issue callbacks */
@@ -1006,8 +1000,9 @@ static void motorIsr(int card)
if (statusBuf.Bits.cmndError)
{
sprintf(cmderrmsg, "%s(%d): command error on card #%d.\n", __FILE__, __LINE__, card);
epicsInterruptContextMessage(cmderrmsg);
errmsg2[47-2] = '0' + card%10;
errmsg2[47-3] = '0' + (card/10)%10;
epicsInterruptContextMessage(errmsg2);
}
}