/*************************************************************************************************/ /*! * \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(); }