嵌入式--轮询调度模块
嵌入式–轮询调度模块
参考别人设计,感谢大佬的付出。此模块用在裸机中作为时间片调用,代码层次清晰,并非所有编译器支持,谨慎使用。
头文件 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;
}
嵌入式--轮询调度模块相关推荐
- 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记(4) - 轮询Flash配置参数
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记(4)之轮询Flash配置参数. 文接上篇 <超级下载算法(RT-UFL)开发笔记(3) - 统一FlexSP ...
- 嵌入式操作系统专题《基础概念1@轮询系统、前后台系统、多任务系统的区别》
轮询系统:即在裸机编程时,先初始化相关硬件,让主程序在一个死循环里面不断循环,顺序地处理各种事件.不能说轮询是低端的,轮询系统是一种非常简单的软件结构,但适用于仅需要顺序执行代码且不需要外部事件来驱动 ...
- 与现代传感器的接口:轮询ADC驱动程序
与现代传感器的接口:轮询ADC驱动程序 Interfacing with modern sensors: Polled ADC drivers 我们研究了在现代嵌入式应用程序中,开发人员应该如何创建一 ...
- 选中断还是轮询方式?深究其中的区别
作者 | 肖遥 来源 | 技术让梦想更伟大 摸水了一周,准备在家里好好敲敲代码,赶赶稿子,正当我专心输出的时候,被老婆打断了. 娃拉臭了,赶紧过来!语气中带着一丝丝我害怕的味道. 怎么办?没办法只有过 ...
- RTX5 | 内存池03 - 共享内存用于线程之间的通讯(轮询方式)
文章目录 一.前言 怎样防止内存溢出? 二.实验目的 三.代码 3.1.main.h 3.2.main.c 四.Debug 4.1.Debug (printf) Viewer 4.2.修改一下程序:线 ...
- DPDK PMD( Poll Mode Driver)轮询模式驱动程序
DPDK PMD( Poll Mode Driver)轮询模式驱动程序 目录 Mellanox PMDs 轮询模式驱动程序 要求和假设 设计原则 逻辑核心,内存和NIC队列关系 设备标识,所有权和配置 ...
- Qt编写安防视频监控系统10-视频轮询
一.前言 视频轮询在视频监控系统中是一个基础的核心功能,尤其是上了大屏以后,这个功能是必须的,根据预先设定的轮询间隔逐个加载视频到预先设定的通道画面数中,轮询间隔.轮询画面数.轮询采用的码流类型(主码 ...
- 加权轮询算法PHP,PHP实现负载均衡的加权轮询方法分析
本文实例讲述了PHP实现负载均衡的加权轮询方法.分享给大家供大家参考,具体如下: 1. 负载均衡算法有哪些? 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务 ...
- VS2013自带的Browser Link功能引发浏览localhost网站时不停的轮询
浏览localhost网站时候不管你打开那个页面它都会不停的轮询.据悉这是VS2013自带的Browser Link功能,里面用到SignalR机制 什么是Browser Link功能,什么是Sign ...
最新文章
- java webproject中logback换配置文件的路径
- php实现注销功能,laravel 实现用户登录注销并限制功能
- 【数据库】Mysql的REPLACE()函数替换字符串
- C语言和设计模式(外观模式)
- 【报告分享】清华大学-2019人工智能发展报告.pdf(附394页报告下载链接)
- 框架鲜花商城系统测试_小程序商城 Open-Shop
- python爬取网站所有资源
- SpatialDB |单细胞空间转录组数据分析可视化平台
- c++ 0x3f 0x3f3f 0x3f3f3f 0x3f3f3f3f的具体值
- C++设计模式 | Singleton单例模式
- 基于显著性检验分析两个样本分布相似度及Python实现—— t检验、拟合优度检验、KS检验、Wilcoxon符号秩检验、H检验、Mann-Whitney秩检验、P值的意义、API汇总
- docker进入容器中的方法
- 人工神经网络的基本原理及其应用
- 弱电时间同步系统(卫星同步时钟)医院学校标准时钟系统建设的意义
- 量子计算机当游戏服务器,为何需要量子计算机
- uhs3内存卡有哪些_高速内存卡是什么 3款热门高速内存卡推荐
- 离职了半年了,大家觉得我为啥离职呢?
- RTSP实时音视频传输介绍
- AE基础教程第一阶段——07 区域显示,透明网格
- Daocloud配置文件使用(启动时替换配置文件)
热门文章
- 【C语言】好题分享——回文对称数
- 计算机操作系统(第四版)第二章(进程的描述与控制)知识点整理
- 惊!一文看懂Java NIO读写文件
- react手机端项目注意点,ant design-mobile框架
- Spring Boot 的配置文件有哪几种格式?它们有什么区别?
- 移动通信:数字调制技术(BPSK, DPSK, QPSK, Π/4 QPSK,BFSK, MSK, GMSK, M-ary)学习笔记
- IMX6q ft5x0x_ts触摸芯片分析
- 华为、蚂蚁金服等都在招聘的大数据开发,需要具备哪些技能
- 靴子落地!Mobileye正式启动4D成像雷达量产进程
- NRF52832+DW1000通信系统架构设计