Jump to content

    

Работа с FPU ARM1176

Собственно проблема с портированием uCOS II на ARM1176, а именно с FPU

отталкивался от порта Порт от Micrium for the ARM1176JZ(F)-S Processor Использую IAR.

 

Проблема в том что в вышеописаном порте отсутсвует работа с FPU как таковая.

Пробывал брать с другого порта uCOS работу с ФПУ, но похоже что-то забываю.

Делал так:

1. дописываю в os_cpu_a.s:

        EXPORT OS_CPU_FP_Restore
OS_CPU_FP_Restore
        FLDMIAS R0!, {S0-S31}        ; Restore the VFP registers from pblk
        BX      LR                ; Return to calling function


        EXPORT OS_CPU_FP_Save
OS_CPU_FP_Save

        FSTMIAS R0!, {S0-S31}        ; Save the VFP registers in pblk      
        BX      LR                ; Return to calling function

 

2. в добавляю os_cpu_c.c

 

void  OSTaskCreateHook (OS_TCB *ptcb)
{
#if OS_CPU_FPU_EN > 0
    INT8U  err;
    void  *pblk=(void*)1;
#endif


#if OS_CPU_FPU_EN > 0
    if (ptcb->OSTCBOpt & OS_TASK_OPT_SAVE_FP) {  
        pblk = malloc(33*4);
        if (pblk != (void *)0) {
            ptcb->OSTCBExtPtr = pblk;
            OS_CPU_FP_Save(pblk);    
        }
    }
#endif

void  OSTaskDelHook (OS_TCB *ptcb)
[code]{
#if OS_CPU_FPU_EN > 0
    if (ptcb->OSTCBOpt & OS_TASK_OPT_SAVE_FP) {            /* See if task had FP support               */
        if (ptcb->OSTCBExtPtr != (void *)0) {              /* Yes, OSTCBExtPtr must not be NULL        */
            free(ptcb->OSTCBExtPtr);//OSMemPut(OSFPPartPtr, ptcb->OSTCBExtPtr);      /*      Return memory block to free pool    */
        }
    }
#endif

void  OSTaskSwHook (void)
{
#if OS_CPU_FPU_EN > 0
    void  *pblk;
#endif

#if OS_CPU_FPU_EN > 0                                      
    
    if (OSRunning == OS_TRUE) {                                  
        if (OSTCBCur->OSTCBOpt & OS_TASK_OPT_SAVE_FP) {          
            pblk = OSTCBCur->OSTCBExtPtr;            
            if (pblk != (void *)0) {                                  
                OS_CPU_FP_Save(pblk);                
            }
        }
    }
                                                
    if (OSTCBHighRdy->OSTCBOpt & OS_TASK_OPT_SAVE_FP) {
        pblk = OSTCBHighRdy->OSTCBExtPtr;                
        if (pblk != (void *)0) {                        
            OS_CPU_FP_Restore(pblk);                                
        }
    }
#endif

 

но помоему чтото забыл... так как даже простое:

 

com_print("%lf\n", 0.1234);

вызваное в любой задаче выводит: 0,00000

 

зато есл вызвать это же перед инициализацией оси:

int main(){
uart_init();
com_print("%lf\n", 0.1234);
...
...
}

все работает шикарно...

 

Может будут у кого какие идеи, или способы решения данной проблемы, посоветуйте - подскажите.

Очень надо.

заранее спс

Edited by Devnir

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this