一个底层驱动函数的解读
2011-05-27 17:02
302 查看
/**************************************************************************
* Description
* Write a byte into some one byte register.
*
* Parameters
* addr : The register's address.
* data : The data.
* Returns
* None.
*
* Return Value List
* void : None.
* Remarks
* None.
**************************************************************************/
inline void HAL_PUT_UINT8(volatile UINT8 *addr, UINT8 data)
{
int shft;
shft = ((UINT32)addr & 0x03) << 3;
*(UINT32 *)((UINT32)addr & ~3UL) = (*(UINT32 *)((UINT32)addr & ~0x03)
& ~(0xFF << shft)) | (data << shft);
}
左移3相当于x8;
addr&0x03相当于对addr除以4取余数(得到一个相当段内偏移的一个值),为什么要对4取余数呢?因为数据在内存中的存放实际上是以4个字节为单位的(有问题),这样可以避免大小端的问题;
addr&~0x03相当于对addr减去了余数,得到一个能被4整除的最大的数,这个数作为地址(相当于段基址),如下图所示:
代码中蓝色的部分是原来的数据,与~(0xFF<<shft)会把原来位置上的一个字节的数清空,然后再跟data<<shft相或,即可将data写入指定的位置。
* Description
* Write a byte into some one byte register.
*
* Parameters
* addr : The register's address.
* data : The data.
* Returns
* None.
*
* Return Value List
* void : None.
* Remarks
* None.
**************************************************************************/
inline void HAL_PUT_UINT8(volatile UINT8 *addr, UINT8 data)
{
int shft;
shft = ((UINT32)addr & 0x03) << 3;
*(UINT32 *)((UINT32)addr & ~3UL) = (*(UINT32 *)((UINT32)addr & ~0x03)
& ~(0xFF << shft)) | (data << shft);
}
左移3相当于x8;
addr&0x03相当于对addr除以4取余数(得到一个相当段内偏移的一个值),为什么要对4取余数呢?因为数据在内存中的存放实际上是以4个字节为单位的(有问题),这样可以避免大小端的问题;
addr&~0x03相当于对addr减去了余数,得到一个能被4整除的最大的数,这个数作为地址(相当于段基址),如下图所示:
代码中蓝色的部分是原来的数据,与~(0xFF<<shft)会把原来位置上的一个字节的数清空,然后再跟data<<shft相或,即可将data写入指定的位置。
相关文章推荐
- 使用open_read_write等底层函数来赋值一个文件
- Linux驱动开发中s3c2410关于gpio的内核导出函数的解读
- 一个简单的NT驱动之创建设备对象函数(CreateDevice)
- 这周周末要搞懂的一个S5PV210 android驱动入门函数s3c_keypad_probe
- Windows驱动分发函数中IRP处理的一个细节
- 【事件驱动】【数码管识别】一(数码管检测(矩形检测函数解读))
- 一个函数引发的MySQL驱动问题
- PHP源码阅读 Day.2 解读PHP底层 mysql的驱动链接
- Android上层如何调用一个底层函数
- 图形驱动库开发之底层驱动函数的编写
- 函数平台底层之旅——DM9000网卡驱动源码分析
- C++中,经常有同名成员函数,一个const形式一个非const形式的解读
- 详解应用层open函数如何调用到底层驱动中xxx_open函数
- 驱动程序学习(二)一个简单的字符型设备驱动函数
- 向Windows内核驱动中传递一个函数指针,使其在内核模式下执行
- 一个简单的NT驱动之驱动入口函数(DriverEntry)
- 【C语言】写一个函数返回参数二进制中1的位数。
- 在一个程序中加载另一程序使用GlobalFree()函数出错的原因
- 写一个函数返回参数值为1的个数 比如: 15 00001111 4个1 程序类型: int count_one_bits(unsigned int value)
- 个人写的一个函数,高手勿喷