Changeset b32020b in rtems


Ignore:
Timestamp:
Jul 28, 2009, 11:14:23 PM (10 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, master
Children:
ad4759ab
Parents:
5353469
Message:

2009-07-28 Joel Sherrill <joel.sherrill@…>

  • cpu.c, cpu_asm.S, rtems/score/cpu.h: Context switch now works well enough to run ticker to completion with the simulator clock idle task. But if you comment out the printk's in _CPU_Context_Initialize, it hangs. This remains to be investigated.
Location:
cpukit/score/cpu/avr
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/cpu/avr/ChangeLog

    r5353469 rb32020b  
     12009-07-28      Joel Sherrill <joel.sherrill@oarcorp.com>
     2
     3        * cpu.c, cpu_asm.S, rtems/score/cpu.h: Context switch now works well
     4        enough to run ticker to completion with the simulator clock idle
     5        task. But if you comment out the printk's in _CPU_Context_Initialize,
     6        it hangs. This remains to be investigated.
     7
    182009-07-23      Joel Sherrill <joel.sherrill@oarcorp.com>
    29
  • cpukit/score/cpu/avr/cpu.c

    r5353469 rb32020b  
    7272  uint16_t stack;
    7373  uint16_t start;
    74   uint16_t *tmpsp;
     74  uint8_t  *tmp_sp;
     75  uint8_t   start_low;
     76  uint8_t   start_high;
    7577
    7678  /* calc stack high end */
    7779  stack = (uint16_t) (stack_base) + (uint16_t) (size);
    78 
    7980  /* calc stack pointer initial value */
    80   stack -= 2;
    81 
    82   the_context->stack_pointer = stack;
    83   tmpsp = (uint16_t *) stack;
     81  the_context->stack_pointer = (stack - 18);
     82  /* put the entry point on the stack */
    8483  start = (uint16_t) entry_point;
    85   *tmpsp = start;
    86 #if 0
    87   tmpsp[0] = start & 0xff;
    88   tmpsp[1] = (start >> 8) & 0xff;
    89 #endif
    90 
    91   /* FIXME on level */
    92   if (new_level) the_context->status = 0;
    93   else           the_context->status = 0;
    94 
     84  start_low = start & 0xff;
     85  start_high = start >> 8;
     86  tmp_sp = (uint8_t *) (stack+1);
     87  tmp_sp[0] = start_high;
     88  tmp_sp[1] = start_low;
     89
     90  if (new_level) the_context->status = 0x00; //interrupts are enabled
     91  else           the_context->status = 0x80; //interrupts are disabled
     92
     93  /*
     94   * JOEL: Why if I comment out these three lines does ticker not run?
     95   */
    9596#if 1
    96   printk("");
     97  printk( "tmp_sp=0x%04x ", ((uint16_t)tmp_sp) );
    9798  printk("the_context = 0x%x\n", the_context);
    9899  printk("entry = 0x%x\n", entry_point);
     100#endif
     101#if 0
    99102  printk("sp = 0x%x\n\n",stack);
     103
     104 { int i; uint8_t *p;
     105   p = (uint8_t *)(stack - 18);
     106   for( i=0 ; i<=20 ; i+=8 ) {
     107     printk( "0x%04x ", ((uint16_t)&p[i]) );
     108     printk(
     109      "0x%02x 0x%02x 0x%02x 0x%02x   ",
     110      p[i + 0], p[i + 1], p[i + 2], p[i + 3]
     111     );
     112     printk(
     113      "0x%02x 0x%02x 0x%02x 0x%02x\n",
     114      p[i + 4], p[i + 5], p[i + 6], p[i + 7]
     115     );
     116   }
     117 }
    100118#endif
    101119}
    102 
    103120
    104121/*PAGE
  • cpukit/score/cpu/avr/cpu_asm.S

    r5353469 rb32020b  
    209209        PUBLIC(_CPU_Context_switch)
    210210SYM(_CPU_Context_switch):
    211         mov     r26, r24
     211        mov     r26, r24        /* r26,r27 is X or current context */
    212212        mov     r27, r25
    213         mov     r24, r22
     213        mov     r24, r22        /* r24,r25 is heir context */
    214214        mov     r25, r23
    215         st      X+, r2
    216         st      X+, r3
    217         st      X+, r4
    218         st      X+, r5
    219         st      X+, r6
    220         st      X+, r7
    221         st      X+, r8
    222         st      X+, r9
    223         st      X+, r10
    224         st      X+, r11
    225         st      X+, r12
    226         st      X+, r13
    227         st      X+, r14
    228         st      X+, r15
    229         st      X+, r16
    230         st      X+, r17
    231         st      X+, r28
    232         st      X+, r29
    233         st      X+, r29
    234         lds     r23,0x5f  /*load sreg*/
    235         st      X+, r23
    236         lds     r23,0x5d /*spl*/
    237         st      X+, r23
    238         lds     r23,0x5e /*sph*/
    239        
     215        /*save registers*/
     216        push    r2
     217        push    r3
     218        push    r4
     219        push    r5
     220        push    r6
     221        push    r7
     222        push    r8
     223        push    r9
     224        push    r10
     225        push    r11
     226        push    r12
     227        push    r13
     228        push    r14
     229        push    r15
     230        push    r16
     231        push    r17
     232        push    r28
     233        push    r29
     234        /*load sreg*/
     235        lds     r23,0x5F  /*load sreg*/
     236        /*disable interrupts*/
     237        cli
     238        /*load stack pointer*/
     239        lds     r22,0x5D /*spl*/
     240        lds     r21,0x5E /*sph*/
     241        /*save sp to context struct*/
     242        /*save low then high byte --- verify this delete when verified*/
     243        st      X+, r22
     244        st      X+, r21
     245        /*save sreg and sp to context struct*/
     246        st      X, r23
     247
     248
    240249        PUBLIC(_CPU_Context_restore)
    241250
     
    243252        mov     r26,r24         /* R26/27 are X */
    244253        mov     r27,r25
    245         ld      r2, X+
    246         ld      r3, X+
    247         ld      r4, X+
    248         ld      r5, X+
    249         ld      r6, X+
    250         ld      r7, X+
    251         ld      r8, X+
    252         ld      r9, X+
    253         ld      r10, X+
    254         ld      r11, X+
    255         ld      r12, X+
    256         ld      r13, X+
    257         ld      r14, X+
    258         ld      r15, X+
    259         ld      r16, X+
    260         ld      r17, X+
    261         ld      r28, X+
    262         ld      r29, X+
     254        /*restore stack pointer*/
    263255        ld      r25, X+
    264         sts     0x5f,r25 /*sreg*/
    265         ld      r25, X+
    266         sts     0x5d,r25  /*spl*/
    267         ld      r25, X+
    268         sts     0x5e ,r25 /*sph*/
    269         ret
    270 
    271 
    272         PUBLIC(_CPU_Push)
    273 SYM(_CPU_Push):
    274         lds     r20, 0x5d /*spl*/
    275         lds     r21, 0x5e /*sph*/
    276         sts     0x5d, r24  /*spl*/
    277         sts     0x5e, r25  /*sph*/     
    278         push    r22
    279         push    r23
    280         sts     0x5d, r20  /*spl*/
    281         sts     0x5e, r21  /*sph*/
    282         ret
     256        ld      r24, X+
     257        sts     0x5E, r24 /*sph*/
     258        sts     0x5D, r25 /*spl*/
     259        /*restore registers from stack*/
     260        pop     r29
     261        pop     r28
     262        pop     r17
     263        pop     r16
     264        pop     r15
     265        pop     r14
     266        pop     r13
     267        pop     r12
     268        pop     r11
     269        pop     r10
     270        pop     r9
     271        pop     r8
     272        pop     r7
     273        pop     r6
     274        pop     r5
     275        pop     r4
     276        pop     r3
     277        pop     r2
     278        /*restore status register*/
     279        ld      r23, X
     280        sts     0x5f,r23 /*sreg*/       
     281        ret
     282
     283
    283284
    284285/*
  • cpukit/score/cpu/avr/rtems/score/cpu.h

    r5353469 rb32020b  
    425425
    426426typedef struct {
    427         uint8_t         reg2;
    428         uint8_t         reg3;
    429         uint8_t         reg4;
    430         uint8_t         reg5;
    431         uint8_t         reg6;
    432         uint8_t         reg7;
    433         uint8_t         reg8;
    434         uint8_t         reg9;
    435         uint8_t         reg10;
    436         uint8_t         reg11;
    437         uint8_t         reg12;
    438         uint8_t         reg13;
    439         uint8_t         reg14;
    440         uint8_t         reg15;
    441         uint8_t         reg16;
    442         uint8_t         reg17;
    443         uint8_t         reg28;
    444         uint8_t         reg29;
     427        uint16_t        stack_pointer;
    445428        uint8_t         status; //SREG
    446         uint16_t        stack_pointer;
    447429} Context_Control;
    448430
Note: See TracChangeset for help on using the changeset viewer.