#ifndef __MY_ALARM_H
#define __MY_ALARM_H //最多创建1024个任务
#define MAX 1024//函数定义
typedef void alarm_func_t(void*);//添加任务,成功返回任务ID,失败返回-1
int anytimer_alarm(int sec, alarm_func_t *func, void *ch);//取消任务 成功返回0,失败返回-1;
int anytimer_destory(int id);#endif
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>#include "my_alarm.h"static void mouder_load(void);        //模块挂载,设置时间,信号等
static void handler(int s);           //信号行为
static void mouder_unload(void);      //模块卸载,恢复时间,信号
static int get_pos(void);             //找空闲位置//定义任务结构体
struct func_st
{int sec;                      //秒数alarm_func_t *func;           //用户自定义函数void *ch;                     //函数参数
};static struct func_st *line[MAX];      //定义1024长度的数组存储结构体地址
static int inited = 0;                 //设置计时器,只有当inited为0的时候才调用模块挂载函数
struct sigaction oldact;               //旧的信号行为
struct itimerval olditv;               //旧的时间闹钟//添加任务,成功返回任务ID,失败返回-1
int anytimer_alarm(int sec, alarm_func_t *func, void *ch)
{struct func_st *new;int pos;if(inited == 0){mouder_load();inited = 1;}//找空位pos = get_pos();if(pos < 0)return -1;new=malloc(sizeof(*new));if(new == NULL)return -1;new -> sec = sec;new -> func = func;new -> ch = ch;line[pos] = new;return pos;
}//取消任务 成功返回0,失败返回-1;
int anytimer_destory(int id)
{free(line[id]);line[id] = NULL;
}static void mouder_load(void)
{struct sigaction act;struct itimerval itv;act.sa_handler = handler;act.sa_flags = 0;sigemptyset(&act.sa_mask);sigaction(SIGALRM, &act, &oldact);itv.it_interval.tv_sec = 1;itv.it_interval.tv_usec = 0;itv.it_value.tv_sec = 1;itv.it_value.tv_usec = 0;setitimer(ITIMER_REAL, &itv, &olditv);atexit(mouder_unload);     //钩子函数
}static void handler(int s)
{int i;for(i=0; i<MAX; i++){if (line[i] != NULL)    //找不为空的数组{if(line[i] -> sec != 0)                  //当结构体的时间不等于0时,时间减少1line[i] -> sec -= 1;       else                                    //时间为0执行用户自定义函数,并销毁该任务,由于对外提供销毁函数,所以可以由用户调用销毁,类似父进程为子进程收尸函数wait();{line[i] -> func(line[i]->ch);     anytimer_destory(i); }}}
}static int get_pos(void)
{for(int i=0; i<MAX; i++){if(line[i] == NULL)return i;}return -1;
}static void mouder_unload(void)
{sigaction(SIGALRM, &oldact, NULL);setitimer(ITIMER_REAL, &olditv, NULL);
}
#include <stdio.h>
#include <unistd.h>#include "my_alarm.h"static void any1(void *s)
{printf("%s", (char *)s);fflush(NULL);
}static void any2(void *s)
{printf("%s", (char *)s);fflush(NULL);
}static void any3(void *s)
{printf("%s", (char *)s);fflush(NULL);
}int main(void)
{anytimer_alarm(3, any1, "hello");anytimer_alarm(2, any2, "world");anytimer_alarm(5, any3, "apue");/***world*hello**apue*******/while (1) {write(1, "*", 1);sleep(1);}return 0;
}

多任务计时器anytime相关推荐

  1. 在多任务(RTOS)环境中使用看门狗

    最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章.从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁.为了阅读方便,有些航天领域名词 ...

  2. python 线程超时设置_python多任务之总结——(二)线程、协程

    本文主要讲述进程线程协程在python中的使用.主要说明各自的创建.通信及联系与区别,了解各自的适用场景,能更好的利用并发实现多任务开发. 第一部分:python多任务之总结--(一)进程学习 线程 ...

  3. 时间片轮询+状态机实现裸机多任务

    时间片+状态机实现裸机伪多任务 注:上述伪多任务是按个人理解命名的,实际上在裸机中跑的还是单线程,只是效果看上去是多线程. 时间片轮询方式是把MCU的执行时间划分为一块一块的,然后根据自己的需求去分配 ...

  4. 多任务环境中如何喂看门狗?

    1)看门狗基础知识 看门狗(watch dog)是一个定时器,可以设置一个定时时间,计时到时会把MCU复位,所以MCU必须要在定时时间到之前将计数值重置(这个动作通常称为喂狗).在嵌入式系统中加入看门 ...

  5. 30天自制操作系统——第十五天实现多任务(一)

    任务切换 多任务(multitask)也可以称作多进程,在windows操作系统中,就是多个应用程序同时运行的状态. 这里来复习一下进程和线程的概念: 进程:进程是执行程序的一次执行过程,它是一个动态 ...

  6. 【操作系统】30天自制操作系统--(14)多任务1

    本章开始多任务的设计. 一 多任务的说明 多任务(multitask),指的是操作系统中,多个应用程序同时运行的状态.然而,对于单核CPU来说,同一个瞬间只能处理一个事情,不能做到左右互搏.一心二用的 ...

  7. 基于RTT Nano的多任务嵌入式程序设计

    基于RTT Nano的多任务嵌入式程序设计 一.国产RT-Thread操作系统概述 1.简述 2.特点 3.优势 二.RTT-Nano的功能框架 三.在stm32F103上移植RTT Nano 1.添 ...

  8. 计时器工具 StopWatch

    我是陈皮,一个在互联网 Coding 的 ITer,个人微信公众号「陈皮的JavaLib」关注第一时间阅读最新文章. 文章目录 前言 Spring StopWatch 实践例子 源码分析 lang3 ...

  9. 嵌入式操作系统多任务调度原理分析与RUST参考实现

    操作系统多任务调度原理分析与RUST参考实现 作为一名在软件领域工程师,在职业生涯的尽头能有幸接触到一部分硬件产品是我莫大的荣幸.秉承我一贯刨根问底,不搞清楚问题本质不罢休的作风和态度,结合基本的计算 ...

  10. MIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务

    MIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务 这篇是我自己探索实现 MIT 6.828 lab 的笔记记录,会包含一部分代码注释和要求的翻译记录,以及踩过的坑/个人的解决方案 ...

最新文章

  1. 用树莓派打造世界上最小的“iMac”
  2. 解决 VCENTER ROOT 密码过期无法登陆 USER PASSWORD EXPIRED
  3. matlab格拉姆施密特,改进的格拉姆-施密特正交化(modified Gram-Schmidt Process)
  4. python敏感字替换_教学案例_Python处理敏感词汇方法
  5. 使用IDEA 创建SpringBoot项目
  6. python中使用opencv_如何在Python中使用OpenCV Stitcher类?
  7. 小型云台用的是什么电机_直流电机的工作原理是什么?未来的电动车都会用直流电机吗?...
  8. 实战:Redis 主从同步
  9. 详解Python生成器函数和生成器对象的原理和用法
  10. liunx中如何查看软件的安装目录
  11. 仪式与工具--团队管理之规范创立与流程固化过程中必要因素
  12. Kafka从上手到实践 - Kafka集群:配置Broker | 凌云时刻
  13. 给大家推荐一套 git 工作流
  14. 使用DFA算法,实现敏感词过滤
  15. 毕业设计 单片机遥控小车设计与实现
  16. php为网页更改颜色,php如何设置网页颜色?
  17. 八百呼的录音话机能解决企业的客户纠纷
  18. 如何向oracle中导入数据,Oracle导入导出数据库的语法_Oracle_Oracle语法_Oracle数据库_课课家...
  19. 如何真正从零开始学习Python
  20. 网络视频录像机地址无法修改如何解决

热门文章

  1. tracert查网络问题
  2. 解决AndroidStudio引入Jar出现Unable to resolve dependency for ':app@debug/compileClasspath
  3. 项目经理的10条规则
  4. centos网卡错误Device eth0 does not seem to be present
  5. 通过 Azure 媒体管理门户开始使用直播流媒体
  6. Web 前端开发者必知CSS 属性
  7. 拉登游戏开发--分布式计算服务机客户机程序设计
  8. html状态栏透明,HTML – 如何使我的导航栏略微透明?
  9. jQuery常用语法笔记
  10. 全国大数据分析系统基于vue echarts