Exemplo n.º 1
0
void critical_section_deinit(CriticalSection* cs)
{
    //muss möglich sein, das können wir von mir aus per definition verlangen
    critical_section_enter(cs);
    
    //alle warter durch ipc nachricht aufwecken?
    //situation in der das sinnvoll sein könnte: es gibt "eingefrorene" threads
    //  die immernoch auf die section warten; diese könnten so bleiben, aber
    //  wir wecken sie lieber auf
    //=> mehr ungetesteter kaum benutzter code
    //falls es aber threads gibt, die immernoch aktiv versuchen, die critical
    //  section zu bekommen, können wir nichts machen (ausser vllt. abstürzen)
    volatile struct Waiter* waiter = cs->waiter_chain;
    
    cs->waiter_chain = NULL;
    cs->lock = 3;
    cs->counter = 0;
    cs->owner = THREAD_HANDLE_NULL;
    
    while (waiter) {
        LipcMessage msg;
        msg.flags = LIPC_SEND;
        msg.send_receive_handle = waiter->thread;
        msg.word0 = SOME_MAGIC;
        msg.word1 = MSG_CRITICAL_SECTION_DESTROY;
        bool res = sys_lipc(&msg);
        assert(res);
        waiter = waiter->next;
    }
}
Exemplo n.º 2
0
bool flash_io_driver_erase_block(__ROM void* address)
{
  if(is_range_valid(address) == false)
  {
    return false;
  }

  // already blank?
  if(blank_check_block(address))
  {
    return true;
  }
  
  {
    critical_section_enter();

    UNLOCKREG();
    if(FMC_Erase((uint32_t)address) != E_FMC_OK)
    {
      LOCKREG();
      critical_section_exit();
      return false;
    }
    LOCKREG();
    
    critical_section_exit();
  }

  // is it blank now?
  return blank_check_block(address);
}
Exemplo n.º 3
0
bool flash_io_driver_initialize(void)
{
  uint32_t desiredConfig0 = 0xF8FFFF7E;
  uint32_t desiredConfig1 = APPLICATION_DATA_START;
  uint32_t config0;
  uint32_t config1;
  bool fail = false;

  critical_section_enter();
  
  UNLOCKREG();    
  FMC_Init(); 
  FMC_EnableAPUpdate();
  LOCKREG();
  
  if(FMC_Read(CONFIG0, &config0) != E_FMC_OK)
  {
    fail = true;
  }
  
  if(FMC_Read(CONFIG1, &config1) != E_FMC_OK)
  {
    fail = true;
  }
  
  if(fail || (desiredConfig0 != config0) || (desiredConfig1 != config1))
  {
    FMC_EnableConfigUpdate();

    if(FMC_WriteConfig(config0, config1) != E_FMC_OK)
    {
      fail = true;
    }
    else
    {
      fail = false;
    }

    FMC_DisableConfigUpdate();
  }
  
  critical_section_exit();
  
  return fail == false;
}
Exemplo n.º 4
0
void debug_channel_write(uint8_t value)
{
  critical_section_enter();

  tempValue = value;

  _asm

  // start bit
startbit:
  bcf LATB, 6, 0
  nop

  // data bits (lsb first)

  // bit 0
bit0:
  BIT_STRETCH
  //            rrcf value, 1, 0
  btfss tempValue, 0, 0
  bra bit0_low
bit0_high:
  nop
  bsf LATB, 6, 0
  bra bit1
bit0_low:
  bcf LATB, 6, 0
  nop
  nop
  // bit 1
bit1:
  BIT_STRETCH
  btfss tempValue, 1, 0
  bra bit1_low
bit1_high:
  nop
  bsf LATB, 6, 0
  bra bit2
bit1_low:
  bcf LATB, 6, 0
  nop
  nop
  // bit 2
bit2:
  BIT_STRETCH
  btfss tempValue, 2, 0
  bra bit2_low
bit2_high:
  nop
  bsf LATB, 6, 0
  bra bit3
bit2_low:
  bcf LATB, 6, 0
  nop
  nop
  // bit 3
bit3:
  BIT_STRETCH
  btfss tempValue, 3, 0
  bra bit3_low
bit3_high:
  nop
  bsf LATB, 6, 0
  bra bit4
bit3_low:
  bcf LATB, 6, 0
  nop
  nop
  // bit 4
bit4:
  BIT_STRETCH
  btfss tempValue, 4, 0
  bra bit4_low
bit4_high:
  nop
  bsf LATB, 6, 0
  bra bit5
bit4_low:
  bcf LATB, 6, 0
  nop
  nop
  // bit 5
bit5:
  BIT_STRETCH
  btfss tempValue, 5, 0
  bra bit5_low
bit5_high:
  nop
  bsf LATB, 6, 0
  bra bit6
bit5_low:
  bcf LATB, 6, 0
  nop
  nop
  // bit 6
bit6:
  BIT_STRETCH
  btfss tempValue, 6, 0
  bra bit6_low
bit6_high:
  nop
  bsf LATB, 6, 0
  bra bit7
bit6_low:
  bcf LATB, 6, 0
  nop
  nop
  // bit 7
bit7:
  BIT_STRETCH
  btfss tempValue, 7, 0
  bra bit7_low
bit7_high:
  nop
  bsf LATB, 6, 0
  bra stopbit
bit7_low:
  bcf LATB, 6, 0
  nop
  nop

  // stop bit
stopbit:
  BIT_STRETCH
  nop
  nop
  nop
  bsf LATB, 6, 0

  _endasm

  critical_section_exit();
}