Я пытаюсь использовать статические структуры в качестве буфера для входящих сообщений, чтобы избежать проверки буфера на внешнем модуле MCP2515. ISR входит в функцию со значением 255 can_message *, чтобы фактически прочитать новые сообщения из моего MCP2515. Другие приложения регистрируют идентификатор в сообщении, передаваемом в качестве аргумента, чтобы проверить, содержит ли буфер какие-либо сообщения с таким же значением. Это возвращает неправильные идентификаторы, а остальные поля данных равны 0 и неинициализированы. Что не так?
can_message struct:
typedef struct
{
uint8_t id;
uint8_t datalength;
uint8_t data[8];
}can_message;
int CAN_message_receive(can_message* message)
{
static volatile can_message* buffers = (volatile can_message*)0x18FF;
static int birth = 1;
if(birth)
{
for (int i; i < CAN_MESSAGE_UNIQUE_IDS; i++)
{
//These structs gets addresses outside SRAM
buffers[i] = (can_message){0,0,0};
}
birth = 0;
}
if (message == CAN_UPDATE_MESSAGES)
{
/* Sorts messages <3 */
can_message currentMessage;
//These functions are working:
CAN_message_get_from_MCP_buf(¤tMessage, 0);
buffers[currentMessage.id] = currentMessage;
CAN_message_get_from_MCP_buf(¤tMessage, 1);
buffers[currentMessage.id] = currentMessage;
return 0; //returns nothing !
}
if(buffers[message->id].id != 0)
{
printf("test\n");
//This copy gives wrong id and data:
memcpy(message, &buffers[message->id], sizeof(can_message));
buffers[message->id].id = 0;
return 0;
}
return -1;
}
Редактировать 1: Однако я заметил, что любая структура буферов [i] получает совершенно другой адрес, чем ожидалось. Он не использует адреса, следующие за 0x18FF на SRAM. Есть ли способ изменить это?
Редактировать 2: Это мой основной цикл:
while (1) {
//printf("tx buf ready: %d\n", MCP2515_TX_buf_empty(0));
//CAN_Loopback_test();
_delay_ms(500);
value = USART_ReadByte(0);
CAN_message_receive(&msg);
printf("CAN_receive: ID: %d, datalength: %d, data: \n",msg.id);
for (int k; k < msg.datalength; k++)
{
printf("%d, ",msg.data[k]);
}
printf("\n");
}
Редактировать 3: Изменение указателя буфера на массив решило проблему. (Он больше не использует SRAM, но все, что плавает в моей лодке)
int CAN_message_receive(can_message* message)
{
static can_message buffers[CAN_MESSAGE_UNIQUE_IDS];
static int birth = 1;
if(birth)
{
for (int i; i < CAN_MESSAGE_UNIQUE_IDS*10; i++)
{
*(char*)(0x18FF+i) = 0;
printf("buffers: %X\n", &buffers[i]);
}
birth = 0;
}