12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /* mbed Microcontroller Library
- * Copyright (c) 2017 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "cmsis.h"
- #include "hal/critical_section_api.h"
- #include "platform/mbed_assert.h"
- #include "platform/mbed_toolchain.h"
- #include <stdbool.h>
- static volatile bool critical_interrupts_enabled = false;
- static volatile bool state_saved = false;
- static bool are_interrupts_enabled(void)
- {
- #if defined(__CORTEX_A9)
- return ((__get_CPSR() & 0x80) == 0);
- #else
- return ((__get_PRIMASK() & 0x1) == 0);
- #endif
- }
- MBED_WEAK void hal_critical_section_enter(void)
- {
- const bool interrupt_state = are_interrupts_enabled();
- __disable_irq();
- if (state_saved == true) {
- return;
- }
- critical_interrupts_enabled = interrupt_state;
- state_saved = true;
- }
- MBED_WEAK void hal_critical_section_exit(void)
- {
- #ifndef FEATURE_UVISOR
- // Interrupts must be disabled on invoking an exit from a critical section
- MBED_ASSERT(!are_interrupts_enabled());
- #endif
- state_saved = false;
- // Restore the IRQs to their state prior to entering the critical section
- if (critical_interrupts_enabled == true) {
- __enable_irq();
- }
- }
- MBED_WEAK bool hal_in_critical_section(void)
- {
- return (state_saved == true);
- }
|