对比新文件 |
| | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \file |
| | | * |
| | | * \brief System hooks. |
| | | * |
| | | * Copyright (c) 2013-2019 Arm Ltd. All Rights Reserved. |
| | | * |
| | | * Copyright (c) 2019-2020 Packetcraft, Inc. |
| | | * |
| | | * 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 "pal_sys.h" |
| | | #include "pal_uart.h" |
| | | |
| | | #include "mk_common.h" |
| | | #include "mk_misc.h" |
| | | |
| | | /************************************************************************************************** |
| | | Macros |
| | | **************************************************************************************************/ |
| | | |
| | | /*! \brief Starting memory location of free memory. */ |
| | | #define FREE_MEM_START ((uint8_t *)palSysFreeMem) |
| | | |
| | | /************************************************************************************************** |
| | | Global Variables |
| | | **************************************************************************************************/ |
| | | |
| | | /*! \brief Free memory for pool buffers (align to word boundary). */ |
| | | static uint32_t palSysFreeMem[FREE_MEM_SIZE / sizeof(uint32_t)]; |
| | | |
| | | uint8_t *SystemHeapStart = (uint8_t *)palSysFreeMem; |
| | | uint32_t SystemHeapSize = FREE_MEM_SIZE; |
| | | |
| | | /*! \brief Number of assertions. */ |
| | | static uint32_t palSysAssertCount; |
| | | |
| | | /*! \brief Trap enabled flag. */ |
| | | static volatile bool_t PalSysAssertTrapEnable; |
| | | |
| | | static volatile uint32_t palSysBusyCount; |
| | | |
| | | /************************************************************************************************** |
| | | Functions |
| | | **************************************************************************************************/ |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Enter a critical section. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | uint32_t PalEnterCs(void) |
| | | { |
| | | return int_lock(); |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Exit a critical section. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | void PalExitCs(uint32_t lock) |
| | | { |
| | | int_unlock(lock); |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Common platform initialization. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | void PalSysInit(void) |
| | | { |
| | | palSysAssertCount = 0; |
| | | PalSysAssertTrapEnable = TRUE; |
| | | palSysBusyCount = 0; |
| | | |
| | | #ifdef DEBUG |
| | | /* Reset free memory. */ |
| | | memset(SystemHeapStart, 0, SystemHeapSize); |
| | | #endif |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief System fault trap. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | void PalSysAssertTrap(void) |
| | | { |
| | | palSysAssertCount++; |
| | | |
| | | while (PalSysAssertTrapEnable) |
| | | { |
| | | } |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Set system trap. |
| | | * |
| | | * \param enable Enable assert trap or not. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | void PalSysSetTrap(bool_t enable) |
| | | { |
| | | PalSysAssertTrapEnable = enable; |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Get assert count. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | uint32_t PalSysGetAssertCount(void) |
| | | { |
| | | return palSysAssertCount; |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Count stack usage. |
| | | * |
| | | * \return Number of bytes used by the stack. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | uint32_t PalSysGetStackUsage(void) |
| | | { |
| | | /* Not available; stub routine. */ |
| | | return 0; |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief System sleep. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | void PalSysSleep(void) |
| | | { |
| | | /* Clock management for low power mode. */ |
| | | |
| | | /* CPU sleep. */ |
| | | __WFI(); |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Check if system is busy. |
| | | * |
| | | * \return TRUE if system is busy. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | bool_t PalSysIsBusy(void) |
| | | { |
| | | bool_t sysIsBusy = FALSE; |
| | | uint32_t lock = PalEnterCs(); |
| | | sysIsBusy = ((palSysBusyCount == 0) ? FALSE : TRUE); |
| | | PalExitCs(lock); |
| | | return sysIsBusy; |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Set system busy. |
| | | * |
| | | * \return none. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | void PalSysSetBusy(void) |
| | | { |
| | | uint32_t lock = PalEnterCs(); |
| | | palSysBusyCount++; |
| | | PalExitCs(lock); |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Set system idle. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | void PalSysSetIdle(void) |
| | | { |
| | | uint32_t lock = PalEnterCs(); |
| | | if (palSysBusyCount) |
| | | { |
| | | palSysBusyCount--; |
| | | } |
| | | PalExitCs(lock); |
| | | } |
| | | |
| | | /*************************************************************************************************/ |
| | | /*! |
| | | * \brief Get the Systick elapse time in current tick period. |
| | | * |
| | | * \return Elapse time in current tick period. |
| | | */ |
| | | /*************************************************************************************************/ |
| | | uint32_t PalSysTickElapse(void) |
| | | { |
| | | return sys_tick_elapse_ms(); |
| | | } |
| | | |
| | | uint32_t PalSysTickGet(void) |
| | | { |
| | | return sys_tick_get(); |
| | | } |