Merge branch 'master' of https://github.com/CANopenNode/CANopenNode
This commit is contained in:
commit
32d6106047
3 changed files with 15 additions and 22 deletions
|
|
@ -621,13 +621,12 @@ CO_SDO_return_t CO_SDOclientDownload(CO_SDOclient_t *SDO_C,
|
||||||
}
|
}
|
||||||
if (abortCode == CO_SDO_AB_NONE) {
|
if (abortCode == CO_SDO_AB_NONE) {
|
||||||
OD_size_t countWritten = 0;
|
OD_size_t countWritten = 0;
|
||||||
bool_t lock = OD_mappable(&SDO_C->OD_IO.stream);
|
|
||||||
|
|
||||||
/* write data to Object Dictionary */
|
/* write data to Object Dictionary */
|
||||||
if (lock) { CO_LOCK_OD(SDO_C->CANdevTx); }
|
CO_LOCK_OD(SDO_C->CANdevTx);
|
||||||
ODR_t odRet = SDO_C->OD_IO.write(&SDO_C->OD_IO.stream, buf,
|
ODR_t odRet = SDO_C->OD_IO.write(&SDO_C->OD_IO.stream, buf,
|
||||||
(OD_size_t)count, &countWritten);
|
(OD_size_t)count, &countWritten);
|
||||||
if (lock) { CO_UNLOCK_OD(SDO_C->CANdevTx); }
|
CO_UNLOCK_OD(SDO_C->CANdevTx);
|
||||||
|
|
||||||
/* verify for errors in write */
|
/* verify for errors in write */
|
||||||
if (odRet != ODR_OK && odRet != ODR_PARTIAL) {
|
if (odRet != ODR_OK && odRet != ODR_PARTIAL) {
|
||||||
|
|
@ -1214,13 +1213,12 @@ CO_SDO_return_t CO_SDOclientUpload(CO_SDOclient_t *SDO_C,
|
||||||
? countData : (OD_size_t)countFifo;
|
? countData : (OD_size_t)countFifo;
|
||||||
OD_size_t countRd = 0;
|
OD_size_t countRd = 0;
|
||||||
uint8_t buf[CO_CONFIG_SDO_CLI_BUFFER_SIZE + 1];
|
uint8_t buf[CO_CONFIG_SDO_CLI_BUFFER_SIZE + 1];
|
||||||
bool_t lock = OD_mappable(&SDO_C->OD_IO.stream);
|
|
||||||
|
|
||||||
/* load data from OD variable into the buffer */
|
/* load data from OD variable into the buffer */
|
||||||
if (lock) { CO_LOCK_OD(SDO_C->CANdevTx); }
|
CO_LOCK_OD(SDO_C->CANdevTx);
|
||||||
ODR_t odRet = SDO_C->OD_IO.read(&SDO_C->OD_IO.stream,
|
ODR_t odRet = SDO_C->OD_IO.read(&SDO_C->OD_IO.stream,
|
||||||
buf, countBuf, &countRd);
|
buf, countBuf, &countRd);
|
||||||
if (lock) { CO_UNLOCK_OD(SDO_C->CANdevTx); }
|
CO_UNLOCK_OD(SDO_C->CANdevTx);
|
||||||
|
|
||||||
if (odRet != ODR_OK && odRet != ODR_PARTIAL) {
|
if (odRet != ODR_OK && odRet != ODR_PARTIAL) {
|
||||||
abortCode = (CO_SDO_abortCode_t)OD_getSDOabCode(odRet);
|
abortCode = (CO_SDO_abortCode_t)OD_getSDOabCode(odRet);
|
||||||
|
|
|
||||||
|
|
@ -551,12 +551,11 @@ static bool_t validateAndWriteToOD(CO_SDOserver_t *SDO,
|
||||||
|
|
||||||
/* write data */
|
/* write data */
|
||||||
OD_size_t countWritten = 0;
|
OD_size_t countWritten = 0;
|
||||||
bool_t lock = OD_mappable(&SDO->OD_IO.stream);
|
|
||||||
|
|
||||||
if (lock) { CO_LOCK_OD(SDO->CANdevTx); }
|
CO_LOCK_OD(SDO->CANdevTx);
|
||||||
ODR_t odRet = SDO->OD_IO.write(&SDO->OD_IO.stream, SDO->buf,
|
ODR_t odRet = SDO->OD_IO.write(&SDO->OD_IO.stream, SDO->buf,
|
||||||
SDO->bufOffsetWr, &countWritten);
|
SDO->bufOffsetWr, &countWritten);
|
||||||
if (lock) { CO_UNLOCK_OD(SDO->CANdevTx); }
|
CO_UNLOCK_OD(SDO->CANdevTx);
|
||||||
|
|
||||||
SDO->bufOffsetWr = 0;
|
SDO->bufOffsetWr = 0;
|
||||||
|
|
||||||
|
|
@ -613,12 +612,11 @@ static bool_t readFromOd(CO_SDOserver_t *SDO,
|
||||||
/* load data from OD variable into the buffer */
|
/* load data from OD variable into the buffer */
|
||||||
OD_size_t countRd = 0;
|
OD_size_t countRd = 0;
|
||||||
uint8_t *bufShifted = SDO->buf + countRemain;
|
uint8_t *bufShifted = SDO->buf + countRemain;
|
||||||
bool_t lock = OD_mappable(&SDO->OD_IO.stream);
|
|
||||||
|
|
||||||
if (lock) { CO_LOCK_OD(SDO->CANdevTx); }
|
CO_LOCK_OD(SDO->CANdevTx);
|
||||||
ODR_t odRet = SDO->OD_IO.read(&SDO->OD_IO.stream, bufShifted,
|
ODR_t odRet = SDO->OD_IO.read(&SDO->OD_IO.stream, bufShifted,
|
||||||
countRdRequest, &countRd);
|
countRdRequest, &countRd);
|
||||||
if (lock) { CO_UNLOCK_OD(SDO->CANdevTx); }
|
CO_UNLOCK_OD(SDO->CANdevTx);
|
||||||
|
|
||||||
if (odRet != ODR_OK && odRet != ODR_PARTIAL) {
|
if (odRet != ODR_OK && odRet != ODR_PARTIAL) {
|
||||||
*abortCode = (CO_SDO_abortCode_t)OD_getSDOabCode(odRet);
|
*abortCode = (CO_SDO_abortCode_t)OD_getSDOabCode(odRet);
|
||||||
|
|
@ -850,12 +848,11 @@ CO_SDO_return_t CO_SDOserver_process(CO_SDOserver_t *SDO,
|
||||||
|
|
||||||
/* Copy data */
|
/* Copy data */
|
||||||
OD_size_t countWritten = 0;
|
OD_size_t countWritten = 0;
|
||||||
bool_t lock = OD_mappable(&SDO->OD_IO.stream);
|
|
||||||
|
|
||||||
if (lock) { CO_LOCK_OD(SDO->CANdevTx); }
|
CO_LOCK_OD(SDO->CANdevTx);
|
||||||
ODR_t odRet = SDO->OD_IO.write(&SDO->OD_IO.stream, buf,
|
ODR_t odRet = SDO->OD_IO.write(&SDO->OD_IO.stream, buf,
|
||||||
dataSizeToWrite, &countWritten);
|
dataSizeToWrite, &countWritten);
|
||||||
if (lock) { CO_UNLOCK_OD(SDO->CANdevTx); }
|
CO_UNLOCK_OD(SDO->CANdevTx);
|
||||||
|
|
||||||
if (odRet != ODR_OK) {
|
if (odRet != ODR_OK) {
|
||||||
abortCode = (CO_SDO_abortCode_t)OD_getSDOabCode(odRet);
|
abortCode = (CO_SDO_abortCode_t)OD_getSDOabCode(odRet);
|
||||||
|
|
@ -1299,12 +1296,11 @@ CO_SDO_return_t CO_SDOserver_process(CO_SDOserver_t *SDO,
|
||||||
#else /* Expedited transfer only */
|
#else /* Expedited transfer only */
|
||||||
/* load data from OD variable */
|
/* load data from OD variable */
|
||||||
OD_size_t count = 0;
|
OD_size_t count = 0;
|
||||||
bool_t lock = OD_mappable(&SDO->OD_IO.stream);
|
|
||||||
|
|
||||||
if (lock) { CO_LOCK_OD(SDO->CANdevTx); }
|
CO_LOCK_OD(SDO->CANdevTx);
|
||||||
ODR_t odRet = SDO->OD_IO.read(&SDO->OD_IO.stream,
|
ODR_t odRet = SDO->OD_IO.read(&SDO->OD_IO.stream,
|
||||||
&SDO->CANtxBuff->data[4], 4, &count);
|
&SDO->CANtxBuff->data[4], 4, &count);
|
||||||
if (lock) { CO_UNLOCK_OD(SDO->CANdevTx); }
|
CO_UNLOCK_OD(SDO->CANdevTx);
|
||||||
|
|
||||||
/* strings are allowed to be shorter */
|
/* strings are allowed to be shorter */
|
||||||
if (odRet == ODR_PARTIAL
|
if (odRet == ODR_PARTIAL
|
||||||
|
|
|
||||||
|
|
@ -418,16 +418,15 @@ typedef struct {
|
||||||
* variable. CO_LOCK_OD(CAN_MODULE) and CO_UNLOCK_OD(CAN_MODULE) macros
|
* variable. CO_LOCK_OD(CAN_MODULE) and CO_UNLOCK_OD(CAN_MODULE) macros
|
||||||
* are used to protect:
|
* are used to protect:
|
||||||
* - Whole real-time thread,
|
* - Whole real-time thread,
|
||||||
* - SDO server protects read/write access to OD variable, if specific OD
|
* - SDO server protects read/write access to OD variable.
|
||||||
* variable has ODA_TRPDO or ODA_TRSRDO from @ref OD_attributes_t set. If
|
|
||||||
* those attributes are not set, OD variable is not locked by SDO server.
|
|
||||||
* Locking of long OD variables, not accessible from real-time thread, may
|
* Locking of long OD variables, not accessible from real-time thread, may
|
||||||
* block RT thread.
|
* block RT thread.
|
||||||
* - Any mainline code, which accesses PDO-mappable OD variable, must protect
|
* - Any mainline code, which accesses PDO-mappable OD variable, must protect
|
||||||
* read/write with locking macros. Use @ref OD_mappable() for check.
|
* read/write with locking macros. Use @ref OD_mappable() for check.
|
||||||
* - Other cases, where non-PDO-mappable OD variable is used inside real-time
|
* - Other cases, where non-PDO-mappable OD variable is used inside real-time
|
||||||
* thread by some other part of the user application must be considered with
|
* thread by some other part of the user application must be considered with
|
||||||
* special care.
|
* special care. Also when there are multiple threads accessing the OD (e.g.
|
||||||
|
* when using a RTOS), you should always lock the OD.
|
||||||
*
|
*
|
||||||
* #### Synchronization functions for CAN receive
|
* #### Synchronization functions for CAN receive
|
||||||
* After CAN message is received, it is pre-processed in CANrx_callback(), which
|
* After CAN message is received, it is pre-processed in CANrx_callback(), which
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue