|
发表于 2015-12-30 10:59:44
|
显示全部楼层
二级指针算是指针用法里比较精巧的,而且也是比较实用的技巧,linus大神称之为core low-level coding
固定大小内存管理就是一个典型的二级指针用法,代码相当紧凑干脆,我给大家贴上rtx中membox源码,一起体味下个中奥秘
- void *rt_alloc_box (void *box_mem) {
- /* Allocate a memory block and return start address. */
- void **free;
- #ifndef __USE_EXCLUSIVE_ACCESS
- int irq_dis;
- irq_dis = __disable_irq ();
- free = ((P_BM) box_mem)->free;
- if (free) {
- ((P_BM) box_mem)->free = *free;
- }
- if (!irq_dis) __enable_irq ();
- #else
- do {
- if ((free = (void **)__ldrex(&((P_BM) box_mem)->free)) == 0) {
- __clrex();
- break;
- }
- } while (__strex((U32)*free, &((P_BM) box_mem)->free));
- #endif
- return (free);
- }
- int rt_free_box (void *box_mem, void *box) {
- /* Free a memory block, returns 0 if OK, 1 if box does not belong to box_mem */
- #ifndef __USE_EXCLUSIVE_ACCESS
- int irq_dis;
- #endif
- if (box < box_mem || box >= ((P_BM) box_mem)->end) {
- return (1);
- }
- #ifndef __USE_EXCLUSIVE_ACCESS
- irq_dis = __disable_irq ();
- *((void **)box) = ((P_BM) box_mem)->free;
- ((P_BM) box_mem)->free = box;
- if (!irq_dis) __enable_irq ();
- #else
- do {
- *((void **)box) = (void *)__ldrex(&((P_BM) box_mem)->free);
- } while (__strex ((U32)box, &((P_BM) box_mem)->free));
- #endif
- return (0);
- }
复制代码
看看核心代码,几乎一两句话就搞定 |
|