delete malloc

This commit is contained in:
Qukich 2023-06-15 19:48:27 +03:00
parent a19da2cbd3
commit 4b4a162f72
3 changed files with 31 additions and 35 deletions

View File

@ -1,5 +1,4 @@
#include "hdlc_frame.h" #include "hdlc_frame.h"
#include <stdlib.h>
#define START_FLAG 0x7E #define START_FLAG 0x7E
#define END_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 calculate_fcs(HDLCFrame* frame) {
uint16_t fcs = 0xFFFF; 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[0] = frame->address;
data_bytes[1] = frame->control; data_bytes[1] = frame->control;
@ -29,41 +28,41 @@ uint16_t calculate_fcs(HDLCFrame* frame) {
fcs &= 0xFFFF; fcs &= 0xFFFF;
} }
free(data_bytes);
return fcs; return fcs;
} }
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) {
*frame_length = 4 + frame->data_length; size_t index = 0;
*frame_data = malloc(*frame_length); frame_data[index++] = START_FLAG;
(*frame_data)[0] = START_FLAG; frame_data[index++] = frame->address;
(*frame_data)[1] = frame->address; frame_data[index++] = frame->control;
(*frame_data)[2] = frame->control;
size_t index = 3;
for (size_t i = 0; i < frame->data_length; i++) { for (size_t i = 0; i < frame->data_length; i++) {
uint8_t byte = frame->data[i]; uint8_t byte = frame->data[i];
if (byte == START_FLAG || byte == END_FLAG || byte == ESCAPE_FLAG) { if (byte == START_FLAG || byte == END_FLAG || byte == ESCAPE_FLAG) {
(*frame_data)[index++] = ESCAPE_FLAG; frame_data[index++] = ESCAPE_FLAG;
(*frame_data)[index++] = byte ^ ESCAPE_XOR; frame_data[index++] = byte ^ ESCAPE_XOR;
} else { } else {
(*frame_data)[index++] = byte; frame_data[index++] = byte;
} }
} }
uint16_t fcs = calculate_fcs(frame); uint16_t fcs = calculate_fcs(frame);
(*frame_data)[index++] = fcs & 0xFF; frame_data[index++] = fcs & 0xFF;
(*frame_data)[index] = END_FLAG; 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* 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); initialize_frame(frame, address, control, data, data_length);
return frame; 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* 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); initialize_frame(frame, address, control, data, data_length);
frame->control |= (receive_sequence_number << 2) & 0xFC; frame->control |= (receive_sequence_number << 2) & 0xFC;
frame->control |= (send_sequence_number << 1) & 0xFE; 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* 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); initialize_frame(frame, address, control, data, data_length);
frame->control |= (sequence_number << 1) & 0xFE; frame->control |= (sequence_number << 1) & 0xFE;
return frame; return frame;

View File

@ -2,6 +2,7 @@
#define HDLC_FRAME_H #define HDLC_FRAME_H
#include <stdint.h> #include <stdint.h>
#define MAX_FRAME_LENGTH 256
typedef struct { typedef struct {
uint8_t address; 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); void initialize_frame(HDLCFrame* frame, uint8_t address, uint8_t control, uint8_t* data, size_t data_length);
uint16_t calculate_fcs(HDLCFrame* frame); 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_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_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); HDLCFrame* create_i_frame(uint8_t address, uint8_t control, uint8_t* data, size_t data_length, uint8_t sequence_number);
#endif #endif

View File

@ -17,30 +17,25 @@ int main() {
size_t data_length = sizeof(data) / sizeof(data[0]); size_t data_length = sizeof(data) / sizeof(data[0]);
HDLCFrame* u_frame = create_u_frame(address, control, data, data_length); 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; 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); print_frame(u_frame_data, u_frame_length);
free(u_frame_data);
free(u_frame);
uint8_t receive_sequence_number = 0x01; HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, 0x01, 0x02);
uint8_t send_sequence_number = 0x02; uint8_t s_frame_data[MAX_FRAME_LENGTH];
HDLCFrame* s_frame = create_s_frame(address, control, data, data_length, receive_sequence_number, send_sequence_number);
uint8_t* s_frame_data;
size_t s_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); 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, 0x03);
HDLCFrame* i_frame = create_i_frame(address, control, data, data_length, sequence_number); uint8_t i_frame_data[MAX_FRAME_LENGTH];
uint8_t* i_frame_data;
size_t i_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); print_frame(i_frame_data, i_frame_length);
free(i_frame_data);
free(u_frame);
free(s_frame);
free(i_frame); free(i_frame);
return 0; return 0;