微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > 题外话----谈谈嵌入式开发中一些注意点

题外话----谈谈嵌入式开发中一些注意点

时间:10-02 整理:3721RD 点击:

写在前面:
    本文就事论事不存在黑谁,针对谁的意图。只做技术讨论。



    今天我们不谈C6748开发板,我们来谈谈嵌入式开发中的C的malloc
    想必大家都清除malloc函数的作用,就是申请一块内存。但是C语言并不会自动回收垃圾。So,能get正确malloc的使用方法的很少。
    malloc的使用原则:
  • 要判断返回值。要知道malloc申请内存是会失败的,你不判断下有没有申请成功就去操作?
  • 要与free配合使用。有申请就要有释放。如果只申请不释放内存总会有用完的一天的。
  • 避免野指针



来,咱们结合官方例程来看下。
下面是一个读取bmp图片的函数,注意第48,55行部分。对照上文的3点,首先,没有对malloc的返回值做判断,其次函数退出前释放申请的内存。
可以想象下,如果调用该函数多次读取bmp的结果。

  1. bmp ReadBmp(char *bmpName)
  2. {
  3.         bmp m;                        // 定义一个位图结构
  4.         FILE *fp;
  5.         unsigned char *BmpBuf;
  6.         int i;
  7.         int bmpWidth;        // 图像的宽
  8.         int bmpHeight;        // 图像的高
  9.         int biBitCount;        // 图像类型,每像素位数
  10.         int lineByte;

  11.         if((fp=fopen( bmpName, "rb"))==NULL)
  12.         {
  13.                 printf( "can't open the bmp imgae.\n ");
  14.                 exit(0);
  15.         }
  16.         else
  17.         {
  18.                 fread(&m.file.bfType, sizeof(char), 2, fp);                                // 类型
  19.                 fread(&m.file.bfSize, sizeof(int), 1, fp);                                    // 文件长度
  20.                 fread(&m.file.bfReserverd1, sizeof(short int), 1, fp);        // 保留字 1
  21.                 fread(&m.file.bfReserverd2, sizeof(short int), 1, fp);        // 保留字 2
  22.                 fread(&m.file.bfbfOffBits, sizeof(int), 1, fp);                        // 偏移量
  23.                 fread(&m.info.biSize, sizeof(int), 1, fp);                                    // 此结构大小
  24.                 fread(&m.info.biWidth, sizeof(int), 1, fp);                                // 位图的宽度
  25.                 fread(&m.info.biHeight, sizeof(int), 1, fp);                            // 位图的高度
  26.                 fread(&m.info.biPlanes, sizeof(short), 1, fp);                            // 目标设备位图数
  27.                 fread(&m.info.biBitcount, sizeof(short) ,1, fp);                    // 颜色深度
  28.                 fread(&m.info.biCompression, sizeof(int), 1, fp);                    // 位图压缩类型
  29.                 fread(&m.info.biSizeImage, sizeof(int), 1, fp);                        // 位图大小
  30.                 fread(&m.info.biXPelsPermeter, sizeof(int), 1, fp);                // 位图水平分辨率
  31.                 fread(&m.info.biYPelsPermeter, sizeof(int), 1, fp);                // 位图垂直分辨率
  32.                 fread(&m.info.biClrUsed, sizeof(int), 1, fp);                            // 位图实际使用颜色数
  33.                 fread(&m.info.biClrImportant, sizeof(int), 1, fp);                    // 位图显示中比较重要颜色数
  34.         }

  35.         // 获取图像宽、高、每像素所占位数等信息
  36.         bmpWidth = m.info.biWidth;
  37.         bmpHeight = m.info.biHeight;
  38.         biBitCount = m.info.biBitcount;

  39.         // 定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
  40.         lineByte = (bmpWidth*biBitCount/8+3)/4*4;

  41.         // 灰度图像有颜色表,且颜色表表项为256
  42.         if(biBitCount == 8)
  43.         {
  44.                 // 分配内存空间
  45.               m.pColorTable = (RGBQUAD *)malloc(256*4);
  46.                 // 申请颜色表所需要的空间,读颜色表进内存
  47.               fread(m.pColorTable, sizeof(RGBQUAD), 256, fp);
  48.         }

  49.         // 分配内存空间
  50.      m.imgBuf = (unsigned char *)malloc(m.info.biSizeImage);
  51.         BmpBuf = (unsigned char *)malloc(m.info.biSizeImage);

  52.         // 读位图数据
  53.         fread(BmpBuf, lineByte * bmpHeight, 1, fp);

  54.         // 将读到的数据垂直镜像翻转
  55.         for(i = 0; i < bmpHeight; i++)
  56.                 memcpy((void *)(m.imgBuf + lineByte * i),
  57.                                 (void *)(BmpBuf + lineByte * (bmpHeight - i - 1)), lineByte);
  58.         // 关闭文件
  59.         fclose(fp);

  60.         return m;
  61. }

复制代码




其他就不列举了,希望大家在实际开发中多多注意,写出健壮的代码。


那这个帖子我要不要收录呢

想了想,还是不收录了。结项的时候再加上

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top