крыша едет не спеша тихо шифером шурша.
stm32
получаю данные из порта в прерывании и добавляю в кольцевой буфер. Наблюдаю потерю данных.
решил дописать счётчик переполнения и ушёл в нирвану.
...
#define SIZERING 50U
...
typedef struct
{
CANTX can[SIZERING];
uint8_t inInd;
uint8_t outInd;
uint8_t max;
bool fillmax;
} RINGTX;
RINGTX ring1TX = { .inInd = 0, .outInd = 0, .max = 0, .fillmax = false };
...
uint8_t RING_GetCount(RINGTX* buf)
{
uint8_t retval = 0;
if (buf->inInd < buf->outInd) retval = SIZERING + buf->inInd - buf->outInd;
else retval = buf->inInd - buf->outInd;
if (buf->max < retval) buf->max = retval;
return retval;
}
void RING_Put_deep_copy(const CAN_RxHeaderTypeDef* header, const uint8_t* data, RINGTX* buf)
{
if (RING_GetCount(buf) >= SIZERING - 1)
{
buf->fillmax = true;
return;
}
uint8_t curpoz = buf->inInd++;
if (buf->inInd >= SIZERING) buf->inInd = 0;
...
}
void RING_Clear(RINGTX* buf)
{
buf->inInd = 0;
buf->outInd = 0;
}
void RING_Pop_addCount(RINGTX* buf)
{
buf->outInd++;
if (buf->outInd >= SIZERING) buf->outInd = 0;
}
...
void print_ring_status()
{
int len = 0;
len += sprintf((char*)vcpDataToSend + len, "ring1 max fill: %u 0x%X %s\r\n", ring1TX.max, ring1TX.max, ring1TX.fillmax ? "fillmax" : "norm");
CDC_Transmit_FS(vcpDataToSend, len);
ring1TX.max = 0;
}
...
дело в том, что функция печати выводит нереальные значения больше SIZERING и меньше 255. Не могу найти где я обосрался. ещё из наблюдения, если я ставлю SIZERING большим(например 230), то выхлоп более-менее правдоподобный ~ 7-9