Есть некоторые серьезные проблемы с вашим кодом.
Начните с того, что вы заметили, что ваш код вообще не использует sequenceLength
- это странно.
Тогда нет необходимости oop по всему блоку - вам нужно только посмотреть на байты внутри соответствующей последовательности.
Эта строка очень странная:
if (*(blockAddress + i) == sequenceOffset)
^^^^^^^^^^^^^^^^^^^
Reads the data at index i
Она сравнивает значение данных внутри данных блок с sequenceOffset - это не кажется правильным.
И эта часть:
(int16_t*)(&sequenceOffset);
на самом деле является нарушением строгого правила псевдонимов.
Наконец, вы никогда не упоминайте, с каким порядком данных хранятся данные. Из вашего примера он выглядит как little-endian, поэтому я буду использовать little-endian в приведенном ниже коде:
int16_t sumSequence16(const uint8_t* const blockAddress,
const uint32_t sequenceOffset,
const uint8_t sequenceLength)
{
uint8_t* p = blockAddress + sequenceOffset; // Point to first byte in sequence
int sum = 0;
for (uint8_t i = 0; i < sequenceLength; i += 2)
{
int16_t t = 0;
t = p[i+1]; // Read MSB
t = t << 8; // Shift MSB 8 bits to the left
t = t | p[i]; // Add LSB
sum = sum + t; // Update the running sum
}
return sum;
}