/* ********************************************************************************************************* * uC/OS-II * The Real-Time Kernel * * Copyright 1992-2020 Silicon Laboratories Inc. www.silabs.com * * SPDX-License-Identifier: APACHE-2.0 * * This software is subject to an open source license and is distributed by * Silicon Laboratories Inc. pursuant to the terms of the Apache License, * Version 2.0 available at www.apache.org/licenses/LICENSE-2.0. * ********************************************************************************************************* */ /* ********************************************************************************************************* * * RISC-V Port * * Filename : os_cpu_c.c * Version : V2.93.00 ********************************************************************************************************* * For : Nuclei RISC-V RV32 and RV64 * Toolchain : GNU C Compiler ********************************************************************************************************* * Note(s) : Hardware FP is not supported. ********************************************************************************************************* */ #define OS_CPU_GLOBALS /* ********************************************************************************************************* * INCLUDE FILES ********************************************************************************************************* */ #include /* ********************************************************************************************************* * LOCAL VARIABLES ********************************************************************************************************* */ #if OS_TMR_EN > 0u static INT16U OSTmrCtr; #endif /* ********************************************************************************************************* * OS INITIALIZATION HOOK * (BEGINNING) * * Description: This function is called by OSInit() at the beginning of OSInit(). * * Arguments : none * * Note(s) : 1) Interrupts should be disabled during this call. ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSInitHookBegin(void) { #if OS_TMR_EN > 0u OSTmrCtr = 0u; #endif } #endif /* ********************************************************************************************************* * OS INITIALIZATION HOOK * (END) * * Description: This function is called by OSInit() at the end of OSInit(). * * Arguments : none * * Note(s) : 1) Interrupts should be disabled during this call. ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSInitHookEnd(void) { } #endif /* ********************************************************************************************************* * TASK CREATION HOOK * * Description: This function is called when a task is created. * * Arguments : ptcb is a pointer to the task control block of the task being created. * * Note(s) : 1) Interrupts are disabled during this call. ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSTaskCreateHook(OS_TCB* p_tcb) { #if OS_APP_HOOKS_EN > 0u App_TaskCreateHook(p_tcb); #else (void)ptcb; /* Prevent compiler warning */ #endif } #endif /* ********************************************************************************************************* * TASK DELETION HOOK * * Description: This function is called when a task is deleted. * * Arguments : ptcb is a pointer to the task control block of the task being deleted. * * Note(s) : 1) Interrupts are disabled during this call. ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSTaskDelHook(OS_TCB* p_tcb) { #if OS_APP_HOOKS_EN > 0u App_TaskDelHook(p_tcb); #else (void)ptcb; /* Prevent compiler warning */ #endif } #endif /* ********************************************************************************************************* * IDLE TASK HOOK * * Description: This function is called by the idle task. This hook has been added to allow you to do * such things as STOP the CPU to conserve power. * * Arguments : none * * Note(s) : 1) Interrupts are enabled during this call. ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSTaskIdleHook(void) { #if OS_APP_HOOKS_EN > 0u App_TaskIdleHook(); #endif } #endif /* ********************************************************************************************************* * TASK RETURN HOOK * * Description: This function is called if a task accidentally returns. In other words, a task should * either be an infinite loop or delete itself when done. * * Arguments : ptcb is a pointer to the task control block of the task that is returning. * * Note(s) : none ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSTaskReturnHook(OS_TCB* p_tcb) { #if OS_APP_HOOKS_EN > 0u App_TaskReturnHook(p_tcb); #else (void)ptcb; #endif } #endif /* ********************************************************************************************************* * STATISTIC TASK HOOK * * Description: This function is called every second by uC/OS-II's statistics task. This allows your * application to add functionality to the statistics task. * * Arguments : none ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSTaskStatHook(void) { #if OS_APP_HOOKS_EN > 0u App_TaskStatHook(); #endif } #endif /* ********************************************************************************************************* * INITIALIZE A TASK'S STACK * This OSTaskStkInit function is implemented in os_cpu_port.c portable source file * ********************************************************************************************************* */ /* ********************************************************************************************************* * TASK SWITCH HOOK * * Description: This function is called when a task switch is performed. This allows you to perform other * operations during a context switch. * * Arguments : none * * Note(s) : 1) Interrupts are disabled during this call. * 2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that * will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the * task being switched out (i.e. the preempted task). ********************************************************************************************************* */ #if (OS_CPU_HOOKS_EN > 0u) && (OS_TASK_SW_HOOK_EN > 0u) void OSTaskSwHook(void) { #if OS_APP_HOOKS_EN > 0u App_TaskSwHook(); #endif OS_TRACE_TASK_SWITCHED_IN(OSTCBHighRdy); } #endif /* ********************************************************************************************************* * OS_TCBInit() HOOK * * Description: This function is called by OS_TCBInit() after setting up most of the TCB. * * Arguments : ptcb is a pointer to the TCB of the task being created. * * Note(s) : 1) Interrupts may or may not be ENABLED during this call. ********************************************************************************************************* */ #if OS_CPU_HOOKS_EN > 0u void OSTCBInitHook(OS_TCB* p_tcb) { #if OS_APP_HOOKS_EN > 0u App_TCBInitHook(p_tcb); #else (void)ptcb; /* Prevent compiler warning */ #endif } #endif /* ********************************************************************************************************* * TICK HOOK * * Description: This function is called every tick. * * Arguments : none * * Note(s) : 1) Interrupts may or may not be ENABLED during this call. ********************************************************************************************************* */ #if (OS_CPU_HOOKS_EN > 0u) && (OS_TIME_TICK_HOOK_EN > 0u) void OSTimeTickHook(void) { #if OS_APP_HOOKS_EN > 0u App_TimeTickHook(); #endif #if OS_TMR_EN > 0u OSTmrCtr++; if (OSTmrCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC)) { OSTmrCtr = 0u; OSTmrSignal(); } #endif } #endif /* ********************************************************************************************************* * SYS TICK HANDLER * This Systick handler function is implemented in os_cpu_port.c portable source file * See xPortSysTickHandler in os_cpu_port.c * ********************************************************************************************************* */