|
|
View previous topic :: View next topic |
Author |
Message |
msakms
Joined: 20 Nov 2011 Posts: 7 Location: Doha/Qatar
|
Urgent help needed with bootloader (Willing to pay anyone) |
Posted: Sat Jan 11, 2014 5:29 am |
|
|
Greetings folks
I've been working recently on a Bluetooth bootloader for a Dspic30F4013. The module used is an HC-05. I've manged to get it working and sending data visualized on putty/hyperterminal as a com port.
I get this error message whenever I compile my source code: "Out of ROM, a segment or program is too large funA"; funA which includes a read_ext_eeprom() function.
I did my research on the forum and I tried every single work around suggested by other members on different posts.
Here is what I tried:
1-Breaking down large functions into multiple smaller ones.
2- including the #separate directive
3- I tried to to replicate the read_ext_eeprom function with a similar one called rd_eeprom and then using the later to minimize the call to the bigger original one.
4- I tried removing all the auxiliary/unnecessary strings used for the bootloader interface like "Bootloader Version 1.0" and "Waiting for download......." and still running into the same issue.
Here is my main.c file
Code: |
#include <main.h>
void application(void)
{
while(true)
{
printf("Hello World");
//delay_ms(2000);
}
}
void main()
{
setupBlueToothConnection();
if(!input(PUSH_BUTTON))
{
printf("\r\nBootloader Version 1.0\r\n");
// Let the user know it is ready to accept a download
printf("\r\nWaiting for download...");
// Load the program
load_program();
}
application();
}
#int_default
void isr(void)
{
jump_to_isr(LOADER_END+5);
}
|
The initialization data used to setup the bluetooth module is stored on an external I2C EEPROM, because it's large and would take most of the dspic memory.
And here is my main.h file:
Code: |
#define DSPIC30F
#if defined DSPIC30F
#include <30F4013.h>
#fuses HS,NOWDT,NODEBUG,FRC, NOPUT, NOWRT, NOPROTECT
#device PASS_STRINGS=IN_RAM
//#include <string.h>
#define XTAL_FREQUENCY 10M
#use delay(clock=XTAL_FREQUENCY, crystal=10M)
#use rs232(baud=9600, UART2)
#define PUSH_BUTTON PIN_B12
#endif
#define EEPROM_SDA PIN_F2
#define EEPROM_SCL PIN_F3
#include <2408.c>
#define _bootloader
#include <pcd_bootloader.h>
#include <loader_pcd.c>
#org LOADER_END+1,LOADER_END+5
void funA()
{
for(int8 i = 0; i < 96; i++)
printf(read_ext_eeprom(i));
}
void funB()
{
for(int8 i = 96; i < 110; i++)
printf(read_ext_eeprom(i));
}
void setupBlueToothConnection()
{
funA();
delay_ms(2000);
funB();
delay_ms(2000);
}
|
Here is my compiler version:
IDE 5.012
PCB 5.012
PCM 5.012
PCH 5.012
PCD 5.012
Pardon me if it's something obvious as I'm not a professional programmer/engineer.
I've spent a considerable amount of time trying to get this working.
Any help will be appreciated & many thanks in advance.
Last edited by msakms on Sat Jan 18, 2014 6:33 am; edited 2 times in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19520
|
|
Posted: Sat Jan 11, 2014 6:17 am |
|
|
When doing any bootloader, you need to compile it first, with 'loader_end' set to a very large value.
Then look at the code, and see how big it is, and move loader_end down to the next page boundary above this.
The standard setting for loader_end, allows room for the standard bootloader. Anything larger, has to have this increased.
Best Wihse |
|
|
msakms
Joined: 20 Nov 2011 Posts: 7 Location: Doha/Qatar
|
|
Posted: Sat Jan 11, 2014 7:32 am |
|
|
Ttelmah wrote: | When doing any bootloader, you need to compile it first, with 'loader_end' set to a very large value.
|
This might sound stupid but please bear with me as I'm still new to the whole bootloader thing.
How can I determine this "very large value"? I have the datasheet memory map right infront of me but I've no idea what should I do next although I've read the whole section about memory organization and I still don't know how to determine the page boundaries.
This sounds like a very simple issue & I'm on the verge of pulling out my hair
I added the following lines to hopefully spot any hints/patterns:
#warning Loader pages: LOADER_PAGES
#warning Loader end: LOADER_END
#warning Loader size: LOADER_SIZE
#warning Loader addr: LOADER_ADDR
And here's what i get:
#warning Loader pages: 19
#warning Loader end: ((19*(128/2))-1)
#warning Loader size: ((19*(128/2))-1)
#warning Loader addr: ((19*(128/2))-1) - ((19*(128/2))-1)
The error I get is this:
Out of ROM, A segment or the program is too large funA
Seg 004C0-004C4, 0006 left, need 00042
Edit:
I tried modifying #org LOADER_END+1, LOADER_END+5 by replacing the "+1" by subtracting larger values as a desperate measure and I always get "Out of ROM" error. |
|
|
msakms
Joined: 20 Nov 2011 Posts: 7 Location: Doha/Qatar
|
|
Posted: Sat Jan 18, 2014 6:36 am |
|
|
This took far so much time than it should be. I give up at this point, I have no problem to pay anyone to get this issue solved.
Kindly inform me ASAP if you're interested & thanks in advance. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19520
|
|
Posted: Mon Jan 20, 2014 1:49 am |
|
|
You must not change the +1, or +5, these are specific to the PIC hardware.
You just change 'LOADER_END'. Set if before loading bootloader.h, and the code will use this value. It must be one less than a page boundary, for the test, set it to perhaps triple or quadruple the default value. You are just making sure that it is a lot larger than your bootloader.
Then compile the bootloader, and look in the LST file for where the last instruction actually is. You then need to change the LOADER_END value to one less than the next page boundary above this instruction, and use this value in future.
The point is that the main code has to be above the bootloader, and 'where' this needs to be depends on the size of your bootloader. You have made the bootloader bigger, so you have to move the boundary. |
|
|
msakms
Joined: 20 Nov 2011 Posts: 7 Location: Doha/Qatar
|
|
Posted: Thu Jan 23, 2014 2:57 am |
|
|
Thank you so much. I appreciate your patience on this issue & have a wonderful day. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|