免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1490 | 回复: 4
打印 上一主题 下一主题

[C] 关于"想成为嵌入式程序员应知道的0x10个基本问题" [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-20 09:34 |只看该作者 |倒序浏览
http://blog.chinaunix.net/u/20483/showart.php?id=1830609上是一篇广为转载的文章,但是关于第10个问题

10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。
在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is: ( 一个较晦涩的方法是)
*(int * const)(0x67a9) = 0xaa55;
即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。


为什么写成*ptr = 0xaa55;题目明明要求0xaa66.搜索了google,发现转载的也都是0xaa55,难道是我错了?

论坛徽章:
0
2 [报告]
发表于 2009-02-20 09:48 |只看该作者
很吐血的告诉你,是题目错了

论坛徽章:
0
3 [报告]
发表于 2009-02-20 09:49 |只看该作者

回复 #2 sep 的帖子

我也很吐血的告诉他,题目没问题,是答案错了。

论坛徽章:
0
4 [报告]
发表于 2009-02-20 09:49 |只看该作者
原帖由 sep 于 2009-2-20 09:48 发表
很吐血的告诉你,是题目错了


   谢谢老兄, 请多保重哦

论坛徽章:
0
5 [报告]
发表于 2009-02-20 09:52 |只看该作者

回复 #1 bsdc 的帖子

误人子弟啊!楼主大大。
现在嵌入式好多都采用arm芯片了,这种芯片有个特性,效率优先。
就是说 楼主大大做*(int * const)(0x67a9)这种强制转换时,如果是奇地址开始,很容易一个bus error,这是和sun sparc芯片一样的。它不允许这样转。
因为效率,总线寻址的原因。
所以尽可能改为memcpy来赋值。
想知道具体怎么bus error,可以试一下
char p2[20];
int d=5;
for(i=0; i<20; i++)
{
p2=i;
}
d = *(int *)&p2[0];
d = *(int *)&p2[1];
d = *(int *)&p2[2];
d = *(int *)&p2[3];
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP