新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2016-3-3
- 在线时间
- 19 小时
|
最近一遇到一个STM32,4byte字写入的问题:
要写一个数据读取的函数,将一个4byte位宽的FIFO的缓冲区的数据读写到一段由一个8bit uchar型指针变量指向的RAM空间数组中,而读取函数要求根据写入字节byte长度和写入起始字节byte偏移量来两个参数值来将FIFO缓冲区读到的数据写入到变量指定的以字节byte为单位的RAM空间中,导致写入RAM空间地址不一定对齐4byte字地址且写入长度又不一定为4byte字的整倍数,那么,编程要怎样才能最高效地作非4byte字对齐的转存操作呢?
这个数据读取的函数声明格式为:"u8 Rfun(u8 *Darr_u8P,u32 offset,u32 RdataL)"
u8* Darr_u8P为要写入RAM空间数组的指针输入。
u32 offset为写入的byte字节偏移量输入。
u32 RdataL为要写入的字节byte长度。
我初时使用一个u32型指针来实现整4byte的读存:
u32 * Darr_u32P=(u32 *)(Darr_u8P+offset);
while(RdataL>=4)
{
*(Darr_u32P++)= XFIFO; //XFIFO为FIFO缓冲区的读取寄存器,u32类型。
RdataL-=4;
}
但当Darr_u32P得到的地址值不是4byte字对齐地址时,就会触发硬件错误中断Hard Fault。
而是当Darr_u32P得到的地址值不是4byte字对齐地址时,我就只能使用一个u32型临时变量Utemp 来转存了:
union {u32 bit32; u8 bit8[4];} Utemp;
Darr_u8P+=offset;
while(RdataL>=4)
{
Utemp.bit32 = XFIFO; //XFIFO为FIFO缓冲区的读取寄存器,u32类型。
*(Darr_u8P++)=Utemp.bit8[0];
*(Darr_u8P++)=Utemp.bit8[1];
*(Darr_u8P++)=Utemp.bit8[2];
*(Darr_u8P++)=Utemp.bit8[3];
RdataL-=4;
}
这样虽然不触发硬件错误中断Hard Fault了,但这样是一个32bit MCU在用8bit MCU的方式来转存数据,效率就变低了,那么有哪位大神有更好的办法来实现非4byte字地址对齐的4byte字RAM写入呢?
|
|