2012-07-16 69 views
1

我想了解如何在使用gcc编译时禁用内核模块的代码优化。 我试着让编译指示这样如何防止内核模块中的gcc优化?

#pragma optimize("",off) 
void rt_ct_use_cpu(unsigned long long n_cicle){ 
    unsigned long long i; 
    for(i=0;i<n_cicle;i++); 
} 
#pragma optimize("",on) 

但是,编译器会发出警告说,它会忽略这些编译指示。我也试图使该避免编译器滚动循环像

void rt_ct_use_cpu(unsigned long long n_cicle){ 
    unsigned long long i; 
    unsigned long long time=0; 
    unsigned long long timebase = rt_get_cpu_time_ns(); 
    for(i=0;i<n_cicle;i++) { 
     time += rt_get_cpu_time_ns(); 
     time -= timebase; 
    } 
} 

但在这种情况下,它并不重要多久是cicle东西(有多大n_cicle)程序将运行总是相同数量的时间(几毫秒)

你能帮我吗?

+0

你能用-O0编译这些文件吗? – Michael 2012-07-16 09:15:50

+1

或者,如果您真正需要忙碌循环,请参阅本页的第7.3.1.1节http://www.makelinux.net/ldd3/chp-7-sect-3。如果您只是想延迟执行一段时间,则在大多数情况下最好使用延迟/休眠功能。 – Michael 2012-07-16 09:32:26

+0

你真棒!使用延迟功能的解决方案非常出色!非常感谢你! – user1528368 2012-07-16 13:08:52

回答

0

你不能或者至少你应该这样做,在Linux内核中。需要至少-O1才能确保内联器和其他必要的优化器运行。例如,某些汇编代码(如setjmp函数)必须内联,否则将无法正确执行。