__asm__ (".byte 0xf3, 0x90") ?

PAUSE指令能提升自旋等待循环的性能,并降低Intel P4处理器在执行此类循环时的耗电量。该指令向处理器提示代码序列是循环等待,从而避免内存顺序违规,提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__asm__ (".byte 0xf3, 0x90") intel的pause指令。

 

研究nginx代码时,同事遇到上面的代码,很是令人费解。google一翻后有了结果。原来这个指令不简单。

 

PAUSE指令提升了自旋等待循环(spin-wait loop)的性能。当执行一个循环等待时,Intel P4或Intel Xeon处理器会因为检测到一个可能的内存顺序违规(memory order violation)而在退出循环时使性能大幅下降。PAUSE指令给处理器提了个醒:这段代码序列是个循环等待。处理器利用这个提示可以避免在大多数情况下的内存顺序违规,这将大幅提升性能。因为这个原因,所以推荐在循环等待中使用PAUSE指令。

 

PAUSE的另一个功能就是降低Intel P4在执行循环等待时的耗电量。Intel P4处理器在循环等待时会执行得非常快,这将导致处理器消耗大量的电力,而在循环中插入一个PAUSE指令会大幅降低处理器的电力消耗。

PAUSE指令虽然是在Intel P4处理器开始出现的,但是它可以向后与所有的IA32处理器兼容。在早期的IA32 CPU中,PAUSE就像NOP指令。Intel P4和Intel Xeon处理器将PAUSE实现成一个预定义的延迟(pre-defined delay)。这种延迟是有限的,而且一些处理器可以为0。PAUSE指令不改变处理器的架构状态(也就是说,它实际上只是执行了一个延迟——并不做任何其他事情——的操作)。

我们与nginx作者差着好远呀!

#include <REGX52.H> #define uint unsigned int #define uchar unsigned char // ???? sbit int1 = P3^3; sbit int2 = P3^4; sbit int3 = P3^5; sbit int4 = P3^6; sbit int01 = P0^3; sbit int02 = P0^4; sbit int03 = P0^5; sbit int04 = P0^6; sbit out1 = P0^0; // ????????? sbit out2 = P0^1; // ????????? sbit tcrt5000 = P0^2; // TCRT5000??????? sbit clk = P2^2; // TM1637 CLK?? sbit dio = P2^3; // TM1637 DIO?? // ?????? uint count = 0; // ?????? uint last_state = 0; // ???TCRT5000??? uint speed = 0; // ???? uchar display_data[4] = {0, 0, 0, 0}; // ??????? // ?????? void stop(); void back(); void forward(); void right(); void left(); // ?????? void obstacle_avoidance(); // ???? void delayms(uint xms); // TM1637??????? void TM1637_init(); void TM1637_send_start(); void TM1637_send_stop(); void TM1637_write_byte(uchar data); void TM1637_display(uchar addr, uchar dat[]); void TM1637_clear(); // ??? void main() { uint wheel_diameter = 5; // ????(??:cm) uint time_interval = 1000; // ????(??:ms) TMOD = 0x20; // ??????? TH1 = 0xFD; // ????? TL1 = 0xFD; TR1 = 1; // ????? REN = 1; // ???? SM0 = 0; // 8?UART?? SM1 = 1; EA = 1; // ????? ES = 1; // ?????? TM1637_init(); // ?????? while (1) { if (tcrt5000 != last_state) // ???TCRT5000???? { count++; // ?????1 last_state = tcrt5000; // ???? } if (RI == 1) // ????????? { uchar i = SBUF; // ??????????? RI = 0; // ??????? switch (i) { case &#39;1&#39;: forward(); break; // ?? case &#39;2&#39;: back(); break; // ?? case &#39;3&#39;: left(); break; // ?? case &#39;4&#39;: right(); break; // ?? case &#39;5&#39;: stop(); break; // ??????? case &#39;6&#39;: while (1) // ???????? { obstacle_avoidance(); if (RI == 1) // ????????,??????? { i = SBUF; RI = 0; break; } } break; } } delayms(time_interval); // ?????? speed = (count * wheel_diameter * 3.14) / time_interval; // ????(??:cm/s) count = 0; // ????? // ????????????? display_data[0] = speed / 1000 + 0x3F; // ?? display_data[1] = (speed % 1000) / 100 + 0x3F; // ?? display_data[2] = (speed % 100) / 10 + 0x3F; // ?? display_data[3] = speed % 10 + 0x3F; // ?? TM1637_display(0, display_data); // ???? } } // ?????? void stop() { int1 = 0; int2 = 0; int3 = 0; int4 = 0; int01 = 0; int02 = 0; int03 = 0; int04 = 0; } void back() { int1 = 1; int2 = 0; int3 = 1; int4 = 0; int01 = 1; int02 = 0; int03 = 1; int04 = 0; } void forward() { int1 = 0; int2 = 1; int3 = 0; int4 = 1; int01 = 0; int02 = 1; int03 = 0; int04 = 1; } void right() { int1 = 0; int2 = 1; int3 = 1; int4 = 0; int01 = 0; int02 = 1; int03 = 1; int04 = 0; P1 = 0x0f; delayms(400); P1 = 0xff; delayms(400); } void left() { int1 = 1; int2 = 0; int3 = 0; int4 = 1; int01 = 1; int02 = 0; int03 = 0; int04 = 1; P1 = 0xf0; delayms(400); P1 = 0xff; delayms(400); } // ?????? void obstacle_avoidance() { if (out2 == 0) // ??????????,???? { left(); } else if (out1 == 0) // ??????????,???? { right(); } else if (out1 == 1 && out2 == 1) // ??????????,???? { forward(); } else if (out1 == 0 && out2 == 0) // ?????????,???? { back(); } } // ???? void delayms(uint xms) { uint i, j; for (i = xms; i > 0; i--) // ?????? for (j = 110; j > 0; j--); } // TM1637??????? void TM1637_init() { TM1637_send_start(); TM1637_write_byte(0x40); // ????????? TM1637_send_stop(); TM1637_send_start(); TM1637_write_byte(0xC0); // ??????????? TM1637_send_stop(); } void TM1637_send_start() { clk = 1; dio = 1; dio = 0; clk = 0; } void TM1637_send_stop() { clk = 0; dio = 0; clk = 1; dio = 1; } void TM1637_write_byte(uchar data) { uchar i; for (i = 0; i < 8; i++) { clk = 0; if (data & 0x01) dio = 1; else dio = 0; data >>= 1; clk = 1; } clk = 0; dio = 1; clk = 1; } void TM1637_display(uchar addr, uchar dat[]) { uchar i; TM1637_send_start(); TM1637_write_byte(addr | 0xC0); // ???? TM1637_send_stop(); TM1637_send_start(); TM1637_write_byte(0x40); // ?????? TM1637_send_stop(); for (i = 0; i < 4; i++) { TM1637_send_start(); TM1637_write_byte(dat[i]); // ?????? TM1637_send_stop(); } } void TM1637_clear() { uchar i; for (i = 0; i < 4; i++) display_data[i] = 0x00; TM1637_display(0, display_data); }代码有以下报错 小车基本控制.c(45): error C141: syntax error near &#39;)&#39;, expected &#39;<id>&#39; 小车基本控制.c(243): error C141: syntax error near &#39;)&#39;, expected &#39;<id>&#39; 小车基本控制.c(249): error C141: syntax error near &#39;data&#39;, expected &#39;sizeof&#39; 小车基本控制.c(253): error C141: syntax error near &#39;data&#39;, expected &#39;__asm&#39;
05-26
模块1 Rebuild started: Project: 仓库粉尘检测与安全控制系统的设计A Rebuild target &#39;Target 1&#39; assembling STARTUP.A51... compiling delay.c... compiling ds1302.c... compiling dust_sensor.c... ..\sources\dust_sensor.c(36): error C141: syntax error near &#39;unsigned&#39;, expected &#39;__asm&#39; ..\sources\dust_sensor.c(36): error C202: &#39;end_time&#39;: undefined identifier ..\sources\dust_sensor.c(37): error C141: syntax error near &#39;unsigned&#39;, expected &#39;__asm&#39; ..\sources\dust_sensor.c(37): error C202: &#39;duration&#39;: undefined identifier ..\sources\dust_sensor.c(39): error C202: &#39;duration&#39;: undefined identifier ..\sources\dust_sensor.c(40): error C202: &#39;duration&#39;: undefined identifier compiling oled12864.c... compiling mainA.C... ..\sources\mainA.C(16): error C129: missing &#39;;&#39; before &#39;current_time&#39; Target not created. Build Time Elapsed: 00:00:01 模块2 Rebuild started: Project: 仓库粉尘检测与安全控制系统的设计B Rebuild target &#39;Target 1&#39; assembling STARTUP.A51... compiling delay.c... compiling iic.c... compiling key.c... compiling mainB.c... ..\sources\mainB.c(53): warning C206: &#39;delay_ms&#39;: missing function-prototype ..\sources\mainB.c(53): error C267: &#39;delay_ms&#39;: requires ANSI-style prototype compiling pcf8591.c... compiling motor_control.c... ..\sources\motor_control.c(3): warning C318: can&#39;t open file &#39;i2c.h&#39; ..\sources\motor_control.c(10): warning C206: &#39;PCF8591_WriteDAC&#39;: missing function-prototype ..\sources\motor_control.c(10): error C267: &#39;PCF8591_WriteDAC&#39;: requires ANSI-style prototype Target not created. Build Time Elapsed: 00:00:01
06-16
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值