本帖最后由 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++, 并用新的头文件。
2. 编译器需要开优化,测试的优化级别
Keil 4.10: -O3 + Optimize for Time
IAR 6: High, blanced
|