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

[复制链接]
16886|55
 楼主| X-Hawk 发表于 2011-5-2 09:46 | 显示全部楼层
本帖最后由 hotpower 于 2011-5-13 00:39 编辑
这次很好!
在任何优化级别都行吗?
hotpower 发表于 2011-5-2 07:13


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

 楼主| X-Hawk 发表于 2011-5-2 11:13 | 显示全部楼层
本帖最后由 hotpower 于 2011-5-4 21:10 编辑

继续毫无节制的现宝。。。

昨天看Lee老师的写法,用流的方式复制,大受启发。
  1. uart0_baud << clear
  2. << setbit<NU_UART_BAUD_t>(NU_UART_BAUD_t::BIT_DIV_X_EN)
  3. << setbit<NU_UART_BAUD_t>(NU_UART_BAUD_t::BIT_DIV_X_ONE)
  4. << apply;
于是想到换个形式:
  1. UART0s.UA_BAUD()
  2.     .DIV_X_EN(1)
  3.     .DIV_X_ONE(1);
酒鬼只是给换个碗装,汤药还是Lee老师的汤药。

这个形式的编译效果,相当于以下伪代码
  1.   unsigned int v = UART0s.UA_BAUD;
  2.   v |= BIT_DIV_X_EN | BIT_DIV_X_ONE;
  3.   UART0s.UA_BAUD = v;
共6条asm指令。

或者,另一个形式,UA_BAUD先赋个初值0的
  1. UART0s.UA_BAUD(0)
  2.     .DIV_X_EN(1)
  3.     .DIV_X_ONE(1);
这个形式的编译效果,相当于以下伪代码
  1.   unsigned int v;
  2.   v = BIT_DIV_X_EN | BIT_DIV_X_ONE;
  3.   UART0s.UA_BAUD = v;
少一次读取动作,共4条asm指令。



这个新的代码方式,实现了按语句优化。
在这个连续的函数调用语句内,
只读/写寄存器一次,中间多次对位赋值,都可以实现完全的优化。

如果要实现1楼的赋值功能(13条指令):
  1. UART0s.UA_FSR.b.BIF = 1;
  2. UART0s.UA_FSR.b.FEF = 1;
  3. UART0s.UA_FSR.b.PEF = 1;
只需要写
  1. UART0s.UA_FSR()
  2.     .BIF(1)
  3.     .FEF(1)
  4.     .PEF(1);
编译出来共计5条asm指令。

效果和19楼的写法二、写法三一样,但是更简洁、更不容易写错。


注:
1. 支持上述功能,需要c++, 并用新的头文件。
2. 编译器需要开优化,测试的优化级别
     Keil 4.10: -O3 + Optimize for Time
     IAR 6: High, blanced

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-5-2 18: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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-5-5 09:07 | 显示全部楼层
欢迎大家试用!
 楼主| X-Hawk 发表于 2011-5-5 09:14 | 显示全部楼层
本帖最后由 hotpower 于 2011-5-13 00:40 编辑

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

hotpower 发表于 2011-5-5 09:56 | 显示全部楼层
哈哈,是菜农人为的。
 楼主| X-Hawk 发表于 2011-5-5 09:59 | 显示全部楼层
本帖最后由 hotpower 于 2011-5-13 00:38 编辑
哈哈,是菜农人为的。
hotpower 发表于 2011-5-5 09:56


大叔是好大叔!

hotpower 发表于 2011-5-5 10:05 | 显示全部楼层
酒鬼不知积分多少?
积分够了即可做签名。
发贴自动跟随签名。

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

所以酒鬼抢注nuvoton是有功的
 楼主| X-Hawk 发表于 2011-5-12 14:09 | 显示全部楼层
本帖最后由 hotpower 于 2011-5-13 00:37 编辑

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


 楼主| X-Hawk 发表于 2011-5-12 14:12 | 显示全部楼层
本帖最后由 X-Hawk 于 2011-5-14 23:00 编辑

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

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
Swallow_0322 发表于 2011-5-12 14:22 | 显示全部楼层
决对得顶起!:P
zxs2000 发表于 2011-5-12 15:38 | 显示全部楼层
hotpower 发表于 2011-5-13 00:37 | 显示全部楼层
谢谢酒鬼!!!

**是不会忘记你的~~

gyh974 发表于 2011-5-24 15:46 | 显示全部楼层
我顶,这么好的**和思路,值得领会
meepo 发表于 2011-5-26 16:24 | 显示全部楼层
学习了
123jj 发表于 2011-6-5 12:46 | 显示全部楼层
哈哈,支持菜农


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
123jj 发表于 2011-6-5 12:48 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
123jj 发表于 2011-6-5 12:49 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-6-24 23:58 | 显示全部楼层
再顶起来~~~

老师说酒鬼搞的不错~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部