[ARM程序分析与设计] 两道嵌入式c语言题目

[复制链接]
3556|0
 楼主| galaxy9229 发表于 2008-9-27 18:10 | 显示全部楼层 |阅读模式
<br />1&gt&nbsp;如何判断一个板子的cpu&nbsp;是big-endian&nbsp;还是&nbsp;Little-endian的?<br /><br />用c实现非常简单,10行左右,就可以判断了,&nbsp;关键考察新人是否了解了什么是endian&nbsp;,big-endian与little-endian的区别在哪里,&nbsp;如果这些不清楚,就算c再强,也是憋不出来的。<br /><br />2&gt&nbsp;判断了&nbsp;endian&nbsp;后,&nbsp;如何进行转换,&nbsp;写两个函数。<br /><br /><br />答案:<br />1》判断endian的问题。<br /><br />判断endian&nbsp;:<br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltstdlib.h&gt<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;int&nbsp;a&nbsp;=&nbsp;0x1234;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*p&nbsp;=&nbsp;(char&nbsp;*)&a;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;p=%#hhx
&quot;,*p);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(*p&nbsp;==&nbsp;0x34)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Little&nbsp;endian&nbsp;
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(*p&nbsp;==&nbsp;0x12)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Big&nbsp;endian&nbsp;
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Unknow&nbsp;endian&nbsp;
&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />2&gt如何进行转换:<br /><br /><br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltstdio.h&gt<br /><br />typedef&nbsp;unsigned&nbsp;int&nbsp;u32;<br />typedef&nbsp;unsigned&nbsp;short&nbsp;u16;<br /><br />#if&nbsp;0<br />//simple:&nbsp;not&nbsp;check&nbsp;varible&nbsp;types<br />#define&nbsp;BSWAP_16(x)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(((x)&nbsp;&&nbsp;0x00ff)&nbsp;&lt&lt&nbsp;8&nbsp;)&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(((x)&nbsp;&&nbsp;0xff00)&nbsp;&gt&gt&nbsp;8&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /><br />//complex:check&nbsp;varible&nbsp;types<br />#else&nbsp;<br />#define&nbsp;BSWAP_16(x)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(u16)&nbsp;(&nbsp;((((u16)(x))&nbsp;&&nbsp;0x00ff)&nbsp;&lt&lt&nbsp;8&nbsp;)&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((((u16)(x))&nbsp;&&nbsp;0xff00)&nbsp;&gt&gt&nbsp;8&nbsp;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />#endif<br /><br />#define&nbsp;BSWAP_32(x)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(u32)&nbsp;(((((u32)(x))&nbsp;&&nbsp;0xff000000&nbsp;)&nbsp;&gt&gt&nbsp;24)&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((((u32)(x))&nbsp;&&nbsp;0x00ff0000&nbsp;)&nbsp;&gt&gt&nbsp;8&nbsp;)&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((((u32)(x))&nbsp;&&nbsp;0x0000ff00&nbsp;)&nbsp;&lt&lt&nbsp;8&nbsp;)&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((((u32)(x))&nbsp;&&nbsp;0x000000ff&nbsp;)&nbsp;&lt&lt&nbsp;24)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /><br />u16&nbsp;bswap16(u16&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(x&nbsp;&&nbsp;0x00ff)&nbsp;&lt&lt&nbsp;8&nbsp;|(x&nbsp;&&nbsp;0xff00)&nbsp;&gt&gt&nbsp;8;<br />}<br /><br />u32&nbsp;bswap32(u32&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;x&nbsp;&&nbsp;0xff000000&nbsp;)&nbsp;&gt&gt24&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;x&nbsp;&&nbsp;0x00ff0000&nbsp;)&nbsp;&gt&gt8&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;x&nbsp;&&nbsp;0x0000ff00&nbsp;)&nbsp;&lt&lt8&nbsp;|&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;x&nbsp;&&nbsp;0x000000ff&nbsp;)&nbsp;&lt&lt&nbsp;24&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />测试:<br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//u16&nbsp;var_short&nbsp;=&nbsp;0x123490;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//u32&nbsp;var_int&nbsp;=&nbsp;0x1234567890;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关键是要能对错误进行处理,给一个0x123490&nbsp;照样能得出&nbsp;0x9034的值,而且,&nbsp;占内存要小的<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;macro&nbsp;conversion:%#x
&quot;,BSWAP_16(0x123490&nbsp;));//要能正确转换<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;macro&nbsp;conversion:%#x
&quot;,&nbsp;BSWAP_32(0x1234567890));&nbsp;//要能正确转换<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;-----------------
&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;function&nbsp;conversion:%#x
&quot;,bswap16(0x123490));&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;function&nbsp;conversion:%#x
&quot;,&nbsp;bswap32(0x1234567890));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部