📄 os_cpu_c.c
字号:
/*********************************************************************************************************
uC/OS-II
The Real-Time Kernel
(c) Copyright 1992-2004, Micrium, Weston, FL
All Rights Reserved
ARM7 Port
File : OS_CPU_C.C
By : Yujun Huang
********************************************************************************************************/
#define OS_CPU_GLOBALS
#include "ucos_ii.h"
//#include "71x_map.h"
#define SYS_MODE (0x0000001FL)
#define USER_MODE (0x00000010L)
/********************************************************************************************************
INITIALIZE A TASK'S STACK
Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the
stack frame of the task being created. This function is highly processor specific.
Arguments : task is a pointer to the task code
p_arg is a pointer to a user supplied data area that will be passed to the task
when the task first executes.
ptos is a pointer to the top of stack. It is assumed that 'ptos' points to
a 'free' entry on the task stack. If OS_STK_GROWTH is set to 1 then
'ptos' will contain the HIGHEST valid address of the stack. Similarly, if
OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address
of the stack.
opt specifies options that can be used to alter the behavior of OSTaskStkInit().
(see uCOS_II.H for OS_TASK_OPT_???).
Returns : Always returns the location of the new top-of-stack' once the processor registers have
been placed on the stack in the proper order.
Note(s) : 1) Interrupts are enabled when your task starts executing.
2) All tasks run in SYS mode.
********************************************************************************************************/
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; // 'opt'没有使用。作用是避免编译器警告('opt' is not used, prevent warning)
stk = ptos; // 获取堆栈指针(Load stack pointer)
*(stk) = (OS_STK)task; // Entry Point(PC)
*(--stk) = (INT32U)0x14141414L; // R14 (LR)
*(--stk) = (INT32U)0x12121212L; // R12
*(--stk) = (INT32U)0x11111111L; // R11
*(--stk) = (INT32U)0x10101010L; // R10
*(--stk) = (INT32U)0x09090909L; // R9
*(--stk) = (INT32U)0x08080808L; // R8
*(--stk) = (INT32U)0x07070707L; // R7
*(--stk) = (INT32U)0x06060606L; // R6
*(--stk) = (INT32U)0x05050505L; // R5
*(--stk) = (INT32U)0x04040404L; // R4
*(--stk) = (INT32U)0x03030303L; // R3
*(--stk) = (INT32U)0x02020202L; // R2
*(--stk) = (INT32U)0x01010101L; // R1
*(--stk) = (INT32U)pdata; // R0 : argument(第一个参数使用R0传递)
// *(--stk) = (INT32U)ARM_SYS_MODE; // CPSR 允许 IRQ, FIQ 中断(Enable both IRQ and FIQ interrupts)
*(--stk) = (INT32U)USER_MODE; // CPSR 允许 IRQ, FIQ 中断(Enable both IRQ and FIQ interrupts)
return (stk);
}
#if OS_CPU_HOOKS_EN
/********************************************************************************************************
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.
********************************************************************************************************/
void OSTaskCreateHook (OS_TCB *ptcb)
{
ptcb = ptcb; // Prevent compiler warning
// (void)ptcb; // Prevent compiler warning
}
/********************************************************************************************************
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.
********************************************************************************************************/
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb; // Prevent compiler warning
// (void)ptcb; // Prevent compiler warning
}
/********************************************************************************************************
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).
********************************************************************************************************/
void OSTaskSwHook (void)
{
}
/********************************************************************************************************
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
********************************************************************************************************/
void OSTaskStatHook (void)
{
}
/********************************************************************************************************
* TICK HOOK
*
* Description: This function is called every tick.
*
* Arguments : none
*
* Note(s) : 1) Interrupts may or may not be ENABLED during this call.
********************************************************************************************************/
void OSTimeTickHook (void)
{
}
#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.
********************************************************************************************************/
void OSTCBInitHook (OS_TCB *ptcb)
{
ptcb = ptcb; // Prevent compiler warning
// (void)ptcb; // Prevent Compiler warning
}
/********************************************************************************************************
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.
********************************************************************************************************/
void OSTaskIdleHook (void)
{
}
/********************************************************************************************************
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.
********************************************************************************************************/
void OSInitHookBegin (void)
{
}
/********************************************************************************************************
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.
********************************************************************************************************/
void OSInitHookEnd (void)
{
}
/********************************************************************************************************
INTERRUPT DISABLE TIME MEASUREMENT, START
********************************************************************************************************/
/*
void OS_CPU_IntDisMeasInit (void)
{
OS_CPU_IntDisMeasNestingCtr = 0;
OS_CPU_IntDisMeasCntsEnter = 0;
OS_CPU_IntDisMeasCntsExit = 0;
OS_CPU_IntDisMeasCntsMax = 0;
OS_CPU_IntDisMeasCntsDelta = 0;
OS_CPU_IntDisMeasCntsOvrhd = 0;
OS_CPU_IntDisMeasStart(); // Measure the overhead of the functions
OS_CPU_IntDisMeasStop();
OS_CPU_IntDisMeasCntsOvrhd = OS_CPU_IntDisMeasCntsDelta;
}
void OS_CPU_IntDisMeasStart (void)
{
OS_CPU_IntDisMeasNestingCtr++;
if (OS_CPU_IntDisMeasNestingCtr == 1) { // Only measure at the first nested level
OS_CPU_IntDisMeasCntsEnter = OS_CPU_IntDisMeasTmrRd();
}
}
void OS_CPU_IntDisMeasStop (void)
{
OS_CPU_IntDisMeasNestingCtr--; // Decrement nesting ctr
if (OS_CPU_IntDisMeasNestingCtr == 0) {
OS_CPU_IntDisMeasCntsExit = OS_CPU_IntDisMeasTmrRd();
OS_CPU_IntDisMeasCntsDelta = OS_CPU_IntDisMeasCntsExit - OS_CPU_IntDisMeasCntsEnter;
if (OS_CPU_IntDisMeasCntsDelta > OS_CPU_IntDisMeasCntsOvrhd) { // Ensure overhead < delta
OS_CPU_IntDisMeasCntsDelta -= OS_CPU_IntDisMeasCntsOvrhd;
}
else {
OS_CPU_IntDisMeasCntsDelta = OS_CPU_IntDisMeasCntsOvrhd;
}
if (OS_CPU_IntDisMeasCntsDelta > OS_CPU_IntDisMeasCntsMax) { // Track MAXIMUM
OS_CPU_IntDisMeasCntsMax = OS_CPU_IntDisMeasCntsDelta;
}
}
}
*/
/*
#if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
OS_CPU_SR OS_CPU_ICR_Save(void)
{
cpu_sr = EIC->ICR;
EIC->ICR = 3;
return cpu_sr;
}
void OS_CPU_ICR_Restore(OS_CPU_SR cpu_sr)
{
EIC->ICR = cpu_sr;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -