2014年11月14日 星期五

作業系統之前的程式 for stm32f4discovery (10.2) - 印出浮點數, 使用硬體浮點運算器

為什麼這篇 [作業系統之前的程式 for stm32f4discovery (10) - 印出浮點數] 要用軟體浮點運算函式庫而不用硬體呢?

A: 因為我那時候還不會用, 不過現在我會了, 趕緊來介紹使用硬體浮點運算器的版本。

我當時以為只要使用 -mfloat-abi=hard 來編譯程式就可以, 不過還需要設定浮點運算 coprocessor 的暫存器, L491, L492 就是在做這樣的事情。

L490 是 arm 的官方連結。

float_hard.cpp
486 
487 void WinMain()
488 {
489   // enable vfp
490   // ref: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439d/BEHBJHIG.html
491   u32 CPACR_REG_ADDR = 0xE000ED88;
492   *(volatile u32*)CPACR_REG_ADDR = ((3UL << 10*2)|(3UL << 11*2));
493 
494   //SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
495 
496   init_usart(9600);
497   //init_command();
498 
499   ur_puts(USART2, "Init complete! Hello World!\r\n");
500   float f=3.275;
501   myprint("\r\nabc\r\n");
502   myprint_float(f);
503   myprint("\r\nend\r\n");
504 
505   while(1)
506   {
507   }
508 }

下面兩個反組譯的程式碼列出其中的不同。

float.dis
 934 080007d8 <WinMain>:
 935  80007d8: b580       push {r7, lr}
 936  80007da: b082       sub sp, #8
 937  80007dc: af00       add r7, sp, #0
 938  80007de: f44f 5016  mov.w r0, #9600 ; 0x2580
 939  80007e2: f7ff ff31  bl 8000648 <_Z10init_usartm>
 940  80007e6: 4808       ldr r0, [pc, #32] ; (8000808 <WinMain+0x30>)
 941  80007e8: 4908       ldr r1, [pc, #32] ; (800080c <WinMain+0x34>)
 942  80007ea: f7ff ff83  bl 80006f4 <_Z7ur_putsP13USART_TypeDefPKc>
 943  80007ee: 4b08       ldr r3, [pc, #32] ; (8000810 <WinMain+0x38>)
 944  80007f0: 607b       str r3, [r7, #4]
 945  80007f2: 4808       ldr r0, [pc, #32] ; (8000814 <WinMain+0x3c>)
 946  80007f4: f000 f99c  bl 8000b30 <_Z7myprintPKc>
 947  80007f8: 6878       ldr r0, [r7, #4]
 948  80007fa: f000 f9c3  bl 8000b84 <_Z13myprint_floatf>
 949  80007fe: 4806       ldr r0, [pc, #24] ; (8000818 <WinMain+0x40>)
 950  8000800: f000 f996  bl 8000b30 <_Z7myprintPKc>
 951  8000804: e7fe       b.n 8000804 <WinMain+0x2c>
 952  8000806: bf00       nop
 953  8000808: 40004400  .word 0x40004400
 954  800080c: 080011c8  .word 0x080011c8
 955  8000810: 4051999a  .word 0x4051999a
 956  8000814: 080011e8  .word 0x080011e8
 957  8000818: 080011f0  .word 0x080011f0
 958 

硬體的版本使用了 vldr 這類指令。

float_hard.dis
   1 
 934 080007d8 <WinMain>:
 935  80007d8: b580       push {r7, lr}
 936  80007da: b082       sub sp, #8
 937  80007dc: af00       add r7, sp, #0
 938  80007de: 4b0d       ldr r3, [pc, #52] ; (8000814 <WinMain+0x3c>)
 939  80007e0: 607b       str r3, [r7, #4]
 940  80007e2: 687b       ldr r3, [r7, #4]
 941  80007e4: f44f 0270  mov.w r2, #15728640 ; 0xf00000
 942  80007e8: 601a       str r2, [r3, #0]
 943  80007ea: f44f 5016  mov.w r0, #9600 ; 0x2580
 944  80007ee: f7ff ff2b  bl 8000648 <_Z10init_usartm>
 945  80007f2: 4809       ldr r0, [pc, #36] ; (8000818 <WinMain+0x40>)
 946  80007f4: 4909       ldr r1, [pc, #36] ; (800081c <WinMain+0x44>)
 947  80007f6: f7ff ff7d  bl 80006f4 <_Z7ur_putsP13USART_TypeDefPKc>
 948  80007fa: 4b09       ldr r3, [pc, #36] ; (8000820 <WinMain+0x48>)
 949  80007fc: 603b       str r3, [r7, #0]
 950  80007fe: 4809       ldr r0, [pc, #36] ; (8000824 <WinMain+0x4c>)
 951  8000800: f000 f9a6  bl 8000b50 <_Z7myprintPKc>
 952  8000804: ed97 0a00  vldr s0, [r7]
 953  8000808: f000 f9cc  bl 8000ba4 <_Z13myprint_floatf>
 954  800080c: 4806       ldr r0, [pc, #24] ; (8000828 <WinMain+0x50>)
 955  800080e: f000 f99f  bl 8000b50 <_Z7myprintPKc>
 956  8000812: e7fe       b.n 8000812 <WinMain+0x3a>
 957  8000814: e000ed88  .word 0xe000ed88
 958  8000818: 40004400  .word 0x40004400
 959  800081c: 08000bf8  .word 0x08000bf8
 960  8000820: 4051999a  .word 0x4051999a
 961  8000824: 08000c18  .word 0x08000c18
 962  8000828: 08000c20  .word 0x08000c20
 963 

toolchain version
descent@debianlinux:float$ arm-none-eabi-g++ --version
arm-none-eabi-g++ (GCC) 4.9.1
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

stm32f4discovery 在 minicom 上的執行畫面:
Init complete! Hello World!
abc
3.27500
end

source code:
https://github.com/descent/stm32f4_prog/tree/master/float

ref: ARM Cortex-M4嵌入式实战开发精解:基于STM32F4 chapter 6

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。