Skip to content

Commit

Permalink
Merge pull request #114 from embedded-office/develop
Browse files Browse the repository at this point in the history
Rollback of 32bit direct storage in 16bit machines
  • Loading branch information
michael-hillmann authored Jul 14, 2022
2 parents 2727dcc + 3ea7059 commit 0b1525b
Show file tree
Hide file tree
Showing 40 changed files with 917 additions and 446 deletions.
15 changes: 11 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,15 @@ and starting with version 4.1.0 this project adheres to [Semantic Versioning](ht

## [unreleased]

- nothing
## [4.3.1] - 2022-07-14

### Fixed

- Rollback of 32bit direct storage in 16bit machines (is not compiling reliable)

### Changed

- Add a warning for 16bit microcontroler using direct storage in the object dictionary in docs

## [4.3.0] - 2022-07-13

Expand All @@ -27,8 +35,6 @@ and starting with version 4.1.0 this project adheres to [Semantic Versioning](ht
- Avoid variable declaration if SDO client is disabled [@jernejsk](https://github.com/jernejsk)
- Allow direct data in object dictionaries running on 16bit microcontrollers

> **Note**: The datatype in the object dictionary was `uintptr_t` in previous versions. For 16bit microcontrollers `uintptr_t` may contain only 24bit instead of the required 32bits for direct data storage. For this reason, in version 4.3.0 and later the object dictionary should use `CO_DATA` as data type.
## [4.2.0] - 2022-04-01

### Added
Expand Down Expand Up @@ -194,7 +200,8 @@ and starting with version 4.1.0 this project adheres to [Semantic Versioning](ht
- First Open Source Release.


[unreleased]: https://github.com/embedded-office/canopen-stack/compare/v4.3.0...HEAD
[unreleased]: https://github.com/embedded-office/canopen-stack/compare/v4.3.1...HEAD
[4.3.1]: https://github.com/embedded-office/canopen-stack/compare/v4.3.0...v4.3.1
[4.3.0]: https://github.com/embedded-office/canopen-stack/compare/v4.2.0...v4.3.0
[4.2.0]: https://github.com/embedded-office/canopen-stack/compare/v4.1.8...v4.2.0
[4.1.8]: https://github.com/embedded-office/canopen-stack/compare/v4.1.7...v4.1.8
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required (VERSION 3.15)
project (CanopenStack VERSION 4.3.0)
project (CanopenStack VERSION 4.3.1)

# Make CANopen library
add_subdirectory(canopen)
Expand Down
163 changes: 84 additions & 79 deletions canopen/include/co_obj.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,10 @@ extern "C" {
* \param flags
* The additional object property flags
*/
#define CO_KEY(idx,sub,flags) \
( (uint32_t)(( idx) & 0xFFFF)<<16 | \
(uint32_t)(( sub) & 0xFF)<< 8 | \
(uint32_t)((flags) & 0xFF) )
#define CO_KEY(idx,sub,flags) \
(uint32_t)( ((uint32_t)( idx) & 0xFFFF)<<16 | \
((uint32_t)( sub) & 0xFF)<< 8 | \
((uint32_t)(flags) & 0xFF) )

/*! \brief OBJECT DEVICE
*
Expand All @@ -128,9 +128,9 @@ extern "C" {
* \param sub
* CANopen object subindex [0x00..0xFF]
*/
#define CO_DEV(idx,sub) \
( (uint32_t)((idx) & 0xFFFF)<<16 | \
(uint32_t)((sub) & 0xFF)<<8 )
#define CO_DEV(idx,sub) \
(uint32_t)( ((uint32_t)(idx) & 0xFFFF)<<16 | \
((uint32_t)(sub) & 0xFF)<<8 )

/*! \brief OBJECT MAPPING LINK
*
Expand All @@ -144,12 +144,12 @@ extern "C" {
* CANopen object subindex [0x00..0xFF]
*
* \param bit
* Length of mapped signal in bits [8,16 or 32]
* Length of mapped signal in bits [8,16,24 or 32]
*/
#define CO_LINK(idx,sub,bit) \
( (uint32_t)((idx) & 0xFFFF)<<16 | \
(uint32_t)((sub) & 0xFF)<<8 | \
(uint32_t)((bit) & 0xFF) )
#define CO_LINK(idx,sub,bit) \
(uint32_t)( ((uint32_t)(idx) & 0xFFFFL) << 16 | \
((uint32_t)(sub) & 0xFFL) << 8 | \
((uint32_t)(bit) & 0xFFL) )

/*! \brief EXTRACT DEVICE
*
Expand All @@ -159,7 +159,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_GET_DEV(key) (uint32_t)(((key) & 0xFFFFFF00))
#define CO_GET_DEV(key) \
(uint32_t)((uint32_t)(key) & 0xFFFFFF00L)

/*! \brief EXTRACT SUBINDEX
*
Expand All @@ -169,7 +170,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_GET_SUB(key) (uint8_t)(((key) & 0x0000FF00) >> 8)
#define CO_GET_SUB(key) \
(uint8_t)(((uint32_t)(key) & 0x0000FF00L) >> 8)

/*! \brief EXTRACT INDEX
*
Expand All @@ -179,7 +181,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_GET_IDX(key) (uint16_t)((key) >> 16)
#define CO_GET_IDX(key) \
(uint16_t)((uint32_t)(key) >> 16)

/*! \brief EXTRACT SIZE
*
Expand All @@ -191,7 +194,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_GET_SIZE(key) (uint8_t)(1L << (((key) & CO_OBJ_SZ_MSK) >> 4))
#define CO_GET_SIZE(key) \
(uint8_t)(1L << (((uint32_t)(key) & CO_OBJ_SZ_MSK) >> 4))

/*! \brief CHECK IF OBJECT IS PDO MAPPABLE
*
Expand All @@ -201,7 +205,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_IS_PDOMAP(key) (uint32_t)((key) & CO_OBJ___P__)
#define CO_IS_PDOMAP(key) \
(uint32_t)((uint32_t)(key) & CO_OBJ___P__)

/*! \brief CHECK IF OBJECT DEPENDS ON NODE-ID
*
Expand All @@ -212,7 +217,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_IS_NODEID(key) (uint32_t)((key) & CO_OBJ__N___)
#define CO_IS_NODEID(key) \
(uint32_t)((uint32_t)(key) & CO_OBJ__N___)

/*! \brief CHECK IF OBJECT IS A DIRECT
*
Expand All @@ -222,7 +228,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_IS_DIRECT(key) (uint32_t)((key) & CO_OBJ_D____)
#define CO_IS_DIRECT(key) \
(uint32_t)((uint32_t)(key) & CO_OBJ_D____)

/*! \brief CHECK IF OBJECT IS READABLE
*
Expand All @@ -232,7 +239,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_IS_READ(key) (uint32_t)((key) & CO_OBJ____R_)
#define CO_IS_READ(key) \
(uint32_t)((uint32_t)(key) & CO_OBJ____R_)

/*! \brief CHECK IF OBJECT IS WRITEABLE
*
Expand All @@ -242,7 +250,8 @@ extern "C" {
* \param key
* CANopen object member variable 'key'.
*/
#define CO_IS_WRITE(key) (uint32_t)((key) & CO_OBJ_____W)
#define CO_IS_WRITE(key) \
(uint32_t)((uint32_t)(key) & CO_OBJ_____W)

/*! \brief COB-ID sync message
*
Expand All @@ -262,14 +271,14 @@ extern "C" {
* the CAN-ID (standard or extended format)
* \{
*/
#define CO_COBID_SYNC_STD(generate, id) \
(CO_DATA)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)(generate) & 0x1uL) << 30u)

#define CO_COBID_SYNC_EXT(generate, id) \
(CO_DATA)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1uL << 29u) | \
((uint32_t)(generate) & 0x1uL) << 30u)
#define CO_COBID_SYNC_STD(generate, id) \
(uint32_t)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)(generate) & 0x1uL) << 30u)

#define CO_COBID_SYNC_EXT(generate, id) \
(uint32_t)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1uL << 29u) | \
((uint32_t)(generate) & 0x1uL) << 30u)
/*! \} */

/*! \brief COB-ID time stamp object
Expand All @@ -292,16 +301,16 @@ extern "C" {
* the CAN-ID (standard or extended format)
* \{
*/
#define CO_COBID_TIME_STD(consume, produce, id) \
(CO_DATA)(((uint32_t)(id) & 0x7ffuL) | \
(((uint32_t)(consume) & 0x1uL) << 31u) | \
(((uint32_t)(produce) & 0x1uL) << 30u))

#define CO_COBID_TIME_EXT(consume, produce, id) \
(CO_DATA)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1uL << 29u) | \
(((uint32_t)(consume) & 0x1uL) << 31u) | \
(((uint32_t)(produce) & 0x1uL) << 30u))
#define CO_COBID_TIME_STD(consume, produce, id) \
(uint32_t)(((uint32_t)(id) & 0x7ffuL) | \
(((uint32_t)(consume) & 0x1uL) << 31u) | \
(((uint32_t)(produce) & 0x1uL) << 30u))

#define CO_COBID_TIME_EXT(consume, produce, id) \
(uint32_t)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1uL << 29u) | \
(((uint32_t)(consume) & 0x1uL) << 31u) | \
(((uint32_t)(produce) & 0x1uL) << 30u))
/*! \} */

/*! \brief COB-ID EMCY
Expand All @@ -323,14 +332,14 @@ extern "C" {
* standard definition to avoid negated logic
* \{
*/
#define CO_COBID_EMCY_STD(valid, id) \
(CO_DATA)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)(1u - ((valid) & 0x1u)) << 31u))

#define CO_COBID_EMCY_EXT(valid, id) \
(CO_DATA)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1uL << 29u) | \
((uint32_t)(1u - ((valid) & 0x1u)) << 31u))
#define CO_COBID_EMCY_STD(valid, id) \
(uint32_t)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)(1u - ((valid) & 0x1u)) << 31u))

#define CO_COBID_EMCY_EXT(valid, id) \
(uint32_t)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1uL << 29u) | \
((uint32_t)(1u - ((valid) & 0x1u)) << 31u))
/*! \} */

/*! \brief SDO server/client COB-ID parameter
Expand All @@ -356,16 +365,16 @@ extern "C" {
* standard definition to avoid negated logic
* \{
*/
#define CO_COBID_SDO_STD(valid, dynamic, id) \
(CO_DATA)(((uint32_t)(id) & 0x7ffuL) | \
(((uint32_t)(dynamic) & 0x1u) << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))

#define CO_COBID_SDO_EXT(valid, dynamic, id) \
(CO_DATA)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1u << 29u) | \
(((uint32_t)(dynamic) & 0x1u) << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))
#define CO_COBID_SDO_STD(valid, dynamic, id) \
(uint32_t)(((uint32_t)(id) & 0x7ffuL) | \
(((uint32_t)(dynamic) & 0x1u) << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))

#define CO_COBID_SDO_EXT(valid, dynamic, id) \
(uint32_t)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1u << 29u) | \
(((uint32_t)(dynamic) & 0x1u) << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))
/*! \} */

/*! \brief SDO Default Connection
Expand Down Expand Up @@ -395,14 +404,14 @@ extern "C" {
* standard definition to avoid negated logic
* \{
*/
#define CO_COBID_RPDO_STD(valid, id) \
(CO_DATA)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))

#define CO_COBID_RPDO_EXT(valid, id) \
(CO_DATA)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1u << 29u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))
#define CO_COBID_RPDO_STD(valid, id) \
(uint32_t)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))

#define CO_COBID_RPDO_EXT(valid, id) \
(uint32_t)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1u << 29u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))
/*! \} */

#define CO_COBID_RPDO_BASE (uint32_t)0x200
Expand Down Expand Up @@ -439,16 +448,16 @@ extern "C" {
* standard definition to avoid negated logic
* \{
*/
#define CO_COBID_TPDO_STD(valid, id) \
(CO_DATA)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)0x1u << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))

#define CO_COBID_TPDO_EXT(valid, id) \
(CO_DATA)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1u << 29u) | \
((uint32_t)0x1u << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))
#define CO_COBID_TPDO_STD(valid, id) \
(uint32_t)(((uint32_t)(id) & 0x7ffuL) | \
((uint32_t)0x1u << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))

#define CO_COBID_TPDO_EXT(valid, id) \
(uint32_t)(((uint32_t)(id) & 0x1fffffffuL) | \
((uint32_t)0x1u << 29u) | \
((uint32_t)0x1u << 30u) | \
((uint32_t)(1uL - ((valid) & 0x1u)) << 31u))
/*! \} */

#define CO_COBID_TPDO_BASE (uint32_t)0x180
Expand Down Expand Up @@ -482,11 +491,7 @@ struct CO_DICT_T; /* Declaration of object dictionary structure */
* \note This is required for 8bit and 16bit controllers, where pointers may
* represent 24bit only.
*/
#if UINTPTR_MAX < UINT32_MAX
typedef uint32_t CO_DATA;
#else
typedef uintptr_t CO_DATA;
#endif

/*! \brief OBJECT ENTRY
*
Expand Down
2 changes: 1 addition & 1 deletion canopen/include/co_ver.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

#define CO_VER_MAJOR 4
#define CO_VER_MINOR 3
#define CO_VER_BUILD 0
#define CO_VER_BUILD 1

/******************************************************************************
* PUBLIC FUNCTIONS
Expand Down
2 changes: 1 addition & 1 deletion canopen/source/co_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ CO_ERR CONodeParaLoad(CO_NODE *node, CO_NMT_RESET type)
for (sub = 1; sub <= num; sub++) {
obj = CODictFind(cod, CO_DEV(0x1010, sub));
if (obj != 0) {
pg = (CO_PARA *)obj->Data;
pg = (CO_PARA *)(obj->Data);
if (pg->Type == type) {
bytes = COIfNvmRead(&node->If, pg->Offset, pg->Start, pg->Size);
if (bytes != pg->Size) {
Expand Down
4 changes: 2 additions & 2 deletions canopen/source/co_nmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ void CONmtHbConsInit(CO_NMT *nmt)
node->Error = CO_ERR_CFG_1016;
break;
}
hbc = (CO_HBCONS *)obj->Data;
hbc = (CO_HBCONS *)(obj->Data);
if (hbc == 0) {
node->Error = CO_ERR_CFG_1016;
break;
Expand Down Expand Up @@ -488,7 +488,7 @@ CO_ERR COTypeNmtHbConsWrite(struct CO_OBJ_T *obj, struct CO_NODE_T *node, void *
uint16_t time;
uint8_t nodeid;

hbc = (CO_HBCONS *)obj->Data;
hbc = (CO_HBCONS *)(obj->Data);
if (hbc == 0) {
node->Error = CO_ERR_CFG_1016;
return (result);
Expand Down
Loading

0 comments on commit 0b1525b

Please sign in to comment.