Updated semLib calls for vx V5.1

This commit is contained in:
Marty Kraimer
1993-07-28 10:30:34 +00:00
parent 92ea222c4d
commit 88ab802eb1
3 changed files with 90 additions and 109 deletions
+61 -64
View File
@@ -180,6 +180,11 @@
* .53 08-25-92 mrk made masks a macro
* .54 08-25-92 mrk added support for Type E,T,R,S Tcs
* .55 08-25-92 mrk support epics I/O event scan
* .56 06-30-93 mrk After 3 attempts to queue request Ask to initialize
* .57 07-22-93 mrk For BI call scanIoRequest when adapter status changes
* .58 07-22-93 mrk For AB1771IL sign_bit>>= becomes sign_bit<<=
* .59 07-27-93 mrk Included changes made by Jeff Hill to stop warning messages
* .60 07-27-93 mrk Made changes for vxWorks 5.x semLib
*/
/*
@@ -324,7 +329,7 @@ struct {
static long report(level)
int level;
{
ab_io_report(level);
return(ab_io_report(level));
}
/* forward reference for ioc_reboot */
@@ -332,10 +337,8 @@ int ioc_reboot();
static long init()
{
int status;
ab_driver_init();
return(0);
return(ab_driver_init());
}
@@ -358,8 +361,8 @@ WDOG_ID wd_id[AB_MAX_LINKS]; /* watchdog task ID */
int ab_timeout(); /* internal timeout handler */
/* message complete variables */
SEMAPHORE ab_data_sem; /* transfer complete semaphore */
SEMAPHORE ab_cmd_sem; /* transfer complete semaphore */
SEM_ID ab_data_sem; /* transfer complete semaphore */
SEM_ID ab_cmd_sem; /* transfer complete semaphore */
/* following flag indicates to interrupt handler that we're
requesting a block xfer (and expect immediate confirmation) */
short ab_requesting_bt[AB_MAX_LINKS];
@@ -475,6 +478,7 @@ extern short wakeup_init; /* flags that the database scan initialization is comp
* which in turn flags all channels on the adapter as hardware errors
*/
short ab_adapter_status[AB_MAX_LINKS][AB_MAX_ADAPTERS];
short ab_adapter_status_change[AB_MAX_LINKS][AB_MAX_ADAPTERS];
/* disables the scanner during a restart - required for */
/* successful restart of the IOC */
@@ -506,7 +510,7 @@ unsigned short reset_code[100];
unsigned short reset_cnt = 0;
/* forward references */
void wtrans();
static void wtrans();
int abScanTask();
void ab_reset_task();
int ab_reset();
@@ -559,11 +563,17 @@ register short pass;
}
/* don't make another block transfer request if one's outstanding... */
if((ab_btq_cnt[link][adapter][card] % 50) != 0) {
if((ab_btq_cnt[link][adapter][card] % 10) != 0) {
/* ...but try again periodically in case a request got lost. */
ab_btq_cnt[link][adapter][card]++;
continue;
}
/*If 3 queue attempts fail then reinitialize*/
if(ab_btq_cnt[link][adapter][card] >= 30) {
*pcard &= ~(AB_INIT_BIT | AB_SENT_INIT);
ab_btq_cnt[link][adapter][card] = 0;
continue;
}
/* need block transfer */
btq_err = OK; /* assume success */
@@ -820,7 +830,7 @@ unsigned short *pmsg;
/* copy the message into the dual-ported memory */
/* clear the semaphore to make sure we stay in sync */
if((semClear(&ab_cmd_sem) == 0) && ab_debug)
if((semTake(ab_cmd_sem,NO_WAIT) == OK) && ab_debug)
logMsg("link %x, semaphore set before bt_queue cmd %x,%x,%x\n",
link,command,pmb->command,pmb->conf_stat);
@@ -845,12 +855,7 @@ unsigned short *pmsg;
p6008->sc_intr = 1;
/* wait for the command to be accepted */
# ifdef V5_vxWorks
semTake(&ab_cmd_sem, WAIT_FOREVER);
# else
semTake(&ab_cmd_sem);
# endif
semTake(ab_cmd_sem, WAIT_FOREVER);
/* determine if the command was accepted */
if (ab_tout[link] == ERROR){
if(ab_debug)
@@ -914,12 +919,7 @@ abDoneTask(){
struct ab_response *presponse = &response;
while(TRUE){
/* wait for block transfer completion */
# ifdef V5_vxWorks
semTake(&ab_data_sem, WAIT_FOREVER);
# else
semTake(&ab_data_sem);
# endif
semTake(ab_data_sem, WAIT_FOREVER);
while (rngBufGet(ab_cmd_q,&response,sizeof(struct ab_response))
== sizeof(struct ab_response)){
link = presponse->link;
@@ -995,7 +995,7 @@ abDoneTask(){
= (struct ab1771il_read *)presponse->data;
pab_table = &ab_btdata[link][adapter][card][0];
pab_sts = &ab_btsts[link][adapter][card][0];
for (i=0, sign_bit=1; i < ai_num_channels[AB1771IL]; i++, sign_bit>>= 1){
for (i=0, sign_bit=1; i < ai_num_channels[AB1771IL]; i++, sign_bit<<= 1){
/* status */
if((pmsg->urange & sign_bit) || (pmsg->orange & sign_bit)){
*pab_sts = -3;
@@ -1129,11 +1129,12 @@ unsigned char ab_old_binary_ins[AB_MAX_LINKS*AB_MAX_ADAPTERS*AB_MAX_CARDS];
ab_bi_cos_simulator()
{
register struct ab_region *p6008;
register unsigned short card_inx,link;
register unsigned short link;
register unsigned short *pcard;
unsigned short *ps_input,*ps_oldval;
short adapter,card,inpinx;
short first_scan,first_scan_complete;
short adapter_status_change;
first_scan_complete = first_scan = 0;
for(;;){
@@ -1143,23 +1144,25 @@ ab_bi_cos_simulator()
/* check each link */
link = 0;
for (link = 0; link < AB_MAX_LINKS; link++){
if ((p6008 = p6008s[link]) == 0) continue;
if ((p6008 = p6008s[link]) == 0) continue;
for (adapter = 0; adapter < AB_MAX_ADAPTERS; adapter++){
adapter_status_change = ab_adapter_status_change[link][adapter];
ab_adapter_status_change[link][adapter] = 0;
/* check each card that is configured to be a binary input card */
pcard = &ab_config[link][0][0];
for (card_inx = 0; card_inx < AB_MAX_ADAPTERS*AB_MAX_CARDS; card_inx++,pcard++){
for (card = 0; card < AB_MAX_CARDS; card++){
pcard = &ab_config[link][adapter][card];
inpinx = (adapter * AB_CARD_ADAPTER) + card;
if ((*pcard & AB_INTERFACE_TYPE) != AB_BI_INTERFACE) continue;
if ((*pcard & AB_CARD_TYPE) == ABBI_16_BIT){
/* sixteen bit byte ordering in dual ported memory */
/* byte 0011 2233 4455 6677 8899 AABB */
/* card 0000 2222 4444 6666 8888 AAAA */
if (card_inx & 0x1) continue;
ps_input = (unsigned short *)&(p6008->iit[card_inx]);
ps_oldval = (unsigned short *)&(ab_old_binary_ins[card_inx]);
if ((*ps_input != *ps_oldval) || first_scan){
adapter = card_inx / AB_MAX_CARDS;
card = card_inx - (adapter * AB_MAX_CARDS);
if (inpinx & 0x1) continue;
ps_input = (unsigned short *)&(p6008->iit[inpinx]);
ps_oldval = (unsigned short *)&(ab_old_binary_ins[inpinx]);
if ((*ps_input != *ps_oldval) || first_scan || adapter_status_change){
#ifdef EPICS_V2
io_event_scanner_wakeup(IO_BI,ABBI_16_BIT,card,link,adapter);
#else
@@ -1170,12 +1173,9 @@ ab_bi_cos_simulator()
}else{
/* eight bit byte ordering in dual ported memory */
/* 1100 3322 5544 7766 9988 BBAA */
inpinx = card_inx;
if (inpinx & 0x1) inpinx--; /* shuffle those bytes */
else inpinx++;
if ((p6008->iit[inpinx] != ab_old_binary_ins[inpinx]) || first_scan){
adapter = card_inx / AB_MAX_CARDS;
card = card_inx - (adapter * AB_MAX_CARDS);
if ((p6008->iit[inpinx] != ab_old_binary_ins[inpinx]) || first_scan || adapter_status_change){
#ifdef EPICS_V2
io_event_scanner_wakeup(IO_BI,ABBI_08_BIT,card,link,adapter);
#else
@@ -1186,15 +1186,16 @@ ab_bi_cos_simulator()
}
}
}
}
/* turn off first scan */
if (first_scan){
first_scan_complete = 1;
first_scan = 0;
}
/* turn off first scan */
if (first_scan){
first_scan_complete = 1;
first_scan = 0;
}
/* check for changes at about 15 Hertz */
taskDelay(SECOND/15);
/* check for changes at about 15 Hertz */
taskDelay(SECOND/15);
}
}
@@ -1224,8 +1225,10 @@ ab_driver_init()
/* initialize the Allen-Bradley 'done' semaphore */
if (abScanId == 0){
semInit(&ab_cmd_sem);
semInit(&ab_data_sem);
if(!(ab_cmd_sem=semBCreate(SEM_Q_FIFO,SEM_EMPTY)))
errMessage(0,"semBcreate failed in initEvent");
if(!(ab_data_sem=semBCreate(SEM_Q_FIFO,SEM_EMPTY)))
errMessage(0,"semBcreate failed in initEvent");
if ((ab_cmd_q = rngCreate(AB_Q_SZ)) == (RING_ID)NULL)
panic ("ab_init: ab_cmd_q\n");
}
@@ -1329,7 +1332,7 @@ register short link;
/* on initialization the scanner puts its firmware revision info */
/* into the general data are of the dual-port. We save it here. */
/* (The most current revision is Series A, Revision D.) */
strcpy(pfirmware_info,&pmb->da);
strcpy(pfirmware_info,(char *)&pmb->da);
if(ab_debug != 0)
logMsg("link %x f/w = :\n\t%s\n",link,ab_firmware_info[link]);
/*scanner comes up in program_mode */
@@ -1343,7 +1346,7 @@ register short link;
if((ab_op_stat[link] & PROGRAM_MODE) != PROGRAM_MODE){
/* This link must already be initialized. We're done */
logMsg("Link %x already initialized\n",link);
return;
return(0);
}
/* setup scanner */
@@ -1385,8 +1388,8 @@ register short link;
* scanner management command send
*/
mr_wait(command,length,pmsg,link)
register short command;
register short length;
unsigned short command;
short length;
short *pmsg;
unsigned short link;
{
@@ -1414,7 +1417,7 @@ unsigned short link;
/* clear the semaphore to make sure we stay in sync */
if((semClear(&ab_cmd_sem) == 0) && ab_debug)
if((semTake(ab_cmd_sem,NO_WAIT) == OK) && ab_debug)
logMsg("link %x, semaphore set before mr_wait cmd %x,%x,%x\n",
link,command,pmb->command,pmb->conf_stat);
@@ -1429,11 +1432,7 @@ unsigned short link;
case LINK_STATUS:
wdStart(wd_id[link],SECOND*10,ab_timeout,link);
p6008->sc_intr = 1; /* wakeup scanner tsk */
#ifdef V5_vxWorks
semTake(&ab_cmd_sem, WAIT_FOREVER);
# else
semTake(&ab_cmd_sem);
# endif
semTake(ab_cmd_sem, WAIT_FOREVER);
/* was this a timeout? */
if(ab_tout[link] == ERROR){
if(ab_debug != 0)
@@ -1467,11 +1466,7 @@ unsigned short link;
wtrans(pmsg,pmb_msg); /* xfer data to local mailbox */
wdStart(wd_id[link],SECOND*5,ab_timeout,link);
p6008->sc_intr = 1; /* wakeup scanner */
# ifdef V5_vxWorks
semTake(&ab_cmd_sem, WAIT_FOREVER);
# else
semTake(&ab_cmd_sem);
# endif
semTake(ab_cmd_sem, WAIT_FOREVER);
/* was this a timeout? */
if(ab_tout[link] == ERROR){
if(ab_debug != 0)
@@ -1533,7 +1528,7 @@ short link;
ab_intr_cnt[link]++;
if (((pmb->command != AB_WRITE) && (pmb->command != AB_READ)) ||
(ab_requesting_bt[link])){
semGive(&ab_cmd_sem);
semGive(ab_cmd_sem);
wdCancel(wd_id[link]);
}else{
presponse = &response;
@@ -1562,7 +1557,7 @@ short link;
logMsg("ab_cmd_q - Full\n");
/* wake up abDoneTask */
semGive(&ab_data_sem);
semGive(ab_data_sem);
pmb->fl_lock = 0;
}
}
@@ -1579,7 +1574,7 @@ int link;
ab_tout[link] = ERROR;
/* only the command receive gives a damn */
semGive(&ab_cmd_sem);
semGive(ab_cmd_sem);
/* keep track in case someone wants to snoop */
ab_comm_to[link]++;
@@ -1669,7 +1664,7 @@ unsigned short value;
if ((*pcard & AB_CARD_TYPE) != card_type) return(-1);
/* put the value into the table */
if (ab_btdata[link][adapter][card][signal] == value) return(0);
if ((unsigned short)ab_btdata[link][adapter][card][signal] == value) return(0);
ab_btdata[link][adapter][card][signal] = value;
*pcard |= AB_UPDATE;
@@ -1905,6 +1900,7 @@ unsigned short link;
if (ab_adapter_status[link][i] == -1) {
printf("link %d adapter %d change bad to good\n"
,link,i);
ab_adapter_status_change[link][i]=1;
}
ab_adapter_status[link][i] = 0;
/* bad status */
@@ -1912,6 +1908,7 @@ unsigned short link;
if (ab_adapter_status[link][i] == 0){
printf("link %d adapter %d change good to bad\n"
,link,i);
ab_adapter_status_change[link][i]=1;
}
ab_adapter_status[link][i] = -1;
}
+11 -14
View File
@@ -294,10 +294,10 @@ struct compumotor {
/* array of pointers to stepper motor driver cards present in system */
struct compumotor *pcompu_motors[MAX_COMPU_MOTORS];
LOCAL SEMAPHORE compu_wakeup; /* compumotor data request task semaphore */
LOCAL SEM_ID compu_wakeup; /* compumotor data request task semaphore */
/* response variables */
LOCAL SEMAPHORE smRespSem; /* task semaphore */
LOCAL SEM_ID smRespSem; /* task semaphore */
LOCAL RING_ID smRespQ; /* ring buffer */
int smRespId; /* task id */
#define RESP_Q_SZ (RESPBUF_SZ * 50) /* response ring buffer size */
@@ -388,12 +388,7 @@ compu_resp_task()
FOREVER {
/* wait for somebody to wake us up */
# ifdef V5_vxWorks
semTake (&smRespSem, WAIT_FOREVER);
# else
semTake (&smRespSem);
# endif
semTake (smRespSem, WAIT_FOREVER);
/* the response buffer contains: */
/* 0 - motor number */
/* 1 - the command which solicited this response */
@@ -534,7 +529,7 @@ register int mdnum;
if (rngBufPut(smRespQ,(char *)sm_responses[mdnum],RESPBUF_SZ) != RESPBUF_SZ)
logMsg("smRespQ %d - Full\n",mdnum);
else
semGive (&smRespSem);
semGive (smRespSem);
/* the zero-th byte is the motor number */
counts[mdnum] = 1; /* start with command */
@@ -601,8 +596,10 @@ compu_driver_init(){
/* intialize the semaphores which awakens the sleeping *
* stepper motor command task and the stepper motor response task */
semInit(&smRespSem);
semInit(&compu_wakeup);
if(!(smRespSem=semBCreate(SEM_Q_FIFO,SEM_EMPTY)))
errMessage(0,"semBcreate failed in compu_driver_init");
if(!(compu_wakeup=semBCreate(SEM_Q_FIFO,SEM_EMPTY)))
errMessage(0,"semBcreate failed in compu_driver_init");
/* spawn the sleeping motor driver command and response tasks */
smRespId =
@@ -800,7 +797,7 @@ printf("%x ",compu_msg[j]);
compu_motor_array[card].active = TRUE;
/* wakeup the compu task */
semGive(&compu_wakeup);
semGive(compu_wakeup);
break;
@@ -816,7 +813,7 @@ printf("%x ",compu_msg[j]);
}
/* wakeup the compu task */
semGive(&compu_wakeup);
semGive(compu_wakeup);
break;
case (SM_CALLBACK):
@@ -862,7 +859,7 @@ printf("%x ",compu_msg[j]);
compu_motor_array[card].active = TRUE;
/* wakeup the compu task */
semGive(&compu_wakeup);
semGive(compu_wakeup);
break;
+18 -31
View File
@@ -131,11 +131,11 @@ struct motor_data motor_data_array[MAX_OMS_CARDS][MAX_OMS_CHANNELS];
char oms_motor_specifier[MAX_OMS_CHANNELS+1] = {'X','Y','Z','T','U','V'};
/* scan task parameters */
LOCAL SEMAPHORE oms_wakeup; /* oms_task wakeup semaphore */
LOCAL SEMAPHORE oms_send_sem; /* oms_task wakeup semaphore */
LOCAL SEM_ID oms_wakeup; /* oms_task wakeup semaphore */
LOCAL SEM_ID oms_send_sem; /* oms_task wakeup semaphore */
/* response task variables */
LOCAL SEMAPHORE oms_resp_sem; /* wakeup semaphore for the resp task */
LOCAL SEM_ID oms_resp_sem; /* wakeup semaphore for the resp task */
LOCAL RING_ID oms_resp_q; /* queue of responses */
/* interrupt routine message buffers */
@@ -179,7 +179,7 @@ register short card;
!= OMS_MSG_SZ){
logMsg("oms_resp_q full\n");
}else{
semGive (&oms_resp_sem);
semGive (oms_resp_sem);
}
*pinx = 0; /* reset buffer */
@@ -222,12 +222,7 @@ oms_resp_task()
FOREVER {
/* wait for somebody to wake us up */
# ifdef V5_vxWorks
semTake (&oms_resp_sem, WAIT_FOREVER);
# else
semTake (&oms_resp_sem);
# endif
semTake (oms_resp_sem, WAIT_FOREVER);
/* process requests in the command ring buffer */
while (rngBufGet(oms_resp_q,resp,OMS_MSG_SZ) == OMS_MSG_SZ){
if (oms_debug)
@@ -326,12 +321,7 @@ oms_task()
register struct vmex_motor *pmotor;
while(1){
# ifdef V5_vxWorks
semTake(&oms_wakeup, WAIT_FOREVER);
# else
semTake(&oms_wakeup);
# endif
semTake(oms_wakeup, WAIT_FOREVER);
motor_active = TRUE;
while (motor_active){
motor_active = FALSE;
@@ -419,13 +409,14 @@ oms_driver_init(){
panic ("oms_driver_init: oms_resp_q not created\n");
/* initialize the oms response task semaphore */
semInit(&oms_resp_sem);
if(!(oms_resp_sem=semBCreate(SEM_Q_FIFO,SEM_EMPTY)))
errMessage(0,"semBcreate failed in oms_driver_init");
/* intialize the data request wakeup semaphore */
semInit(&oms_wakeup);
if(!(oms_wakeup=semBCreate(SEM_Q_FIFO,SEM_EMPTY)))
errMessage(0,"semBcreate failed in oms_driver_init");
/* oms card mutual exclusion semaphore */
semInit(&oms_send_sem);
semGive(&oms_send_sem);
if(!(oms_send_sem=semBCreate(SEM_Q_FIFO,SEM_FULL)))
errMessage(0,"semBcreate failed in oms_driver_init");
/* spawn the motor data request task */
taskSpawn("oms_task",42,VX_FP_TASK,8000,oms_task);
@@ -517,7 +508,7 @@ int arg2;
oms_motor_array[card][channel].active = TRUE;
/* wakeup the oms task */
semGive(&oms_wakeup);
semGive(oms_wakeup);
break;
case (SM_MOTION):
@@ -531,7 +522,7 @@ int arg2;
oms_send_msg(oms_motor_present[card],oms_move_msg);
/* wakeup the oms task */
semGive(&oms_wakeup);
semGive(oms_wakeup);
break;
case (SM_CALLBACK):
@@ -552,7 +543,7 @@ int arg2;
oms_motor_array[card][channel].active = TRUE;
/* wakeup the oms task */
semGive(&oms_wakeup);
semGive(oms_wakeup);
break;
@@ -569,7 +560,7 @@ int arg2;
oms_motor_array[card][channel].active = TRUE;
/* wakeup the oms task */
semGive(&oms_wakeup);
semGive(oms_wakeup);
break;
}
@@ -590,11 +581,7 @@ register char *pmsg;
int i;
i = 0;
/* take the mutual exclusion semaphore */
# ifdef V5_vxWorks
semTake(&oms_send_sem, WAIT_FOREVER);
# else
semTake(&oms_send_sem);
# endif
semTake(oms_send_sem, WAIT_FOREVER);
while (*pmsg){
if (pmotor->status & 0x01){
oms_illcmd++;
@@ -621,7 +608,7 @@ i = 0;
}
}
/* release the mutual exclusion semaphore */
semGive(&oms_send_sem);
semGive(oms_send_sem);
}
oms_io_report(level)