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) { } } }