论坛大神
  
- 积分
- 2201
- 金钱
- 2201
- 注册时间
- 2012-2-8
- 在线时间
- 35 小时
|
发表于 2013-1-7 18:00:34
|
显示全部楼层
用gcc在 Os 选项下编译了, 然后用 mdk 软件仿真简单测试了下, 用了个大循环, 总共用时从原来的 0.071s 降到了 0.066s, 不过代码从原来的不到 1k 变成了 18k,
如果速度真的那么重要的话 ... ...
以下是部分测试代码供楼主参考, 想自己测试的话需要自己修改部分内容.
extern void (* const fun[])();
void fun2(u8);
int main(){
int i = gpioa; // 禁止编译器优化
for(; i<0xffff; i++)
fun[i&0xff]();
//fun2(i);
while(1);
}
PinRename(pa1,HEAD1_D3);
PinRename(pa2,HEAD1_DTSB);
void fun2(u8 x){
HEAD1_D3=x&0x01; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
HEAD1_D3=(x&0x02)>>1; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
HEAD1_D3=(x&0x04)>>2; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
HEAD1_D3=(x&0x08)>>3; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
HEAD1_D3=(x&0x10)>>4; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
HEAD1_D3=(x&0x20)>>5; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
HEAD1_D3=(x&0x40)>>6; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
HEAD1_D3=(x&0x80)>>7; HEAD1_DTSB.Reset();HEAD1_DTSB.Set();
}
#define fun_impl(hex1,hex2) \
void fun_##hex1##hex2(){ \
constexpr int x = hex1<<8|hex2; \
HEAD1_D3=x&0x01; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
HEAD1_D3=(x&0x02)>>1; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
HEAD1_D3=(x&0x04)>>2; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
HEAD1_D3=(x&0x08)>>3; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
HEAD1_D3=(x&0x10)>>4; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
HEAD1_D3=(x&0x20)>>5; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
HEAD1_D3=(x&0x40)>>6; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
HEAD1_D3=(x&0x80)>>7; HEAD1_DTSB.Reset();HEAD1_DTSB.Set(); \
}
#define fun_impl_group(hex) \
fun_impl(hex, 0x0) \
fun_impl(hex, 0x1) \
fun_impl(hex, 0x2) \
fun_impl(hex, 0x3) \
fun_impl(hex, 0x4) \
fun_impl(hex, 0x5) \
fun_impl(hex, 0x6) \
fun_impl(hex, 0x7) \
fun_impl(hex, 0x8) \
fun_impl(hex, 0x9) \
fun_impl(hex, 0xa) \
fun_impl(hex, 0xb) \
fun_impl(hex, 0xc) \
fun_impl(hex, 0xd) \
fun_impl(hex, 0xe) \
fun_impl(hex, 0xf)
fun_impl_group(0x0)
fun_impl_group(0x1)
fun_impl_group(0x2)
fun_impl_group(0x3)
fun_impl_group(0x4)
fun_impl_group(0x5)
fun_impl_group(0x6)
fun_impl_group(0x7)
fun_impl_group(0x8)
fun_impl_group(0x9)
fun_impl_group(0xa)
fun_impl_group(0xb)
fun_impl_group(0xc)
fun_impl_group(0xd)
fun_impl_group(0xe)
fun_impl_group(0xf)
#define fun_addr(hex1,hex2) &fun_##hex1##hex2
#define fun_addr_group(hex) \
fun_addr(hex,0x0) , \
fun_addr(hex,0x1) , \
fun_addr(hex,0x2) , \
fun_addr(hex,0x3) , \
fun_addr(hex,0x4) , \
fun_addr(hex,0x5) , \
fun_addr(hex,0x6) , \
fun_addr(hex,0x7) , \
fun_addr(hex,0x8) , \
fun_addr(hex,0x9) , \
fun_addr(hex,0xa) , \
fun_addr(hex,0xb) , \
fun_addr(hex,0xc) , \
fun_addr(hex,0xd) , \
fun_addr(hex,0xe) , \
fun_addr(hex,0xf)
void (*const fun[])() =
{
fun_addr_group(0x0)
, fun_addr_group(0x1)
, fun_addr_group(0x2)
, fun_addr_group(0x3)
, fun_addr_group(0x4)
, fun_addr_group(0x5)
, fun_addr_group(0x6)
, fun_addr_group(0x7)
, fun_addr_group(0x8)
, fun_addr_group(0x9)
, fun_addr_group(0xa)
, fun_addr_group(0xb)
, fun_addr_group(0xc)
, fun_addr_group(0xd)
, fun_addr_group(0xe)
, fun_addr_group(0xf)
}; |
|