реклама на сайте
подробности

 
 
> Работа с FPU ARM1176
Devnir
сообщение Nov 17 2010, 12:55
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 16-11-10
Пользователь №: 60 924



Собственно проблема с портированием 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);
...
...
}

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

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

Сообщение отредактировал Devnir - Nov 17 2010, 12:58
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Devnir   Работа с FPU ARM1176   Nov 17 2010, 12:55


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 10:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016