View previous topic :: View next topic |
Author |
Message |
KaraMuraT
Joined: 16 May 2006 Posts: 65 Location: Ankara/Turkey
|
Bootloader: Questions about Ckielstra's bootloader |
Posted: Mon Mar 12, 2007 5:44 am |
|
|
Hi;
I've studied Ckielstra's Bootloader and took it as reference for my Bootlader. This bootloader is mentioned in 3 topics, as:
http://www.ccsinfo.com/forum/viewtopic.php?t=20971
http://www.ccsinfo.com/forum/viewtopic.php?t=27019
http://www.ccsinfo.com/forum/viewtopic.php?t=27387
But none of them includes my questions. Because I'm a newbie in bootloading concept. I've read lots of topics but have to make sure something.
Let me paste my code here:
Bootloader.h
Code: |
#include <18F4620.h>
#device *=16 ADC=10
#device CCS4 WRITE_EEPROM=ASYNC
#fuses INTRC_IO
#fuses NOIESO
#fuses NOWDT
#fuses NOPROTECT
#fuses BROWNOUT_NOSL
#fuses BORV43
#fuses NOLVP
#fuses NOPUT
#fuses NOMCLR
#fuses NOLPT1OSC
#fuses NOPBADEN
#fuses NOXINST
#fuses NODEBUG
#use delay(clock=4000000)
#ifdef __PCH__
#else
#error Invalid Compiler Version
#endif
#define RESET_VECTOR 0x0000 // Defined by hardware
#define HIGH_INT_VECTOR 0x0008 // Defined by hardware
#define NORMAL_INT_VECTOR 0x0018 // Defined by hardware
#define INTERRUPT_REMAP_END HIGH_INT_VECTOR + 0x1B // End of the remap code
#define LOADER_START INTERRUPT_REMAP_END+1
#define LOADER_END 0x07FF // Defined by size of the bootloader code and/or protection fuses
#define LOADER_RESET RESET_VECTOR
#define LOADER_HIGH_INT LOADER_START
#define LOADER_NORMAL_INT LOADER_HIGH_INT + 0x10
#define APPLICATION_START LOADER_END + 2
#define APPLICATION_RESET APPLICATION_START + RESET_VECTOR
#define APPLICATION_HIGH_INT APPLICATION_START + HIGH_INT_VECTOR
#define APPLICATION_NORMAL_INT APPLICATION_START + NORMAL_INT_VECTOR
#define BUFFER_LEN_LOD 64 /// Seems 32 can be used
#define ACKLOD 0x06
#define XON 0x11
#define XOFF 0x13
// A global flag indicating the bootloader is active or not.
// This flag must be present in both the bootloader and application at the same
// address, that's why we place it here in the bootloader.h with a #locate
// instruction to fixed address 0x10. Address 0x10 was choosen arbitrarily in
// the start of memory above the CCS scratch register area (0x00 to 0x??).
int8 BootloaderActive;
#locate BootloaderActive=10
/// Prototypes
void LoadApplication(void);
#separate
unsigned int atoi_b16(char *s);
|
Bootloader.c
Code: |
#include "SmartLoader.h"
#build(reset=LOADER_RESET, interrupt=LOADER_HIGH_INT)
#use RS232 (BAUD=9600, STREAM=CPORT, XMIT=PIN_C6, RCV=PIN_C7, PARITY=N, BITS=8, ERRORS)
int buffidx;
char buffer[BUFFER_LEN_LOD];
////////////////////////////////////////////////////////////////////////////////
// Relocate the interrupt vectors.
// Depending on whether the bootloader or application is active
// different interrupt dispatchers are called.
#include "LoadFunctions.c"
#org HIGH_INT_VECTOR, INTERRUPT_REMAP_END
void isr_relocate(void)
{
#asm
// Address 0x0008 is the hardware High priority interrupt
TSTFSZ BootloaderActive // if bootloader active
GOTO LOADER_HIGH_INT // then jump to bootloader ISR
GOTO APPLICATION_HIGH_INT // else jump to application ISR
NOP // Just filling memory
NOP
NOP
// Address 0x0018 is the hardware Low priority interrupt
TSTFSZ BootloaderActive // if bootloader active
GOTO LOADER_NORMAL_INT // then jump to bootloader ISR
GOTO APPLICATION_NORMAL_INT // else jump to application ISR
#endasm
}
void main()
{
short LoadCondition = 1; /// Just making it get "Load" command
fprintf(CPORT,"BootLoader started");
if(LoadCondition)
{
fprintf(CPORT,"Loader ready to bootload");
LoadApllication(); /// Has an unknown size
}
goto_address(APPLICATION_START);
}
|
My Questions are:
- Is there any obvious problem in this code.
- How can I get the program size "exactly", to be sure about bootloader size
- I can see lots of "Interrupt area" variable in Symbol Table in the application program, but with this code I can't see anything about Interrupts. is it normal?
- Do I have to use this section:
Code: | #int_global
void isr(void) {
jump_to_isr(LOADER_END+10);
}
|
- is there any detailed help file/topics about *.sym files?
- what is low memory and high memory areas? I'm a bit confused the ROM mapping about the programs.
I appreciate your kind help. _________________ /// KMT
/// www.muratursavas.com |
|
|
KaraMuraT
Joined: 16 May 2006 Posts: 65 Location: Ankara/Turkey
|
|
Posted: Tue Mar 13, 2007 4:14 am |
|
|
I'm digging the problem while waiting for answers. And still confused
We have values as :
Code: | #define RESET_VECTOR 0x0000 // Defined by hardware
#define HIGH_INT_VECTOR 0x0008 // Defined by hardware
#define NORMAL_INT_VECTOR 0x0018 // Defined by hardware
#define INTERRUPT_REMAP_END HIGH_INT_VECTOR + 0x1B // End of the remap code
#define LOADER_START INTERRUPT_REMAP_END+1
#define LOADER_END 0x03FF // Defined by size of the bootloader code and/or protection fuses
#define LOADER_RESET RESET_VECTOR
#define LOADER_HIGH_INT LOADER_START
#define LOADER_NORMAL_INT LOADER_HIGH_INT + 0x10
#define APPLICATION_START LOADER_END + 2
#define APPLICATION_RESET APPLICATION_START + RESET_VECTOR
#define APPLICATION_HIGH_INT APPLICATION_START + HIGH_INT_VECTOR
#define APPLICATION_NORMAL_INT APPLICATION_START + NORMAL_INT_VECTOR
|
As you can notice I've modified bootloader size because actual size is just 0x3BF. The actual values are 8according to this)
Code: | RESET_VECTOR 0x00
HIGH_INT_VECTOR 0x08
NORMAL_INT_VECTOR 0x18
INTERRUPT_REMAP_END 0x23
LOADER_START 0x24
LOADER_END 0x3FF
LOADER_RESET 0x00
LOADER_HIGH_INT 0x24
LOADER_NORMAL_INT 0x34
APPLICATION_START 0x401
APPLICATION_RESET 0x401
APPLICATION_HIGH_INT 0x409
APPLICATION_NORMAL_INT 0x419
|
This table means the application interrupts should start at 0x409 and end at 0x424 right?
If I want to change HIGH_INT_VECTOR to 0x05 (for matching to symbol table, it gives "Invalid ORG range" error. OK 0x08 is no problem. But why not calling interrupts? I'm trying to get whole HW concept not just copy paste... _________________ /// KMT
/// www.muratursavas.com |
|
|
KaraMuraT
Joined: 16 May 2006 Posts: 65 Location: Ankara/Turkey
|
|
Posted: Tue Mar 13, 2007 7:21 am |
|
|
I've solved the situation...
There is a statement in definitions written as
Code: | #define APPLICATION_START LOADER_END + 2 |
I switched 2 with 1. Disassembly was showing jump to 408, but +2 was meaning 409.
Also I've removed the additional lines for bootloader interrupts. I don't need them. Write as:
Code: | #org HIGH_INT_VECTOR, INTERRUPT_REMAP_END
void isr_relocate(void)
{
#asm
GOTO APPLICATION_HIGH_INT // else jump to application ISR
NOP // Just filling memory
NOP
NOP
NOP
NOP
NOP
GOTO APPLICATION_NORMAL_INT // else jump to application ISR
#endasm
} |
This topic seems like just "loud thinking" but I hope it would help the others. All the credits are going to _of course_ ckielstra... Thank you... _________________ /// KMT
/// www.muratursavas.com |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Mar 20, 2007 1:34 pm |
|
|
I didn't publish a complete bootloader, all I did was showing an extension to the CCS bootloader example so it supports interrupts. I understand this is a feature you don't need.
Why do you want to create your own bootloader? There are many difficult and compiler specific issues to take care of, not very interesting to design but a pain in the *ss to get right. Please choose one of the existing bootloaders that is close to your requirements and start from there.
A good starting point is the CCS supplied bootloader example ex_bootloader.c
Or if your memory requirements are very tight you can have a look at the Tiny PIC bootloader.
More bootloader references can be found searching this forum. |
|
|
KaraMuraT
Joined: 16 May 2006 Posts: 65 Location: Ankara/Turkey
|
|
Posted: Wed Mar 21, 2007 12:45 am |
|
|
Hi Ckielstra,
I was finished my bootloader based on your idea at my last post. And started to use the interrupt feature again. It's not from scratch. I modified the ccs bootloader example with your idea and some additional ideas. Now I'm very happy with it. I can program the PIC much faster than buggy PICStart Plus.
Thanks for your interest. _________________ /// KMT
/// www.muratursavas.com |
|
|
|