打印
[电路设计]

寄存器按位优化 - 让大叔的红杏再出一次墙(最新版在31楼)

[复制链接]
楼主: X-Hawk
手机看帖
扫描二维码
随时随地手机跟帖
21
X-Hawk|  楼主 | 2011-5-2 09:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
本帖最后由 hotpower 于 2011-5-13 00:39 编辑
这次很好!
在任何优化级别都行吗?
hotpower 发表于 2011-5-2 07:13


回菜农老师,
编译器优化级别,全部设定在 O2或O2级别以上。

使用特权

评论回复
22
X-Hawk|  楼主 | 2011-5-2 11:13 | 只看该作者
本帖最后由 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

使用特权

评论回复
23
hotpower| | 2011-5-2 18:24 | 只看该作者
很优化了,等老师来评述,俺是晕了……

使用特权

评论回复
24
X-Hawk|  楼主 | 2011-5-5 01:42 | 只看该作者
本帖最后由 hotpower 于 2011-5-13 00:38 编辑

整理了下代码,发布新的版本,新增对gcc的支持。
寄存器的写法不变。

需要的优化环境:
Keil 4.10: -O3 + Optimize for Time
IAR 6: High, blanced

gcc: -O3
NuMicro_Reg_2011_05_05.zip (66.47 KB)

使用特权

评论回复
25
hotpower| | 2011-5-5 09:07 | 只看该作者
欢迎大家试用!

使用特权

评论回复
26
X-Hawk|  楼主 | 2011-5-5 09:14 | 只看该作者
本帖最后由 hotpower 于 2011-5-13 00:40 编辑

为什么我每个贴,都会打上牛卧堂的标签呢?
哈哈,非常好!
:D真不是我故意的。。

使用特权

评论回复
27
hotpower| | 2011-5-5 09:56 | 只看该作者
哈哈,是菜农人为的。

使用特权

评论回复
28
X-Hawk|  楼主 | 2011-5-5 09:59 | 只看该作者
本帖最后由 hotpower 于 2011-5-13 00:38 编辑
哈哈,是菜农人为的。
hotpower 发表于 2011-5-5 09:56


大叔是好大叔!

使用特权

评论回复
29
hotpower| | 2011-5-5 10:05 | 只看该作者
酒鬼不知积分多少?
积分够了即可做签名。
发贴自动跟随签名。

新唐的围脖黄先生很感兴趣,他自己也做围脖了,可以被人抢注了。

所以酒鬼抢注nuvoton是有功的

使用特权

评论回复
30
X-Hawk|  楼主 | 2011-5-12 14:09 | 只看该作者
本帖最后由 hotpower 于 2011-5-13 00:37 编辑

可以搞。。先弄个文字前面,呵呵。


使用特权

评论回复
31
X-Hawk|  楼主 | 2011-5-12 14:12 | 只看该作者
本帖最后由 X-Hawk 于 2011-5-14 23:00 编辑

学习李老师的办法,将gcc下宏定义改为变量。
这样gcc的程序在调试时,也能感应到变量内容了。

#define USBs        (*((usb_t *)    0x40060000))
改为
extern usb_t       USBs;
__asm__ (".global USBs    \n.weak USBs   \n,set USBs,        0x40060000");
更新版头文件下载(NUC100和M051系列):
NuMicro_Reg_2011_05_14.zip (43.52 KB)

使用特权

评论回复
32
Swallow_0322| | 2011-5-12 14:22 | 只看该作者
决对得顶起!:P

使用特权

评论回复
33
zxs2000| | 2011-5-12 15:38 | 只看该作者
学习

使用特权

评论回复
34
hotpower| | 2011-5-13 00:37 | 只看该作者
谢谢酒鬼!!!

**是不会忘记你的~~

使用特权

评论回复
35
gyh974| | 2011-5-24 15:46 | 只看该作者
我顶,这么好的**和思路,值得领会

使用特权

评论回复
36
meepo| | 2011-5-26 16:24 | 只看该作者
学习了

使用特权

评论回复
37
123jj| | 2011-6-5 12:46 | 只看该作者
哈哈,支持菜农


使用特权

评论回复
38
123jj| | 2011-6-5 12:48 | 只看该作者

使用特权

评论回复
39
123jj| | 2011-6-5 12:49 | 只看该作者

使用特权

评论回复
40
hotpower| | 2011-6-24 23:58 | 只看该作者
再顶起来~~~

老师说酒鬼搞的不错~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则