Example #1
0
double approx_exp(double power)
{
	u8 i;
	u32 int_part;
	double frac_part;
	
	double xn=1;
	double result=0;
	
	int_part=(u32)power;
	frac_part=power -(double)int_part;
	
	
	if(int_part>512)	UsageFault_Handler();
	
	//take taylor series x=0
	for(i=0;i<EXP_ITERATION;i++)
	{
		result+=xn*_invfac_table[i];
		xn=xn*frac_part;
	}
	//end take taylor series
	
	//get from table
	for(i=0;i<10;i++)
	{
		if(int_part&((u32)1<<i))
		{
			result*=_exp_square_table[i];
		}
	}
	//end get from table
	
	return result;
}
uint8 StackFloatPop(TSTACKFLOAT *s,float *value)
{
	if(!StackFloatIsEmpty(s))
	{
		*value=s->value[s->top];
		s->top--;
		return 1;
	}
  UsageFault_Handler();//debug
  return 0;
}
uint8 StackU8Pop(TSTACKU8 *s,uint8 *value)
{
	if(!StackU8IsEmpty(s))
	{
		*value=s->value[s->top];
		s->top--;
		return 1;
	}
  UsageFault_Handler();//debug
  return 0;
}
__attribute__((externally_visible)) void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
{
    /* These are volatile to try and prevent the compiler/linker optimising them
    away as the variables never actually get used.  If the debugger won't show the
    values of the variables, make them global my moving their declaration outside
    of this function. */
    volatile uint32_t r0;
    volatile uint32_t r1;
    volatile uint32_t r2;
    volatile uint32_t r3;
    volatile uint32_t r12;
    volatile uint32_t lr; /* Link register. */
    volatile uint32_t pc; /* Program counter. */
    volatile uint32_t psr;/* Program status register. */

    r0 = pulFaultStackAddress[ 0 ];
    r1 = pulFaultStackAddress[ 1 ];
    r2 = pulFaultStackAddress[ 2 ];
    r3 = pulFaultStackAddress[ 3 ];

    r12 = pulFaultStackAddress[ 4 ];
    lr = pulFaultStackAddress[ 5 ];
    pc = pulFaultStackAddress[ 6 ];
    psr = pulFaultStackAddress[ 7 ];

    /* Silence "variable set but not used" error */
    if (false) {
      (void)r0; (void)r1; (void)r2; (void)r3; (void)r12; (void)lr; (void)pc; (void)psr;
    }

    if (SCB->CFSR & (1<<25) /* DIVBYZERO */) {
        // stay consistent with the core and cause 5 flashes
        UsageFault_Handler();
    }
    else {
    PANIC(HardFault,"HardFault");

    /* Go to infinite loop when Hard Fault exception occurs */
    while (1)
    {
    }
}
}