📄 armreg.c
字号:
// armReg.c : 模拟 ARM REGISTER
//
/******************************************************************/
#include "include.h"
#include "..\os\Lib\core\core.h"
/******************************************************************/
//extern
void PCCEnterCritical(void);
void PCCExitCritical(void);
/**********************************************************************/
#define RPC_REGISTER_MAX 7
char* RockPCRegRegName[] =
{
"unkwon",
"cpsr",
"spsr",
"pc",
"lp",
"sp",
"sb"
};
/***********************************************************************/
//因为TASK 切换,必须给每个 TASK 定义一组寄存器.
REGISTER RockPCRegReg[OS_LOWEST_PRIO + 6][RPC_REGISTER_MAX] =
{
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 0
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 1
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 2
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 3
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 4
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 5
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 6
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 7
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 8
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 9
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0}, // 10
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0
}, // 11
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0
}, // 12
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0
}, // 13
{
0,
PC_ARMREG_SVC,
PC_ARMREG_SVC,
0,
0,
0,
0
}, // 14
} ;
/**************************************************************/
REGISTER *RockPCRegGetAddrByName(char * creg)
{
INT16U ii ;
for (ii = 1; ii < RPC_REGISTER_MAX ; ii++)
{
if (!stricmp(RockPCRegRegName[ii] , creg))
return &RockPCRegReg[OSPrioCur][ii];
}
TR("ERROR CREG[%s]", creg); //由于 creg 前面存在 %,会进行转义,倒置打印错误
return &RockPCRegReg[OSPrioCur][0];
}
REGISTER RockPcRegRead_Creg(char* creg)
{
REGISTER reg = *RockPCRegGetAddrByName(creg);
if (OSPrioCur != OS_IDLE_PRIO)
return reg;
return PC_ARMREG_SVC;
}
void RockPcRegWrite_Creg(char* creg , REGISTER val)
{
if( OSPrioCur == 3 && val == 0X93 )
{
// TR("Write Reg[%s] Value=0x%x", creg , val);
}
*RockPCRegGetAddrByName(creg) = val ;
}
void RockPcRegBitSet_Creg(char* creg , INT16U bitNum)
{
REGISTER *reg;
reg = RockPCRegGetAddrByName(creg) ;
*reg = (*reg) | (0x0001 << bitNum) ;
}
void RockPcRegBitClear_Creg(char* creg , INT16U bitNum)
{
REGISTER *reg;
// PCCEnterCritical();
reg = RockPCRegGetAddrByName(creg) ;
*reg = (*reg) & (~(0x0001 << bitNum)) ;
// PCCExitCritical();
}
void RockPcRegBitInvert_Creg(char* creg , INT16U bitNum)
{
REGISTER *reg = RockPCRegGetAddrByName(creg) ;
*reg = (*reg) ^((0x0001 << bitNum)) ;
}
//重新打开所有的中断!!
void RockPcRegClearAll(void)
{
INT16U ii ;
for (ii = 0; ii < OS_LOWEST_PRIO + 1 ; ii++)
{
RockPCRegReg[ii][1] = PC_ARMREG_SVC;
}
}
/*--------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -