Skip to content
Snippets Groups Projects
Commit 64bcafb0 authored by Sergi Hernandez's avatar Sergi Hernandez Committed by Sergi Hernandez
Browse files

Added checks when adding segments and modules to detect overlapping.

parent 7ba3522a
No related branches found
No related tags found
2 merge requests!6Dynamixel manager,!2Added checks when adding segments and modules to detect overlapping.
......@@ -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
......@@ -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);
......
#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;
}
......@@ -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=&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->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)
......
#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");
}
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