Øyvind Harboe wrote:
> Regarding the run_algorithm. This makes me think about
> the refactoring I did for the arm simulation code....
>
> W.r.t. run_algorithm, I was thinking about how much work
> it would be to write a *small* machine code translator
> that would translate generic code in to machine specific
> code... Sounds impossibly hard, but is it really? I haven't
> looked at what's out there.
>   

We also talked a while back about the idea of a standardized download to 
the target.

The general idea i was taking about at the time is described below.

-Duane.
====

 A small say 2K, 100% position independent common block of arm code.
   perhaps - an "armv4" based 32bit code (not thumb)
      why? Because that would cover all arm7 and arm9 chips.

   Perhaps - another for cortexM3
   perhaps - another for armv7 - (cortexA8)

  Maybe other chips are "fixed address" - but generally ARM code can be made
  to be PIC in a very simple way.

When this idea would be bad:      Little quick downloads
When this idea would be good:   BULK transfers, flash programing, etc.

The idea is this:
     Let us assume there is a 4K block (working space) of ram some where.
     The code could be 2K, set aside 1K for stack (yes 1K)
     And 1K for a download buffer - could be bigger..
    Maybe we work with 4K and 4K...

   The entry point would be fixed - always at Buffer+0
   Set the program counter there, nothing else needs set.
 
   Then, set a SW breakpoint at - a fixed location.
   Example:  Buffer + 0x10
   This would leave a few bytes @ the start for startup code
   And might be easier for different chips (ie: non-arm chips).
 
   The target code *RUNS*, sets up the stack and then enters
   some type of "for-ever" loop, that looks like this:
   *AND* is 100% written in *C* code - not assembler.

       some_c_function( void )
       {
              uint32_t   buffer[16];
              // this example puts the 4K transfer buffer on the stack
              uint32_t   download_buffer[ 1024 ];
              int result;

             // assume result=success
             result = 0;

              for( ;; ){
                  // buffer[0] = holds result
                buffer[0] = result;
                 // tell app where transfer buffer is located.
                 buffer[1] = &download_buffer[0];
                 buffer[2] = sizeof(download_buffer);

                    // this hits openocd breakpoint
                   openocd_syscall( &buffer[0] );

                   // openocd stuffs parameters in the buffer.
                   // parameter 0 - is the command.
                 // parameter 1/2/3 ... /15 are command specific

                   switch( buffer[0] ){
                   case CFI_FLASH_ERASE:
                            // params 1,2,3 are address and length
                            result= perform_cfi_erase( &buffer[0] );
                   case HIGH_SPEED_DOWNLOAD:
                            // on ARM this might use CP15 DCC
                            result =perform_high_speed_download( 
&buffer[0] );
                   case .. other commands
                        // break
                   } // switch
              } // forever()
       }

======

Why do I suggest C? And the above method...
    Because it would work on *ALL* targets!
    One only needs to *compile* a small C program.
    And little helpers would be very fast.

-Duane.



_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to