搜索
bottom↓
回复: 7

全程用的list,看不懂,求教

[复制链接]

出0入0汤圆

发表于 2018-11-7 10:49:55 | 显示全部楼层 |阅读模式
atmega16做的,里面很多链表,看不懂,以前从来没有见过,大神们指点指点
随便贴个函数:
-----------------------------------------------timer.h----------------------------------------------------------
#define        TIMER_COUNT_INIT                (256-(((unsigned long long)SYSTEM_OSC)/1000/256))
struct timer_list{
        struct list_head list;
        void (*timer_cb)(void *);
        void *param_cb;
        u16 status;       
        u16 expires;
};
enum{
        TIMER_STATUS_IDLE,
        TIMER_STATUS_ACTIVE,
        TIMER_STATUS_UNKNOW
};
extern void timer_init(void);
extern u32 jiffies;
extern int timer_register(struct timer_list *timer);
extern int timer_unregister(struct timer_list *timer);
extern int timer_mod(struct timer_list *timer,unsigned int expires);
#endif



---------------------------------timer.c-----------------------------------------------------------------------

#pragma interrupt_handler timer0_overflow_interrupt:iv_TIMER0_OVF

static  LIST_HEAD(g_timer_head);
u32 jiffies=0;

void timer0_overflow_interrupt(void)
{
        struct timer_list *t;
        struct list_head *pos;
       
        jiffies++;
        list_for_each(pos, &g_timer_head)
        {
                t=list_entry(pos,struct timer_list,list);
                /*
                if(t->status!=TIMER_STATUS_ACTIVE)
                        continue;
                if(t->expires<jiffies)
                        continue;
                t->status=TIMER_STATUS_IDLE;
                */
                if(!t->timer_cb)
                        continue;
                t->timer_cb(t->param_cb);
        }                       
        TCNT0=TIMER_COUNT_INIT;
}

int timer_register(struct timer_list *timer)
{
        system_interrupt_disable();
        list_add_tail(&timer->list,&g_timer_head);
        system_interrupt_enable();
        return 0;
}

int timer_unregister(struct timer_list *timer)
{
        system_interrupt_disable();
        list_del(&timer->list);
        system_interrupt_enable();
        return 0;
}

/*
int timer_mod(struct timer_list *timer,unsigned int expires)
{
        timer->expires=expires;
        timer->status=TIMER_STATUS_ACTIVE;
        return 0;
}
*/
void timer_init(void)
{
        TCNT0=TIMER_COUNT_INIT;
        TCCR0=(1<<CS02)/*|(1<<CS00)*/;
        TIMSK=(1<<TOIE0);       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出10入61汤圆

发表于 2018-11-7 10:54:30 | 显示全部楼层
用一个硬件定时器实现很多软定时器,每个定时器可以设置超时时间和回调函数

出0入0汤圆

发表于 2018-11-7 11:15:17 | 显示全部楼层
linux里面的内核定时器结构 数据结构基本都一样 你去看看源码就知道了

出0入0汤圆

 楼主| 发表于 2018-11-7 11:30:59 | 显示全部楼层
wuyongwang2345 发表于 2018-11-7 11:15
linux里面的内核定时器结构 数据结构基本都一样 你去看看源码就知道了

您的意思是他在这块AVR单片机上运行了Linux?

出0入0汤圆

 楼主| 发表于 2018-11-7 11:31:22 | 显示全部楼层
tcm123 发表于 2018-11-7 10:54
用一个硬件定时器实现很多软定时器,每个定时器可以设置超时时间和回调函数 ...

你们都是高手啊,大神

出0入0汤圆

发表于 2018-11-7 11:36:09 | 显示全部楼层
这个是linux内核经典的链表思路,随便google下有一大把文章解释这个机制的。

出0入0汤圆

 楼主| 发表于 2018-11-7 12:49:10 | 显示全部楼层
kelp 发表于 2018-11-7 11:36
这个是linux内核经典的链表思路,随便google下有一大把文章解释这个机制的。
...

好的,谢谢。我百度下,顺便问下Google不是用不了了嘛

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-25 04:37

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

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