2016-11-20 2 views
4

に科学的表記法を使用することはできません私は、モジュール(4.8.1)カーネルを書き込むしようとしていた、と私はは、なぜあなたはカーネル

if (hrtimer_cancel(&hr_timer) == 1) { 
     u64 remaining = ktime_to_ns(hrtimer_get_remaining(&hr_timer)); 
     printk("(%llu ns; %llu us)\n", remaining, 
     (unsigned long long) (remaining/1e3)); 
} 

を使用する場合には、

error: SSE register return with SSE disabled 
    printk("\t\t(%llu ns; %llu us)\n", 
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
      remaining, 
      ~~~~~~~~~~ 
      (unsigned long long) (remaining/1e3)); 
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

ながら、このエラーが発生します私が使用すれば

if (hrtimer_cancel(&hr_timer) == 1) { 
     u64 remaining = ktime_to_ns(hrtimer_get_remaining(&hr_timer)); 
     printk("(%llu ns; %llu us)\n", remaining, 
     (unsigned long long) (remaining/1000)); 
} 

問題なく動作します。

なぜ科学的表記をカーネルで使用できないのですか?つまり、1000; 1000000; 1000000000の代わりに1e3; 1e6; 1e9を使用すると、はるかに簡単で読みやすいと思います。

移植性/堅牢性の問題ですか?
など(この場合)

あなたはnsが必要ですか?使用ktime_to_ns
私たちが必要ですか? Use ktime_to_us
msが必要ですか?使用ktime_to_ms

P.S.私は、単純な.Cプログラムで試してみました、それが

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 

void error_handler(const char *msg) 
{ 
    perror(msg); 
    exit(EXIT_FAILURE); 
} 

unsigned long parse_num(const char *number) 
{ 
    unsigned long v; 
    char *p; 
    errno = 0; 

    v = strtoul(number, &p, 10); 

    if (errno != 0 || *p != '\0') 
     error_handler("parse_num | strtoul"); 

    return v; 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "Usage: %s number_greater_than_1000\n", argv[0]); 
     return EXIT_FAILURE; 
    } 

    unsigned long number = parse_num(argv[1]); 

    if (number < 1e3 || number > 1e6) 
    { 
     fprintf(stderr, "Need to be a number in range (%lu, %lu)\n", (unsigned long) 1e3, (unsigned long) 1e6); 
     return EXIT_FAILURE; 
    } 

    printf("Original: %lu\tScaled: %lu\n", number, (unsigned long) (number/1e3)); 

    return EXIT_SUCCESS; 
} 
+6

私は主な問題は表記ではなく、 '1e3'が' double'リテラルであるということです。浮動小数点は通常、時間節約レジスタを節約するためにカーネルでサポートされていません。 – Banex

+1

[SSEレジスタリターンとSSEを無効にする]の可能な複製(http://stackoverflow.com/questions/1556142/sse-register-return-with-sse-disabled) –

答えて

6

1e31000と等価ではないで問題なく動作します。

1000は、intの整数定数です。 1e3doubleの浮動小数点定数で、1000.0に相当します。これにより、remaining/1e3は浮動小数点除算になります。これは、コンパイラが不平を言っていることです。

SSE register return with SSE disabledも参照してください。

関連する問題