delete malloc
This commit is contained in:
parent
a19da2cbd3
commit
4b4a162f72
@ -1,5 +1,4 @@
|
||||
#include "hdlc_frame.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
#define START_FLAG 0x7E
|
||||
#define END_FLAG 0x7E
|
||||
@ -15,7 +14,7 @@ void initialize_frame(HDLCFrame* frame, uint8_t address, uint8_t control, uint8_
|
||||
|
||||
uint16_t calculate_fcs(HDLCFrame* frame) {
|
||||
uint16_t fcs = 0xFFFF;
|
||||
uint8_t* data_bytes = malloc(frame->data_length + 2);
|
||||
uint8_t data_bytes[MAX_FRAME_LENGTH];
|
||||
data_bytes[0] = frame->address;
|
||||
data_bytes[1] = frame->control;
|
||||
|
||||
@ -29,41 +28,41 @@ uint16_t calculate_fcs(HDLCFrame* frame) {
|
||||
fcs &= 0xFFFF;
|
||||
}
|
||||
|
||||
free(data_bytes);
|
||||
return fcs;
|
||||
}
|
||||
|
||||
void create_frame(HDLCFrame* frame, uint8_t** frame_data, size_t* frame_length) {
|
||||
*frame_length = 4 + frame->data_length;
|
||||
*frame_data = malloc(*frame_length);
|
||||
(*frame_data)[0] = START_FLAG;
|
||||
(*frame_data)[1] = frame->address;
|
||||
(*frame_data)[2] = frame->control;
|
||||
void create_frame(HDLCFrame* frame, uint8_t* frame_data, size_t* frame_length) {
|
||||
size_t index = 0;
|
||||
frame_data[index++] = START_FLAG;
|
||||
frame_data[index++] = frame->address;
|
||||
frame_data[index++] = frame->control;
|
||||
|
||||
size_t index = 3;
|
||||
for (size_t i = 0; i < frame->data_length; i++) {
|
||||
uint8_t byte = frame->data[i];
|
||||
if (byte == START_FLAG || byte == END_FLAG || byte == ESCAPE_FLAG) {
|
||||
(*frame_data)[index++] = ESCAPE_FLAG;
|
||||
(*frame_data)[index++] = byte ^ ESCAPE_XOR;
|
||||
frame_data[index++] = ESCAPE_FLAG;
|
||||
frame_data[index++] = byte ^ ESCAPE_XOR;
|
||||
} else {
|
||||
(*frame_data)[index++] = byte;
|
||||
frame_data[index++] = byte;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t fcs = calculate_fcs(frame);
|
||||
(*frame_data)[index++] = fcs & 0xFF;
|
||||
(*frame_data)[index] = END_FLAG;
|
||||
frame_data[index++] = fcs & 0xFF;
|
||||
frame_data[index++] = (fcs >> 8) & 0xFF;
|
||||
frame_data[index] = END_FLAG;
|
||||
|
||||
*frame_length = index + 1;
|
||||
}
|
||||
|
||||
HDLCFrame* create_u_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length) {
|
||||
HDLCFrame* frame = malloc(sizeof(HDLCFrame));
|
||||
HDLCFrame* frame = (HDLCFrame*)malloc(sizeof(HDLCFrame));
|
||||
initialize_frame(frame, address, control, data, data_length);
|
||||
return frame;
|
||||
}
|
||||
|
||||
HDLCFrame* create_s_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t receive_sequence_number, uint8_t send_sequence_number) {
|
||||
HDLCFrame* frame = malloc(sizeof(HDLCFrame));
|
||||
HDLCFrame* frame = (HDLCFrame*)malloc(sizeof(HDLCFrame));
|
||||
initialize_frame(frame, address, control, data, data_length);
|
||||
frame->control |= (receive_sequence_number << 2) & 0xFC;
|
||||
frame->control |= (send_sequence_number << 1) & 0xFE;
|
||||
@ -71,7 +70,7 @@ HDLCFrame* create_s_frame(uint8_t address, uint8_t control, uint8_t* data, size_
|
||||
}
|
||||
|
||||
HDLCFrame* create_i_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t sequence_number) {
|
||||
HDLCFrame* frame = malloc(sizeof(HDLCFrame));
|
||||
HDLCFrame* frame = (HDLCFrame*)malloc(sizeof(HDLCFrame));
|
||||
initialize_frame(frame, address, control, data, data_length);
|
||||
frame->control |= (sequence_number << 1) & 0xFE;
|
||||
return frame;
|
||||
|
@ -2,6 +2,7 @@
|
||||
#define HDLC_FRAME_H
|
||||
|
||||
#include <stdint.h>
|
||||
#define MAX_FRAME_LENGTH 256
|
||||
|
||||
typedef struct {
|
||||
uint8_t address;
|
||||
@ -12,10 +13,11 @@ typedef struct {
|
||||
|
||||
void initialize_frame(HDLCFrame* frame, uint8_t address, uint8_t control, uint8_t* data, size_t data_length);
|
||||
uint16_t calculate_fcs(HDLCFrame* frame);
|
||||
void create_frame(HDLCFrame* frame, uint8_t** frame_data, size_t* frame_length);
|
||||
void create_frame(HDLCFrame* frame, uint8_t* frame_data, size_t* frame_length);
|
||||
|
||||
HDLCFrame* create_u_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length);
|
||||
HDLCFrame* create_s_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t receive_sequence_number, uint8_t send_sequence_number);
|
||||
HDLCFrame* create_i_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t sequence_number);
|
||||
|
||||
|
||||
#endif
|
@ -17,30 +17,25 @@ int main() {
|
||||
size_t data_length = sizeof(data) / sizeof(data[0]);
|
||||
|
||||
HDLCFrame* u_frame = create_u_frame(address, control, data, data_length);
|
||||
uint8_t* u_frame_data;
|
||||
uint8_t u_frame_data[MAX_FRAME_LENGTH];
|
||||
size_t u_frame_length;
|
||||
create_frame(u_frame, &u_frame_data, &u_frame_length);
|
||||
create_frame(u_frame, u_frame_data, &u_frame_length);
|
||||
print_frame(u_frame_data, u_frame_length);
|
||||
free(u_frame_data);
|
||||
free(u_frame);
|
||||
|
||||
uint8_t receive_sequence_number = 0x01;
|
||||
uint8_t send_sequence_number = 0x02;
|
||||
HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, receive_sequence_number, send_sequence_number);
|
||||
uint8_t* s_frame_data;
|
||||
HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, 0x01, 0x02);
|
||||
uint8_t s_frame_data[MAX_FRAME_LENGTH];
|
||||
size_t s_frame_length;
|
||||
create_frame(s_frame, &s_frame_data, &s_frame_length);
|
||||
create_frame(s_frame, s_frame_data, &s_frame_length);
|
||||
print_frame(s_frame_data, s_frame_length);
|
||||
free(s_frame_data);
|
||||
free(s_frame);
|
||||
|
||||
uint8_t sequence_number = 0x03;
|
||||
HDLCFrame* i_frame = create_i_frame(address, control, data, data_length, sequence_number);
|
||||
uint8_t* i_frame_data;
|
||||
HDLCFrame* i_frame = create_i_frame(address, control, data, data_length, 0x03);
|
||||
uint8_t i_frame_data[MAX_FRAME_LENGTH];
|
||||
size_t i_frame_length;
|
||||
create_frame(i_frame, &i_frame_data, &i_frame_length);
|
||||
create_frame(i_frame, i_frame_data, &i_frame_length);
|
||||
print_frame(i_frame_data, i_frame_length);
|
||||
free(i_frame_data);
|
||||
|
||||
free(u_frame);
|
||||
free(s_frame);
|
||||
free(i_frame);
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user