отталкивался от порта Порт от 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
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
{
#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
[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
{
#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);
...
...
}
uart_init();
com_print("%lf\n", 0.1234);
...
...
}
все работает шикарно...
Может будут у кого какие идеи, или способы решения данной проблемы, посоветуйте - подскажите.
Очень надо.
заранее спс