Compare commits

..

No commits in common. "3dd654bdda57da63444a2d88ea0ed0b1d3840ca1" and "256499f7b46796dcc5610ccb156dcf03f5776583" have entirely different histories.

4 changed files with 52 additions and 95 deletions

View File

@ -10,10 +10,10 @@
#include <arm_acle.h> #include <arm_acle.h>
#define BASE_SWAP32(value) __builtin_bswap32(value) //#define BASE_SWAP32(value) __builtin_bswap32(value)
//#define BASE_SWAP32(value) __rev(value) #define BASE_SWAP32(value) __rev(value)
#define BASE_SWAP16(value) (uint16_t)__builtin_bswap16(value) //#define BASE_SWAP16(value) (uint16_t)__builtin_bswap16(value)
//#define BASE_SWAP16(value) (uint16_t)__rev16(value) #define BASE_SWAP16(value) (uint16_t)__rev16(value)
#endif /* FREE_RTOS_BASE_SWAP_H_ */ #endif /* FREE_RTOS_BASE_SWAP_H_ */

View File

@ -98,34 +98,6 @@ private:
}; };
/*
* EtherCAT Command
*
* Типы параметров шаблона должны быть struct Type и struct Dir или их синонимы
*
* Возможные значения первого параметра шаблона (синонимы):
*
* EcatCommand< AP, ... >
* EcatCommand< B, ... >
* EcatCommand< FP, ... >
* EcatCommand< L, ... >
*
* Возможные значения второго параметра шаблона (синонимы):
*
* EcatCommand< ... ,RD >
* EcatCommand< ... ,WR >
* EcatCommand< ... ,RW >
* EcatCommand< ... ,RMW >
* EcatCommand< ... ,NO >
*
* Так же можно использовать готовые синонимы EcatCommand<>:
*
* APRD, APWR, APRW, ARMW
* BRD, BWR, BRW, NOP
* FPRD, FPWR, FPRW, FRMW
* LRD, LWR, LRW, NOP
*
*/
template<typename TypeT, typename DirT> template<typename TypeT, typename DirT>
class EcatCommand : public EcatCommandBase { class EcatCommand : public EcatCommandBase {
static_assert(std::is_base_of<TypeBase, TypeT>::value == true, "TypeT should be derived from command::TypeBase"); static_assert(std::is_base_of<TypeBase, TypeT>::value == true, "TypeT should be derived from command::TypeBase");

View File

@ -110,29 +110,6 @@ private:
}; };
/*
* EtherCAT Datagram
*
* Первый параметр шаблона должен быть class EcatCommand
*
* Возможные значения первого параметра шаблона:
*
* EcatDatagram< BWR, DataType >
* или
* EcatDatagram< EcatCommand< B, WR >, DataType >
*
* EcatDatagram< LWR, DataType >
* или
* EcatDatagram< EcatCommand< L, WR >, DataType >
*
* Пример:
*
* datagram::EcatDatagram<command::BWR, DataType > a{ {{broadcast, address}}, expected_wkc, data };
* datagram::EcatDatagram<command::LWR, DataType > b{ {{logic, address}}, expected_wkc, data };
*
* auto queue = a + b;
*
*/
template<typename CommandT, typename... DataTypes> template<typename CommandT, typename... DataTypes>
class EcatDatagram : public IEcatDatagram { class EcatDatagram : public IEcatDatagram {
static_assert(std::is_base_of<command::EcatCommandBase, CommandT>::value == true, "CommandT should be derived from ECatCommandBase"); static_assert(std::is_base_of<command::EcatCommandBase, CommandT>::value == true, "CommandT should be derived from ECatCommandBase");

View File

@ -8,7 +8,6 @@
#include "free_rtos/base/swap.h" #include "free_rtos/base/swap.h"
#include <arm_acle.h> #include <arm_acle.h>
#include <string.h>
uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len) uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len)
{ {
@ -57,60 +56,69 @@ uint16_t eth_calcChksum2(uint32_t sum, uint8_t * const hdata, uint16_t hlen, uin
return ~sum; return ~sum;
} }
union PointerConverter
{
void * unknown;
uint64_t * octet;
uint32_t * quartet;
uint16_t * duet;
uint8_t * solo;
};
struct Array {
uint16_t duet0;
uint16_t duet1;
uint16_t duet2;
uint16_t duet3;
};
union ValueConverter
{
uint64_t octet;
uint32_t quartet;
uint16_t duet;
uint8_t solo;
struct Array array;
};
uint32_t calcSum(void * const buffer, uint32_t sum, void * const data, uint16_t len) uint32_t calcSum(void * const buffer, uint32_t sum, void * const data, uint16_t len)
{ {
uint8_t* buffer_start; union PointerConverter buffer_start;
uint8_t* data_start; union PointerConverter data_start;
uint32_t value; union ValueConverter value;
buffer_start = (uint8_t*)buffer; buffer_start.unknown = buffer;
data_start = (uint8_t*)data; data_start.unknown = data;
value = 0x00000000;
#define SIZE sizeof(uint32_t) while(len >= sizeof(uint32_t)) {
while(len >= SIZE) { len -= sizeof(uint32_t);
len -= SIZE;
memcpy(&value, data_start, SIZE); value.quartet = *data_start.quartet++;
data_start += SIZE; *buffer_start.quartet++ = value.quartet;
memcpy(buffer_start, &value, SIZE); value.quartet = __rev16(value.quartet);
buffer_start += SIZE; sum += value.array.duet0 + value.array.duet1;
value = __rev16(value);
sum += (value&0xFFFF) + (value>>16);
} }
#undef SIZE
#define SIZE sizeof(uint16_t) if(len >= sizeof(uint16_t)) {
if(len >= SIZE) { len -= sizeof(uint16_t);
len -= SIZE;
value = 0x00000000;
memcpy(&value, data_start, SIZE); value.duet = *data_start.duet++;
data_start += SIZE; *buffer_start.duet++ = value.duet;
memcpy(buffer_start, &value, SIZE); value.quartet = __rev16(value.quartet);
buffer_start += SIZE; sum += value.duet;
sum += __rev16(value);
} }
#undef SIZE
#define SIZE sizeof(uint8_t) if(len >= sizeof(uint8_t)) {
if(len >= SIZE) { len -= sizeof(uint8_t);
len -= SIZE;
value = 0x00000000;
memcpy(&value, data_start, SIZE); value.solo = *data_start.solo++;
data_start += SIZE; *buffer_start.solo++ = value.solo;
memcpy(buffer_start, &value, SIZE); value.quartet = __rev16(value.quartet);
buffer_start += SIZE; sum += value.solo;
sum += __rev16(value);
} }
#undef SIZE
return sum; return sum;
} }