OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3428|回复: 5

关于SDIO实验C语言方面的疑问

[复制链接]

21

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-10-26
在线时间
32 小时
发表于 2015-11-30 20:46:41 | 显示全部楼层 |阅读模式
5金钱
//读SD卡
//buf:读数据缓存区
//sector:扇区地址
//cnt:扇区个数
//返回值:错误状态;0,正常;其他,错误代码;    
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 sta=SD_OK;
long long lsector=sector;
u8 n;
lsector<<=9;
if((u32)buf%4!=0)
{
for(n=0;n<cnt;n++)
{
sta=SD_ReadBlock(SDIO_DATA_BUFFER,lsector+512*n,512);//单个sector的读操作
memcpy(buf,SDIO_DATA_BUFFER,512);
buf+=512;

}else
{
if(cnt==1)sta=SD_ReadBlock(buf,lsector,512);     //单个sector的读操作
else sta=SD_ReadMultiBlocks(buf,lsector,512,cnt);//多个sector  
}
return sta;
}


if((u32)buf%4!=0) 这里的(u32)buf指的是什么,哪位前辈能够说说这里的语法吗

最佳答案

查看完整内容[请看2#楼]

buf是一个指向u8数据的指针,本身这个指针的值是一个32位的内存地址,这里要对这个指针的值(32位的值)进行算数计算,而这个值是一个指针不能直接作为一个32位的整型进行计算,所以需要强制转换为u32类型,以一个u32的格式对待这个32位的值。 简单举例说, u8   a = 0;        /* 假设a的地址为0x20000003 */ u8* buf = &a; &n ...
我本自由身,谁敢高高在上
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-30 20:46:42 | 显示全部楼层
buf是一个指向u8数据的指针,本身这个指针的值是一个32位的内存地址,这里要对这个指针的值(32位的值)进行算数计算,而这个值是一个指针不能直接作为一个32位的整型进行计算,所以需要强制转换为u32类型,以一个u32的格式对待这个32位的值。

简单举例说,
u8   a = 0;        /* 假设a的地址为0x20000003 */
u8* buf = &a;   /* 则buf这个指针的值为0x20000003 */  
u32 b = ((u32)buf) %4;    /* (u32)buf就会被视为0x20000003这个整型数对待,然后取余4 */
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-11-30 21:02:15 | 显示全部楼层
强制类型转换后对4取余运算
手艺人要内外兼修。
回复

使用道具 举报

21

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-10-26
在线时间
32 小时
 楼主| 发表于 2015-11-30 21:13:24 | 显示全部楼层
回复【2楼】wangyan915205:
---------------------------------
谢谢,但是
buf:读数据缓存区,(u32)buf又指什么,它为什么能对4取余呢
我本自由身,谁敢高高在上
回复

使用道具 举报

21

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-10-26
在线时间
32 小时
 楼主| 发表于 2015-11-30 22:30:03 | 显示全部楼层
谢谢哈,这个东西太绕了,看来还是自己对C语言不太熟悉,,
我本自由身,谁敢高高在上
回复

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-11-30 22:37:05 | 显示全部楼层
磨刀不误砍柴功。c语言必须反复学习,练习
手艺人要内外兼修。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 21:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表