本帖最后由 hotpower 于 2011-5-4 21:10 编辑
继续毫无节制的现宝。。。
昨天看Lee老师的写法,用流的方式复制,大受启发。uart0_baud << clear
<< setbit<NU_UART_BAUD_t>(NU_UART_BAUD_t::BIT_DIV_X_EN)
<< setbit<NU_UART_BAUD_t>(NU_UART_BAUD_t::BIT_DIV_X_ONE)
<< apply;
于是想到换个形式:UART0s.UA_BAUD()
.DIV_X_EN(1)
.DIV_X_ONE(1);
酒鬼只是给换个碗装,汤药还是Lee老师的汤药。
这个形式的编译效果,相当于以下伪代码 unsigned int v = UART0s.UA_BAUD;
v |= BIT_DIV_X_EN | BIT_DIV_X_ONE;
UART0s.UA_BAUD = v;
共6条asm指令。
或者,另一个形式,UA_BAUD先赋个初值0的UART0s.UA_BAUD(0)
.DIV_X_EN(1)
.DIV_X_ONE(1);
这个形式的编译效果,相当于以下伪代码 unsigned int v;
v = BIT_DIV_X_EN | BIT_DIV_X_ONE;
UART0s.UA_BAUD = v;
少一次读取动作,共4条asm指令。
这个新的代码方式,实现了按语句优化。
在这个连续的函数调用语句内,
只读/写寄存器一次,中间多次对位赋值,都可以实现完全的优化。
如果要实现1楼的赋值功能(13条指令):UART0s.UA_FSR.b.BIF = 1;
UART0s.UA_FSR.b.FEF = 1;
UART0s.UA_FSR.b.PEF = 1;
只需要写UART0s.UA_FSR()
.BIF(1)
.FEF(1)
.PEF(1);
编译出来共计5条asm指令。
效果和19楼的写法二、写法三一样,但是更简洁、更不容易写错。
注:
1. 支持上述功能,需要c++, 并用新的头文件
NuMicro_Reg_new2.zip
(108.68 KB)
。
2. 编译器需要开优化,测试的优化级别
Keil 4.10: -O3 + Optimize for Time
IAR 6: High, blanced
|