From 64bcafb057d770705dee945fd7ced55c746c8fed Mon Sep 17 00:00:00 2001 From: Sergi Hernandez Juan <shernand@iri.upc.edu> Date: Wed, 8 Feb 2017 11:05:46 +0100 Subject: [PATCH] Added checks when adding segments and modules to detect overlapping. --- memory/include/mem_module.h | 4 ++-- memory/include/memory.h | 2 +- memory/src/mem_module.c | 42 +++++++++++++++++++++++++++++++-- memory/src/memory.c | 46 ++++++++++++++++++++++++++++++++++++- memory/test/memory_test.c | 31 ++++++++++++++++++------- 5 files changed, 111 insertions(+), 14 deletions(-) diff --git a/memory/include/mem_module.h b/memory/include/mem_module.h index f11445d..50c085e 100644 --- a/memory/include/mem_module.h +++ b/memory/include/mem_module.h @@ -20,7 +20,7 @@ typedef struct }TMemModule; void mem_module_init(TMemModule *module); -void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length); -void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length); +unsigned char mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length); +unsigned char mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length); #endif diff --git a/memory/include/memory.h b/memory/include/memory.h index 6bfa887..060e0a1 100644 --- a/memory/include/memory.h +++ b/memory/include/memory.h @@ -17,7 +17,7 @@ typedef struct void mem_init(TMemory *memory); void mem_initialize_data(TMemory *memory); -void mem_add_module(TMemory *memory, TMemModule *module); +unsigned char mem_add_module(TMemory *memory, TMemModule *module); void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data); void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data); diff --git a/memory/src/mem_module.c b/memory/src/mem_module.c index 61d875b..cf158d1 100644 --- a/memory/src/mem_module.c +++ b/memory/src/mem_module.c @@ -1,5 +1,7 @@ #include "mem_module.h" +extern unsigned char mem_in_window(unsigned short int mem_start_address,unsigned short int mem_length,unsigned short int start_address,unsigned short int length); + void mem_module_init(TMemModule *module) { unsigned char i; @@ -17,23 +19,59 @@ void mem_module_init(TMemModule *module) module->read_cmd=0x00000000; } -void mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length) +unsigned char mem_module_add_ram_segment(TMemModule *module,unsigned short int start_address, unsigned short int length) { + TMemSegment *current_segment; + unsigned char current_seg; + if(module->num_ram_segments<MAX_NUM_SEGMENTS-1) { + for(current_seg=0;current_seg<module->num_ram_segments;current_seg++) + { + current_segment=&module->ram_segments[current_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length)) + return 0x00; + } + for(current_seg=0;current_seg<module->num_eeprom_segments;current_seg++) + { + current_segment=&module->eeprom_segments[current_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length)) + return 0x00; + } module->ram_segments[module->num_ram_segments].start_address=start_address; module->ram_segments[module->num_ram_segments].length=length; module->num_ram_segments++; + return 0x01; } + else + return 0x00; } -void mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length) +unsigned char mem_module_add_eeprom_segment(TMemModule *module,unsigned short int start_address, unsigned short int length) { + TMemSegment *current_segment; + unsigned char current_seg; + if(module->num_eeprom_segments<MAX_NUM_SEGMENTS-1) { + for(current_seg=0;current_seg<module->num_ram_segments;current_seg++) + { + current_segment=&module->ram_segments[current_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length)) + return 0x00; + } + for(current_seg=0;current_seg<module->num_eeprom_segments;current_seg++) + { + current_segment=&module->eeprom_segments[current_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,start_address,length)) + return 0x00; + } module->eeprom_segments[module->num_eeprom_segments].start_address=start_address; module->eeprom_segments[module->num_eeprom_segments].length=length; module->num_eeprom_segments++; + return 0x01; } + else + return 0x00; } diff --git a/memory/src/memory.c b/memory/src/memory.c index 359c276..fa7f1b8 100644 --- a/memory/src/memory.c +++ b/memory/src/memory.c @@ -57,13 +57,57 @@ void mem_initialize_data(TMemory *memory) } } -void mem_add_module(TMemory *memory, TMemModule *module) +unsigned char mem_add_module(TMemory *memory, TMemModule *module) { + TMemModule *current_module; + TMemSegment *current_segment,*new_segment; + unsigned char current_mod,current_seg,new_seg; + if(memory->num_mem_modules<MAX_NUM_MEM_MODULES-1) { + /* check segments do not intersect */ + for(current_mod=0;current_mod<memory->num_mem_modules;current_mod++) + { + current_module=memory->mem_modules[current_mod]; + for(current_seg=0;current_seg<current_module->num_ram_segments;current_seg++) + { + current_segment=¤t_module->ram_segments[current_seg]; + for(new_seg=0;new_seg<module->num_ram_segments;new_seg++) + { + new_segment=&module->ram_segments[new_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length)) + return 0x00; + } + for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++) + { + new_segment=&module->eeprom_segments[new_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length)) + return 0x00; + } + } + for(current_seg=0;current_seg<current_module->num_eeprom_segments;current_seg++) + { + current_segment=¤t_module->eeprom_segments[current_seg]; + for(new_seg=0;new_seg<module->num_ram_segments;new_seg++) + { + new_segment=&module->ram_segments[new_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length)) + return 0x00; + } + for(new_seg=0;new_seg<module->num_eeprom_segments;new_seg++) + { + new_segment=&module->eeprom_segments[new_seg]; + if(mem_in_window(current_segment->start_address,current_segment->length,new_segment->start_address,new_segment->length)) + return 0x00; + } + } + } memory->mem_modules[memory->num_mem_modules]=module; memory->num_mem_modules++; + return 0x01; } + else + return 0x00; } void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data) diff --git a/memory/test/memory_test.c b/memory/test/memory_test.c index 20d7efc..8e43860 100644 --- a/memory/test/memory_test.c +++ b/memory/test/memory_test.c @@ -1,5 +1,6 @@ #include "mem_module.h" #include "memory.h" +#include <stdio.h> void module1_init_mem(unsigned char init_eeprom) { @@ -45,12 +46,26 @@ int main(void) module2.read_cmd=module2_read_cmd; mem_init(&memory); - mem_module_add_ram_segment(&module1,0x0000,0x0005); - mem_module_add_ram_segment(&module1,0x0055,0x000A); - mem_module_add_eeprom_segment(&module1,0x0100,0x0020); - mem_add_module(&memory,&module1); - - mem_module_add_ram_segment(&module2,0x0200,0x0005); - mem_module_add_eeprom_segment(&module2,0x0180,0x0020); - mem_add_module(&memory,&module2); + if(!mem_module_add_ram_segment(&module1,0x0000,0x0005)) + printf("Impossible to add segment\n"); + if(!mem_module_add_ram_segment(&module1,0x0055,0x000A)) + printf("Impossible to add segment\n"); + if(!mem_module_add_eeprom_segment(&module1,0x0100,0x0020)) + printf("Impossible to add segment\n"); + if(!mem_add_module(&memory,&module1)) + printf("Impossible to add module\n"); + + if(!mem_module_add_ram_segment(&module2,0x0200,0x0005)) + printf("Impossible to add segment\n"); + if(!mem_module_add_eeprom_segment(&module2,0x0180,0x0020)) + printf("Impossible to add segment\n"); + if(!mem_add_module(&memory,&module2)) + printf("Impossible to add module\n"); + + if(!mem_module_add_ram_segment(&module2,0x050,0x000A)) + printf("Impossible to add segment\n"); + if(!mem_module_add_eeprom_segment(&module2,0x0180,0x0030)) + printf("Impossible to add segment\n"); + if(!mem_add_module(&memory,&module2)) + printf("Impossible to add module\n"); } -- GitLab