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; } }
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); }
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; }
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(); }