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

Merge branch 'cherry-pick-03cb00e0' into 'dynamixel_manager'

Added checks when adding segments and modules to detect overlapping.

See merge request !2
parents 7ba3522a 64bcafb0
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 ...@@ -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