|
发表于 2008-12-29 16:18:07
|
显示全部楼层
顺便奉献一个小技巧,
1. NEC单片机的代码效率和速度不怎么样,动不动就3字节的指令和6周期的速度,写个程序,没写几句就满了,这样不得采用最高优化,但是有些时序怕优化完蛋了,这样很麻烦,但是你可以有选择的处理每个函数。
#ifndef __IAR_OPTIMIZE_H__
#define __IAR_OPTIMIZE_H__
#define OPTIMIZE_SIZE_NONE _Pragma("optimize=z none")
#define OPTIMIZE_SIZE_LOW _Pragma("optimize=z low")
#define OPTIMIZE_SIZE_MEDIUM _Pragma("optimize=z medium")
#define OPTIMIZE_SIZE_HIGH _Pragma("optimize=z high")
#define OPTIMIZE_SPEED_NONE _Pragma("optimize=s none")
#define OPTIMIZE_SPEED_LOW _Pragma("optimize=s low")
#define OPTIMIZE_SPEED_MEDIUM _Pragma("optimize=s medium")
#define OPTIMIZE_SPEED_HIGH _Pragma("optimize=s high")
#endif
假如你不想太高级优化一个函数,可以这样定义函数
OPTIMIZE_SIZE_LOW unsigned char My_fn(void)
{
}
2. 在IAR AVR下,__delay_cycles() 用的不亦乐乎,但是IAR NEC中,想用一个准确的软件延时,的确有点头痛了,我想IAR为什么没有类似__delay_cycles()的函数,可能是NEC的片子跑的太慢了,动不动就6个8个周期, 哈哈,但是不怕,本人手写了一个软件延时的,测试感觉还是比较准的:内部8MHz时钟,分辨率2us, 源代码奉上
//*
//*********************************************************************************************************
//* Function : __delay_2us(unsigned short DL)
//* Describe :
//* OSC = 8.000MHz 软件延时, 理论没有误差, 已经将调用和返回计算在内
//*
//* DL 取值范围 3 - 65535. 分辨率2us, 软件延时范围: 6us - 131070us
//*
//* 例如:
//*
//* 延时10us __delay_2us(5);
//*
//* 延时10000us __delay_2us(5000);
//*
//*--------------------------------------------------------------------------------------------------------
//* Author :
//* Date :
//*--------------------------------------------------------------------------------------------------------
//* Mender :
//* Date :
//* Describe :
//*********************************************************************************************************
//*
void __delay_2us(unsigned short Dl)
{
// DL被AX 传递过来
// MOVW AX,DL // 6T
// CALL __delay_us // 6T
asm("DECW AX"); // 4T -- 2us
asm("DECW AX"); // 4T
asm("NOP"); // 2T
asm("NOP"); // 2T
asm("NOP"); // 2T
//asm("RET"); // 6T --2us
asm("delay_2us: DECW AX"); // 4T
asm("CMPW AX, #0"); // 6T
asm("BNZ delay_2us"); // 6T -- 2us
}
本贴被 GZ_NEC 编辑过,最后修改时间:2008-12-29,16:20:08. |
|