Skip to content
Snippets Groups Projects
Commit 03cb00e0 authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Added checks when adding segments and modules to detect overlapping.

parent 2bc8e25d
No related branches found
No related tags found
No related merge requests found
...@@ -20,7 +20,7 @@ typedef struct ...@@ -20,7 +20,7 @@ typedef struct
}TMemModule; }TMemModule;
void mem_module_init(TMemModule *module); void mem_module_init(TMemModule *module);
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);
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);
#endif #endif
...@@ -17,7 +17,7 @@ typedef struct ...@@ -17,7 +17,7 @@ typedef struct
void mem_init(TMemory *memory); void mem_init(TMemory *memory);
void mem_initialize_data(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_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); void mem_do_read(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data);
......
#include "mem_module.h" #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) void mem_module_init(TMemModule *module)
{ {
unsigned char i; unsigned char i;
...@@ -17,23 +19,59 @@ void mem_module_init(TMemModule *module) ...@@ -17,23 +19,59 @@ void mem_module_init(TMemModule *module)
module->read_cmd=0x00000000; 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) 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].start_address=start_address;
module->ram_segments[module->num_ram_segments].length=length; module->ram_segments[module->num_ram_segments].length=length;
module->num_ram_segments++; 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) 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].start_address=start_address;
module->eeprom_segments[module->num_eeprom_segments].length=length; module->eeprom_segments[module->num_eeprom_segments].length=length;
module->num_eeprom_segments++; module->num_eeprom_segments++;
return 0x01;
} }
else
return 0x00;
} }
...@@ -57,13 +57,57 @@ void mem_initialize_data(TMemory *memory) ...@@ -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) 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=&current_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=&current_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->mem_modules[memory->num_mem_modules]=module;
memory->num_mem_modules++; 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) void mem_do_write(TMemory *memory,unsigned short int start_address,unsigned short int length,unsigned char *data)
......
#include "mem_module.h" #include "mem_module.h"
#include "memory.h" #include "memory.h"
#include <stdio.h>
void module1_init_mem(unsigned char init_eeprom) void module1_init_mem(unsigned char init_eeprom)
{ {
...@@ -45,12 +46,26 @@ int main(void) ...@@ -45,12 +46,26 @@ int main(void)
module2.read_cmd=module2_read_cmd; module2.read_cmd=module2_read_cmd;
mem_init(&memory); mem_init(&memory);
mem_module_add_ram_segment(&module1,0x0000,0x0005); if(!mem_module_add_ram_segment(&module1,0x0000,0x0005))
mem_module_add_ram_segment(&module1,0x0055,0x000A); printf("Impossible to add segment\n");
mem_module_add_eeprom_segment(&module1,0x0100,0x0020); if(!mem_module_add_ram_segment(&module1,0x0055,0x000A))
mem_add_module(&memory,&module1); printf("Impossible to add segment\n");
if(!mem_module_add_eeprom_segment(&module1,0x0100,0x0020))
mem_module_add_ram_segment(&module2,0x0200,0x0005); printf("Impossible to add segment\n");
mem_module_add_eeprom_segment(&module2,0x0180,0x0020); if(!mem_add_module(&memory,&module1))
mem_add_module(&memory,&module2); 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");
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment