Shop OBEX P1 Docs P2 Docs Learn Events
[PASM] Can't get Coginit instruction to work — Parallax Forums

[PASM] Can't get Coginit instruction to work

WossnameWossname Posts: 174
edited 2012-04-14 02:36 in Propeller 1
EDIT: This thread is solved and I've posted a demo program that is related to the discussion in this thread...

http://wardyprojects.blogspot.co.uk/2012/04/propeller-programming-8-cogs-running.html







I'm making Cog 0 run a "bootstrapper" written in PASM. So far so good, that works.

What I am having trouble with is starting another cog (cog 7 in fact, not that it's important) from within the bootstrapper code using the coginit instruction in PASM. The PASM code I want to put in cog 7 never runs so I must be constructing the bit fields incorrectly, so cog 7 never starts up.

I've carefully checked the field alignments and I believe them to be correct as per the Prop Manual. Therefore the numbers I'm passing in must be wrong within those bit fields.

I'd be most grateful if someone could have a quick look at my code please. Just put LEDs on P0 and P1 and run the code. In my broken code only P0's LED flashes, in working code they should both be flashing (and different speeds)...
CON
  '_clkmode = RCFAST
            
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000
    
 
PUB Main 
 
  coginit(0, @BOOTSTRAPPER, 0)         


   
DAT


                        org     0                


'I want these 8 lines of cog config info to be stored in the HUB but *NOT* in the cog ram when the cogs start up
'I want the coginit call to pass these hub addresses to the cogs when they start up...
                         
                             'IO PIN,   loop delay
cog7_config             long    7,      80_000_000       
cog6_config             long    6,      79_000_000          
cog5_config             long    5,      78_000_000          
cog4_config             long    4,      77_000_000          
cog3_config             long    3,      76_000_000          
cog2_config             long    2,      75_000_000          
cog1_config             long    1,      74_000_000          
cog0_config             long    0,      73_000_000       


                        fit
 


                                                                  
                        org     0  
                         
BOOTSTRAPPER
                        or      dira, #1
                        'COGINIT instruction setup see Propeller Manual (PASM Instruction Set) for bit-field 
                        mov     boot_settings, @cog7_config    'bad syntax??? 
                        andn    boot_settings, #$03                          
                        shl     boot_settings, #14 
                        or      boot_settings, #COG7_CODE      'bad syntax???
                        shl     boot_settings, #2
                        andn    boot_settings, #$0f                          
                        or      boot_settings, #7       'RUN IN COG SEVEN!


                        coginit boot_settings
                        '---------------------------------- FINISHED SETUP FOR COG7


                                                           


                        mov     boot_time, cnt
                        add     boot_time, #16
:loop                   waitcnt boot_time, boot_delay
                        xor     outa, #1                
                        jmp     #:loop                  'WAIT IN THIS LOOP FOREVER, blinking LED on P0


                                            
boot_delay              long    10_000_000                              
boot_settings           res     1
boot_time               res     1


                         
                        fit
              




              
'########################################################################              
                        org     0
                         
COG7_CODE


                        'DEBUGGING
                        or      dira, #2
                        mov     c7_time, cnt
                        add     c7_time, #16
:debugloop              waitcnt c7_time, C7_DEBUG_DELAY                            
                        xor     outa, #2          
                        jmp     #:debugloop




                        




                        mov     c7_parptr, par


                        rdlong  c7_temp, c7_parptr      'fetch the IO pin number
                        mov     c7_ledPin, #1           'this 1 will be shifted into the right position           
                        shl     c7_ledPin, c7_temp      'c7_ledPin now correctly nominates a single IO pin in OUTA


                        or      dira, c7_ledPin         'enable output on that nominated IO pin           
                                                
                        add     c7_parptr, #4           'move the parameter pointer to the next LONG value in Hub RAM
                        rdlong  c7_delay, c7_parptr     'fetch the timer delay interval from that address


                        mov     c7_time, cnt
                        add     c7_time, #16
:loop                   waitcnt c7_time, c7_delay                            
                        xor     outa, c7_ledPin          
                        jmp     #:loop                        
                         


C7_DEBUG_DELAY          long    4_000_000        
                         
c7_parptr               res     1
c7_ledPin               res     1 
c7_delay                res     1
c7_time                 res     1
c7_temp                 res     1
                         
                        fit
'########################################################################









The manual could REALLY do with a worked example of how to realistically use coginit in PASM (not just the spin version).

Comments

  • kuronekokuroneko Posts: 3,623
    edited 2012-04-13 05:49
    The problem is that @ used in a DAT section behaves differently from @ used in SPIN code. The former is applied without the objects final location in the binary image (e.g. the top object usually has an offset of $10). So it boils down to adjusting for said offset.

    This is just quick and dirty. I extended the table to include the code address (cog 7 only). I also pass the real (final) address of the table to the bootstrap cog. The bootstrap cog first calculates the offset by adding par to reference. Then it picks the right table entry and extracts the code address, adjusts the latter and constructs the coginit parameter in the normal way. As an example I flash the LED bar of the demo board with 0.5Hz.
    CON
      _clkmode = XTAL1|PLL16X
      _xinfreq = 5_000_000
     
    PUB Main 
     
      coginit(cogid, @BOOTSTRAPPER, @cog0_config)
       
    DAT
    
    'I want these 8 lines of cog config info to be stored in the HUB but *NOT* in the cog ram when the cogs start up
    'I want the coginit call to pass these hub addresses to the cogs when they start up...
                             
                                 'IO PIN,   loop delay
    cog0_config             long    0,      73_000_000, 0    
    cog1_config             long    1,      74_000_000, 0       
    cog2_config             long    2,      75_000_000, 0       
    cog3_config             long    3,      76_000_000, 0       
    cog4_config             long    4,      77_000_000, 0       
    cog5_config             long    5,      78_000_000, 0       
    cog6_config             long    6,      79_000_000, 0       
    cog7_config             long    7,      80_000_000, @COG7_CODE
    
                            fit
                                                                       
    DAT                     org     0  
                             
    BOOTSTRAPPER            add     reference, par          ' adjust for runtime delta
                            mov     temp, par               ' @cog0_config
                            add     temp, #12*7{ID}         ' @cog7_config
    
                            mov     boot_settings, temp
                            shl     boot_settings, #16      ' %pppppppp_pppppp00_00000000_00000000
                            or      boot_settings, #7{ID}   ' %pppppppp_pppppp00_00000000_00000111
    
                            add     temp, #8                ' @cog7_config[2]
                            rdlong  temp, temp              ' @COG7_CODE in DAT context
                            add     temp, reference         ' adjust
    
                            shl     temp, #2                ' %00000000_000000aa_aaaaaaaa_aaaa0000
                            or      boot_settings, temp     ' done
    
                            coginit boot_settings
                            '---------------------------------- FINISHED SETUP FOR COG7
                            waitpeq $, #0
                            
    reference               long    -@cog0_config
                                                
    boot_settings           res     1
    temp                    res     1
                             
                            fit
    
    DAT                     org     0
                             
    COG7_CODE               mov     dira, mask
                            rdlong  delay, #0
                            mov     cnt, cnt
                            add     cnt, #9
                            waitcnt cnt, delay
                            xor     outa, mask
                            jmp     #$-2
    
    mask                    long    $00FF0000
    delay                   res     1
    
                            fit
    
    DAT
    
  • WossnameWossname Posts: 174
    edited 2012-04-13 08:11
    Kuroneko, I bow before such awesomeness.

    I don't entirely understand the finer points of hub ram address allocations but I have worked your changes into my test app and now I have all 8 cogs running PASM and all of them taking their runtime parameters from the cog_config data table.

    I'm going to tidy my code up a bit, cram it full of explanatory comments and then post it on my blog as a template for anyone else to use.

    Thank you very much for your help!

    (I'll post a link to my blog in a bit...)
  • WossnameWossname Posts: 174
    edited 2012-04-14 02:36
    Ok I've put my code up on my blog, you can find it here...

    http://wardyprojects.blogspot.co.uk/2012/04/propeller-programming-8-cogs-running.html

    Thanks again Kuroneko, much appreciated :)
Sign In or Register to comment.