|
我在接收无线字节时,把收到的字节放到FIFO队列中,最开始发现速率不能超过100K,不然要出错。
我定义的FIFO结构体如下。
struct
{
UINT8 In;
UINT8 Out;
Uint8 Fifo[128];
}RfFifo
在仿真的时候发现产生了很多MOVX指令,而且读写FIFO的函数有48条指令。
cc1110的MOVX指令最快3个周期,最慢可以达到10个周期。
我后来优化了结构体。如下
type struct
{
uint8_t In;
uint8_t Out;
uint8_t __xdata* Fifo;
}RfFifo_t;
uint8_t RxFifoBuf[RF_FIFO_SIZE];
uint8_t TxFifoBuf[RF_FIFO_SIZE];
RfFifo_t __data RfRxFifo = {0,0,RxFifoBuf};
RfFifo_t __data RfTxFifo = {0,0,TxFifoBuf};
static inline bool WtRfFifo(RfFifo_t __data* fifo,uint8_t d)
{
uint8_t temp;
temp = fifo->In;
++temp;
temp &= (RF_FIFO_SIZE-1);
if(temp == fifo->Out)
{
return false;
}
fifo->Fifo[fifo->In] = d;
fifo->In = temp;
return true;
}
static inline bool RdRfFifo(RfFifo_t __data* fifo,uint8_t* d)
{
uint8_t temp;
temp = fifo->Out;
if(fifo->In == temp)
{
return false;
}
*d = fifo->Fifo[temp];
++temp;
temp &= (RF_FIFO_SIZE-1);
fifo->Out = temp;
return true;
}
编译仿真的时候,发现读写FIFO只有34条指令,而且MOVX只有一条。
我的经验是:中断中要表示标志的全局变量,用__data申明,而DataBuf放在__xdata中。任何一次中断,只许操作一次buf。对串口我也采用同样的优化方式。
对于cc1110这样的51内核芯片,每条指令的消耗周期比其它51都要长一点。
CC1110有128B的__data可用,一般可以把64B甚至32B的分配给中断。 |
|