打印
[ARM程序分析与设计]

两道嵌入式c语言题目

[复制链接]
2097|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
galaxy9229|  楼主 | 2008-9-27 18:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1> 如何判断一个板子的cpu 是big-endian 还是 Little-endian的?

用c实现非常简单,10行左右,就可以判断了, 关键考察新人是否了解了什么是endian ,big-endian与little-endian的区别在哪里, 如果这些不清楚,就算c再强,也是憋不出来的。

2> 判断了 endian 后, 如何进行转换, 写两个函数。


答案:
1》判断endian的问题。

判断endian :
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
      short int a = 0x1234;
      char *p = (char *)&a;
    
      printf("p=%#hhx ",*p);

      if(*p == 0x34) 
          printf("Little endian  ");
      else if(*p == 0x12) 
          printf("Big endian  ");
      else 
          printf("Unknow endian  ");

      return 0;
}

2>如何进行转换:


#include <stdio.h>
#include <stdio.h>

typedef unsigned int u32;
typedef unsigned short u16;

#if 0
//simple: not check varible types
#define BSWAP_16(x) 
            ( (((x) & 0x00ff) << 8 ) | 
       (((x) & 0xff00) >> 8 ) 
       )

//complex:check varible types
#else 
#define BSWAP_16(x) 
       (u16) ( ((((u16)(x)) & 0x00ff) << 8 ) | 
                   ((((u16)(x)) & 0xff00) >> 8 ) 
            )
#endif

#define BSWAP_32(x) 
       (u32) (((((u32)(x)) & 0xff000000 ) >> 24) | 
             ((((u32)(x)) & 0x00ff0000 ) >> 8 ) | 
             ((((u32)(x)) & 0x0000ff00 ) << 8 ) | 
             ((((u32)(x)) & 0x000000ff ) << 24) 
                )

u16 bswap16(u16 x)
{
      return (x & 0x00ff) << 8 |(x & 0xff00) >> 8;
}

u32 bswap32(u32 x)
{
      return       ( x & 0xff000000 ) >>24 | 
                     ( x & 0x00ff0000 ) >>8 | 
                     ( x & 0x0000ff00 ) <<8 | 
                     ( x & 0x000000ff ) << 24 
      ; 
}    

测试:
int main(void)
{
      //u16 var_short = 0x123490;
      //u32 var_int = 0x1234567890;
      //关键是要能对错误进行处理,给一个0x123490 照样能得出 0x9034的值,而且, 占内存要小的

      printf("macro conversion:%#x ",BSWAP_16(0x123490 ));//要能正确转换

      printf("macro conversion:%#x ", BSWAP_32(0x1234567890)); //要能正确转换

    
      printf("----------------- ");
    
      printf("function conversion:%#x ",bswap16(0x123490)); 
      printf("function conversion:%#x ", bswap32(0x1234567890));
    
    
      return 0;
}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

69

帖子

0

粉丝