1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 <2022> 2023 2024 2025 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 <2022> 2023 2024 2025 |
<== Date ==> | <== Thread ==> |
---|
Subject: | Re: Segmentation fault when using asyn Octect writeRead |
From: | Mark Rivers via Tech-talk <tech-talk at aps.anl.gov> |
To: | Abdalla Ahmad <Abdalla.Ahmad at sesame.org.jo>, "tech-talk at aps.anl.gov" <tech-talk at aps.anl.gov> |
Date: | Thu, 13 Oct 2022 12:09:10 +0000 |
Hi Abdalla,
I think I see an error in your driver:
memcpy(tx_array + 0, &(tx.status), sizeof(u16));
memcpy(tx_array + 2, &(tx.command), sizeof(u16));
memcpy(tx_array + 2, &(tx.address), sizeof(u16));
memcpy(tx_array + 4, &(tx.data), sizeof(u32));
You are copying to tx_array+2 twice. I think you probably mean
memcpy(tx_array + 0, &(tx.status), sizeof(u16));
memcpy(tx_array + 2, &(tx.command), sizeof(u16));
memcpy(tx_array + 4, &(tx.address), sizeof(u16));
memcpy(tx_array + 6, &(tx.data), sizeof(u32));
The following also looks like it might be an error. You are passing a pointer to a float cast to u32*. Does your device really return a 32-bit float, or does it return an integer?
asynStatus PSController::readFloat64(asynUser* asyn, epicsFloat64* value)
{
float temp = (float) *value;
asynStatus status = performIO(asyn, (u32*) &temp);
*value = temp;
return status;
}
Neither of these problems is likely to cause the crash. Please run the program under gdb and send the output of "backtrace" when it crashes.
Mark
From: Abdalla Ahmad <Abdalla.Ahmad at sesame.org.jo>
Sent: Thursday, October 13, 2022 5:48 AM To: tech-talk at aps.anl.gov <tech-talk at aps.anl.gov>; Mark Rivers <rivers at cars.uchicago.edu> Subject: Segmentation fault when using asyn Octect writeRead Hello
I am writing a driver to control a custom power supply using asynPortDriver, I am using asynOctetSyncIO->writeRead interface to do IO with the controller but the IOC crashes on calling the function (https://github.com/AbdallaDalleh/psc-asyn-driver/blob/main/pscApp/src/PSController.cpp#L83 ). The asynOctetSyncIO interface crashes specifically on line 238, when casting the userPvt pointer of the passed asynUser pointer. I used this interface many times before and I have no idea why the segmentation fault happens.
Best Regards, Abdalla. |