嵌入式–轮询调度模块

参考别人设计,感谢大佬的付出。此模块用在裸机中作为时间片调用,代码层次清晰,并非所有编译器支持,谨慎使用。

头文件 module.h

#ifndef __MODULE_H
#define __MODULE_H#include <stdint.h>
#include <stdbool.h>#ifdef __cplusplus
extern "C" {
#endif/* define variable --------------------------------------------------------*/
#define  DEFINE_CONN(type, var, line)   type  var##line
#define  DEFINE_TYPE(type, prefix)      DEFINE_CONN(type, prefix, __LINE__)#define DECLARE_TYPE(type, var)     type type##var
#define ABTAIN_TYPE(type, var)      type##var#if defined(__CC_ARM) || defined(__GNUC__) /* ARM,GCC*/#define SECTION(x)                  __attribute__((section(x)))#define USED                        __attribute__((used))
#elif defined (__ICCARM__)              /*IAR */#define SECTION(x)                  @ x#define USED                        __root
#else#error "Current tool chain haven't supported yet!"
#endiftypedef struct{void (*init)(void);             //初始化接口
}InitItem_t;typedef struct{void (*exit)(void);             //初始化接口
}ExitItem_t;typedef struct{const char *name;               //模块名称    void (*handle)(void);           //初始化接口unsigned int interval;          //轮询间隔unsigned int *timer;            //指向定时器指针
}TaskItem_t;#define Module_Init(func)           \USED DEFINE_TYPE(const InitItem_t, init_tbl_##func)\SECTION("init.item.1") = {func}#define Module_Exit(func)           \USED DEFINE_TYPE(const ExitItem_t, exit_tbl_##func)\SECTION("exit.item.1") = {func}    #define Timer_Register(name, handle, interval)                \static unsigned int __task_timer_##handle;              \USED DEFINE_TYPE(const TaskItem_t, task_item_##handle)  \SECTION("task.item.1") = {name,handle, interval, &__task_timer_##handle}#define Task_Register(name, handle)                \USED DEFINE_TYPE(const TaskItem_t, task_item_##handle)  \SECTION("task.item.1") = {name,handle, 0, NULL}// 数据报传送
typedef struct{const char* name;       // 标识void* msg;              // 内容int   size;             // 内容大小bool  flg;              // 数据更新标识
}Msg_Item_t;    // 注意,每个标识在注册的时候,msg的大小已确定
#define MSG_Register(name, type, var)           \static DECLARE_TYPE(type, var);             \USED DECLARE_TYPE(Msg_Item_t, type##var)    \SECTION("msg.item.1") = {name, (void*)&ABTAIN_TYPE(type, var), sizeof(type), false}void Task_IncTick(void);unsigned int Task_GetTick(void);void SysModule_Init(void);void SysModule_Exit(void);  void SysTask_Process(void);bool Msg_Send(const char* name, void* msg);bool Msg_Recv(char* name, void* msg, int size);#ifdef __cplusplus
}
#endif    #endif

源文件 module.c

#include <string.h>
#include <stdlib.h>#include "module.h"static volatile unsigned int s_Task_Tick = 0;static void NullProcess(void){}const USED InitItem_t init_tbl_start SECTION("init.item.0") = {NullProcess
};const USED InitItem_t init_tbl_end SECTION("init.item.2") = {       NullProcess
};const USED ExitItem_t exit_tbl_start SECTION("exit.item.0") = {NullProcess
};const USED ExitItem_t exit_tbl_end SECTION("exit.item.2") = {       NullProcess
};const USED TaskItem_t task_tbl_start SECTION("task.item.0") = {     "", NullProcess
};const USED TaskItem_t task_tbl_end SECTION("task.item.2") = {       "", NullProcess
};void Task_IncTick(void)
{++s_Task_Tick;
}unsigned int Task_GetTick(void)
{return s_Task_Tick;
}void SysModule_Init(void)
{const InitItem_t *it = &init_tbl_start;while(it < &init_tbl_end){if(!it->init){break;}it++->init();}
}void SysModule_Exit(void)
{const ExitItem_t *it = &exit_tbl_start;while(it < &exit_tbl_end){if(!it->exit){break;}it++->exit();}
}void SysTask_Process(void)
{const TaskItem_t *t;for (t = &task_tbl_start + 1; t < &task_tbl_end; t++) {if(!t->timer){if(t->handle){t->handle();}continue;}if((Task_GetTick() - *t->timer) >= t->interval) {*t->timer = Task_GetTick();if(t->handle){t->handle();}}}
}Msg_Item_t msg_tbl_start  __attribute__((section("msg.item.0"))) = {"", (void*)0, 0
};Msg_Item_t msg_tbl_end  __attribute__((section("msg.item.2"))) = {       "", (void*)0, 0
};bool Msg_Send(const char* name, void* msg)
{Msg_Item_t *it = &msg_tbl_start;while(it < &msg_tbl_end){if(strcmp(it->name, name) == 0){memcpy(it->msg, msg, it->size);it->flg = true;return true;}it++;}return false;
}bool Msg_Recv(char* name, void* msg, int size)
{if(!msg){return false;}Msg_Item_t *it = &msg_tbl_start;while(it++ < &msg_tbl_end){if(strcmp(it->name, name) == 0){if(it->flg == false){return false;}if(size < it->size){return false;}memcpy(msg, it->msg, it->size);it->flg = false;return true;}}return false;
}

嵌入式--轮询调度模块相关推荐

  1. 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(4)之轮询Flash配置参数. 文接上篇 <超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSP ...

  2. 嵌入式操作系统专题《基础概念1@轮询系统、前后台系统、多任务系统的区别》

    轮询系统:即在裸机编程时,先初始化相关硬件,让主程序在一个死循环里面不断循环,顺序地处理各种事件.不能说轮询是低端的,轮询系统是一种非常简单的软件结构,但适用于仅需要顺序执行代码且不需要外部事件来驱动 ...

  3. 与现代传感器的接口:轮询ADC驱动程序

    与现代传感器的接口:轮询ADC驱动程序 Interfacing with modern sensors: Polled ADC drivers 我们研究了在现代嵌入式应用程序中,开发人员应该如何创建一 ...

  4. 选中断还是轮询方式?深究其中的区别

    作者 | 肖遥 来源 | 技术让梦想更伟大 摸水了一周,准备在家里好好敲敲代码,赶赶稿子,正当我专心输出的时候,被老婆打断了. 娃拉臭了,赶紧过来!语气中带着一丝丝我害怕的味道. 怎么办?没办法只有过 ...

  5. RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)

    文章目录 一.前言 怎样防止内存溢出? 二.实验目的 三.代码 3.1.main.h 3.2.main.c 四.Debug 4.1.Debug (printf) Viewer 4.2.修改一下程序:线 ...

  6. DPDK PMD( Poll Mode Driver)轮询模式驱动程序

    DPDK PMD( Poll Mode Driver)轮询模式驱动程序 目录 Mellanox PMDs 轮询模式驱动程序 要求和假设 设计原则 逻辑核心,内存和NIC队列关系 设备标识,所有权和配置 ...

  7. Qt编写安防视频监控系统10-视频轮询

    一.前言 视频轮询在视频监控系统中是一个基础的核心功能,尤其是上了大屏以后,这个功能是必须的,根据预先设定的轮询间隔逐个加载视频到预先设定的通道画面数中,轮询间隔.轮询画面数.轮询采用的码流类型(主码 ...

  8. 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析

    本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...

  9. VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询

    浏览localhost网站时候不管你打开那个页面它都会不停的轮询.据悉这是VS2013自带的Browser Link功能,里面用到SignalR机制 什么是Browser Link功能,什么是Sign ...

最新文章

  1. java webproject中logback换配置文件的路径
  2. php实现注销功能,laravel 实现用户登录注销并限制功能
  3. 【数据库】Mysql的REPLACE()函数替换字符串
  4. C语言和设计模式(外观模式)
  5. 【报告分享】清华大学-2019人工智能发展报告.pdf(附394页报告下载链接)
  6. 框架鲜花商城系统测试_小程序商城 Open-Shop
  7. python爬取网站所有资源
  8. SpatialDB |单细胞空间转录组数据分析可视化平台
  9. c++ 0x3f 0x3f3f 0x3f3f3f 0x3f3f3f3f的具体值
  10. C++设计模式 | Singleton单例模式
  11. 基于显著性检验分析两个样本分布相似度及Python实现—— t检验、拟合优度检验、KS检验、Wilcoxon符号秩检验、H检验、Mann-Whitney秩检验、P值的意义、API汇总
  12. docker进入容器中的方法
  13. 人工神经网络的基本原理及其应用
  14. 弱电时间同步系统(卫星同步时钟)医院学校标准时钟系统建设的意义
  15. 量子计算机当游戏服务器,为何需要量子计算机
  16. uhs3内存卡有哪些_高速内存卡是什么 3款热门高速内存卡推荐
  17. 离职了半年了,大家觉得我为啥离职呢?
  18. RTSP实时音视频传输介绍
  19. AE基础教程第一阶段——07 区域显示,透明网格
  20. Daocloud配置文件使用(启动时替换配置文件)

热门文章

  1. 【C语言】好题分享——回文对称数
  2. 计算机操作系统(第四版)第二章(进程的描述与控制)知识点整理
  3. 惊!一文看懂Java NIO读写文件
  4. react手机端项目注意点,ant design-mobile框架
  5. Spring Boot 的配置文件有哪几种格式?它们有什么区别?
  6. 移动通信:数字调制技术(BPSK, DPSK, QPSK, Π/4 QPSK,BFSK, MSK, GMSK, M-ary)学习笔记
  7. IMX6q ft5x0x_ts触摸芯片分析
  8. 华为、蚂蚁金服等都在招聘的大数据开发,需要具备哪些技能
  9. 靴子落地!Mobileye正式启动4D成像雷达量产进程
  10. NRF52832+DW1000通信系统架构设计