发新帖我要提问
12
返回列表
打印

数据结构值堆栈的C语言实现

[复制链接]
楼主: 韩山童
手机看帖
扫描二维码
随时随地手机跟帖
21
韩山童|  楼主 | 2017-1-6 08:43 | 只看该作者 回帖奖励 |倒序浏览
Simon21ic 发表于 2017-1-5 23:48
堆栈、fifo等基本功能,实现起来确实非常简单
但是单独拿出一个stack的实现,其实没啥意义

您这么说,我瞬间有兴趣听您的指点,请大神赐教,以前我基本上都是接触顶层的应用,大部分时间再用Java,最近才刚刚接触C语言。对C语言理解得不深,还需努力。

使用特权

评论回复
22
Simon21ic| | 2017-1-6 15:22 | 只看该作者
韩山童 发表于 2017-1-6 08:43
您这么说,我瞬间有兴趣听您的指点,请大神赐教,以前我基本上都是接触顶层的应用,大部分时 ...

做APP开发吗?做APP开发的话,为啥要接触C语言?
其实,不同的语言,对开发人员的逻辑能力要求都是类似的,java能力强的话,学习C语言也不会太难,只是需要一定时间积累经验而已

使用特权

评论回复
23
韩山童|  楼主 | 2017-1-6 17:55 | 只看该作者
Simon21ic 发表于 2017-1-6 15:22
做APP开发吗?做APP开发的话,为啥要接触C语言?
其实,不同的语言,对开发人员的逻辑能力要求都是类似的 ...

做过APP。老板要搞嵌入式,所以的看看,请大神指点。

使用特权

评论回复
24
Simon21ic| | 2017-1-6 20:40 | 只看该作者
本帖最后由 Simon21ic 于 2017-1-6 20:43 编辑
韩山童 发表于 2017-1-6 17:55
做过APP。老板要搞嵌入式,所以的看看,请大神指点。

很少看到APP转嵌入式的,不过你如果有兴趣的话,我就贴一些代码
你能想到宏的方式,估计你也大概猜到会是这么实现了吧

好处是不需要黏贴复制,直接在C语言中使用类似模板的功能;坏处是,这些代码基本没办法调试
具体就不做说明了,只是简单的通用内存池的实现


void vsfpool_init(struct vsfpool_t *pool)
{
        memset(pool->flags, 0, (pool->num + 31) >> 3);
}

void* vsfpool_alloc(struct vsfpool_t *pool)
{
        uint32_t index = mskarr_ffz(pool->flags, (pool->num + 31) >> 5);

        if (index >= pool->num)
        {
                return NULL;
        }
        mskarr_set(pool->flags, index);
        return (uint8_t *)pool->buffer + index * pool->size;
}

void vsfpool_free(struct vsfpool_t *pool, void *buffer)
{
        uint32_t index = ((uint8_t *)buffer - (uint8_t *)pool->buffer) / pool->size;

        if (index < pool->num)
        {
                mskarr_clr(pool->flags, index);
        }
}


// pool

struct vsfpool_t
{
        uint32_t *flags;
        void *buffer;
        uint32_t size;
        uint32_t num;
};

#define VSFPOOL_DEFINE(name, type, num)                        \
        struct vsfpool_##name##_t\
        {\
                struct vsfpool_t pool;\
                uint32_t mskarr[((num) + 31) >> 5];\
                type buffer[(num)];\
        } name

#define VSFPOOL_INIT(p, type, n)                        \
        do {\
                (p)->pool.flags = (p)->mskarr;\
                (p)->pool.buffer = (p)->buffer;\
                (p)->pool.size = sizeof(type);\
                (p)->pool.num = (n);\
                vsfpool_init((struct vsfpool_t *)(p));\
        } while (0)

#define VSFPOOL_ALLOC(p, type)                                \
    (type *)vsfpool_alloc((struct vsfpool_t *)(p))

#define VSFPOOL_FREE(p, buf)                                        \
        vsfpool_free((struct vsfpool_t *)(p), (buf))

void vsfpool_init(struct vsfpool_t *pool);
void* vsfpool_alloc(struct vsfpool_t *pool);
void vsfpool_free(struct vsfpool_t *pool, void *buffer);

使用特权

评论回复
25
Simon21ic| | 2017-1-6 20:54 | 只看该作者

使用特权

评论回复
26
韩山童|  楼主 | 2017-1-6 21:38 | 只看该作者
Simon21ic 发表于 2017-1-6 20:40
很少看到APP转嵌入式的,不过你如果有兴趣的话,我就贴一些代码
你能想到宏的方式,估计你也大概猜到会是 ...

老板逼的,没办法啊。哇塞 感谢。

使用特权

评论回复
27
韩山童|  楼主 | 2017-1-6 21:39 | 只看该作者
Simon21ic 发表于 2017-1-6 20:54
再来一个更加过瘾的:
https://github.com/versaloon/versaloon/blob/master/dongle/firmware/Interfaces/A ...

哈哈,这得好好学学。

使用特权

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

本版积分规则