搜索
bottom↓
回复: 142

[微知识]求求你,不要再纠结指针了……(1)

  [复制链接]

出0入0汤圆

发表于 2015-12-29 21:35:52 来自手机 | 显示全部楼层
本帖最后由 myxiaonia 于 2015-12-30 10:46 编辑

linux大神有个用二级指针比较链表节点大小的,很好玩

昨天手机更新的,更正一下,是使用二级指针删除链表节点

出0入0汤圆

发表于 2015-12-30 10:59:44 | 显示全部楼层
二级指针算是指针用法里比较精巧的,而且也是比较实用的技巧,linus大神称之为core low-level coding

固定大小内存管理就是一个典型的二级指针用法,代码相当紧凑干脆,我给大家贴上rtx中membox源码,一起体味下个中奥秘

  1. void *rt_alloc_box (void *box_mem) {
  2.   /* Allocate a memory block and return start address. */
  3.   void **free;
  4. #ifndef __USE_EXCLUSIVE_ACCESS
  5.   int  irq_dis;

  6.   irq_dis = __disable_irq ();
  7.   free = ((P_BM) box_mem)->free;
  8.   if (free) {
  9.     ((P_BM) box_mem)->free = *free;
  10.   }
  11.   if (!irq_dis) __enable_irq ();
  12. #else
  13.   do {
  14.     if ((free = (void **)__ldrex(&((P_BM) box_mem)->free)) == 0) {
  15.       __clrex();
  16.       break;
  17.     }
  18.   } while (__strex((U32)*free, &((P_BM) box_mem)->free));
  19. #endif
  20.   return (free);
  21. }

  22. int rt_free_box (void *box_mem, void *box) {
  23.   /* Free a memory block, returns 0 if OK, 1 if box does not belong to box_mem */
  24. #ifndef __USE_EXCLUSIVE_ACCESS
  25.   int irq_dis;
  26. #endif

  27.   if (box < box_mem || box >= ((P_BM) box_mem)->end) {
  28.     return (1);
  29.   }

  30. #ifndef __USE_EXCLUSIVE_ACCESS
  31.   irq_dis = __disable_irq ();
  32.   *((void **)box) = ((P_BM) box_mem)->free;
  33.   ((P_BM) box_mem)->free = box;
  34.   if (!irq_dis) __enable_irq ();
  35. #else
  36.   do {
  37.     *((void **)box) = (void *)__ldrex(&((P_BM) box_mem)->free);
  38.   } while (__strex ((U32)box, &((P_BM) box_mem)->free));
  39. #endif
  40.   return (0);
  41. }
复制代码

看看核心代码,几乎一两句话就搞定
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 16:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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