更新:

原文已经搬运至网站:https://www.link2sea.com/archives/386,后续也将在该网站进行更新。

查看博主更多文章请前往:https://www.link2sea.com/。

下面是原文:

原文:

哈哈,开个玩笑,谈不上是操作系统,算是个程序时间分片控制的程序(控制每段程序的执行时间间隔),没有中断,每个任务没有栈,没有优先级,没有信号量、邮箱、互斥,更没有内存管理。也是去年写的程序,跑在STM32上的,用的 hal 库,不过也可以移植。程序很简单,就是个链表完成任务的创建,因为没用到任务的删除,所以就没写。

最初的需求是这样的:我有3个程序块(下文以函数代替)需要执行,每个执行的时间间隔是不一样的,比如我要7ms执行函数A,30ms执行一次函数B, 50ms执行一次函数C。每个函数执行时间都很短,肯定是远小于7ms的。

于是乎,便有了下边的程序,先是测试的example.c,一个是task.c,一个是task.h。

example.c 这个文件是临时写的,为了方便看懂任务的使用方法,一定注意每个任务函数都不是死循环,不能被阻塞。

//文件名:example.c#include "task.h"void MAIN_A_TASK(void);
void MAIN_B_TASK(void);
void MAIN_C_TASK(void);int main(void)
{TASK_LinkCreat();TASK_Creat(7, MAIN_A_TASK);    // 时间为 7 ms,函数为 MAIN_A_TASKTASK_Creat(30, MAIN_B_TASK);    // 时间为 30 ms,函数为 MAIN_B_TASKTASK_Creat(50, MAIN_C_TASK);    // 时间为 50 ms,函数为 MAIN_C_TASKwhile(1){TASK_Switching();}
}void MAIN_A_TASK(void)
{// 添加 A 任务代码,注意不要 while(1),要可以顺序执行完,不能阻塞
}void MAIN_B_TASK(void)
{// 添加 B 任务代码,注意不要 while(1),要可以顺序执行完,不能阻塞
}void MAIN_C_TASK(void)
{// 添加 C 任务代码,注意不要 while(1),要可以顺序执行完,不能阻塞
}void TASK_IDLE(void)
{// 添加 空闲状态 任务代码,注意不要 while(1),要可以顺序执行完,不能阻塞 // 注意 此函数可以不需要,在 task.c 中有定义,若需要则注意此函数名不能改变
}

接下来是task.c

/********************************************************************************* 文件:    task.c* 作者:    SUST 陶亚凡* 版本:    V1.0* 时间:    2017-4-17* 摘要:    任务控制文件******************************************************************************* 说明:    对多任务并行执行的一点理解和尝试,比较青涩*        *   ******************************************************************************* *******************************************************************************/#include "task.h"
#include <stdlib.h>task_link_p task_h = NULL;/*** 摘要:    任务链表创建* 输入:    无* 返回:    任务链表头指针* 说明:    创建的链表有一个空闲任务,任务链表为循环链表,即最后一个指向第一个*/
void TASK_LinkCreat(void)
{task_h = malloc(sizeof(task_link_t));task_h->start_time = CURRENT_TIME();task_h->interval_time = 0;task_h->fun_p = TASK_IDLE;task_h->next = task_h;
}/*** 摘要:    空闲任务* 输入:    无* 返回:    无* 说明:    此处不需要更改,若需要可在主程序中定义*/
__weak void TASK_IDLE(void)
{return;
}/*** 摘要:  创建任务* 输入:  interval_time: 执行的时间间隔(ms)funp: 任务执行函数(返回值为void,输入值为void)* 返回:  无* 说明: */
void TASK_Creat(uint32_t interval_time, void(*fun_p)(void))
{task_link_p p_task = task_h;while(p_task->next != task_h)p_task = p_task->next;p_task->next = malloc(sizeof(task_link_t));p_task->next->start_time = CURRENT_TIME();p_task->next->interval_time = interval_time;p_task->next->fun_p = fun_p;p_task->next->next = task_h;
}/*** 摘要:    任务切换* 输入:    无* 返回:    无* 说明:    任务循环执行*/
void TASK_Switching(void)
{static task_link_p p_task = NULL;uint32_t tick = 0;p_task = p_task==NULL ? task_h : p_task;tick = CURRENT_TIME();if(tick - p_task->start_time >= p_task->interval_time){p_task->fun_p();p_task->start_time = tick;}p_task = p_task->next;
}

接着是task.h,这里有一点要注意,就是define这一句话,在HAL库中得到的是以ms为精度的时间,所以创建任务的时间即为ms为单位的~若移植到其他平台,需要把HAL_GetTick()改成别的获取当前时间的函数。

#ifndef TASK_H_
#define TASK_H_#include "stm32f4xx_hal.h"#define CURRENT_TIME() HAL_GetTick()typedef struct tasklink
{uint32_t start_time;uint32_t interval_time;void (*fun_p)(void);struct tasklink * next;
}task_link_t, *task_link_p;extern task_link_p task_h;void TASK_LinkCreat(void);
void TASK_IDLE(void);
void TASK_Creat(uint32_t interval_time, void(*fun_p)(void));
void TASK_Switching(void);#endif /* TASK_H_ */

好了,也是一篇怀旧篇的博客。去年做 robomaster 时我做的基地,当时需要的几个任务分别是50ms打印一次调试信息,7ms接受一次遥控器发过来的数据,并对基地的移动做一次控制,30ms做一次云台控制。我做的基地最后也算发挥了一下作用吧,最后还是小组都没出现,还是很遗憾了,几年都没有好成绩,导致今年学校干脆不然参加比赛了。。

STM32 嵌入式 超超超超超轻量级操作系统相关推荐

  1. 单片机超轻量级操作系统

    在写完面向对象的单片机编程,就特别想在单片机编程引入一个多线程多任务的编程,把这个思想引入单片机.后发现如下好文,后面再把它封装成类的话,就更方便使用了,我觉得这将会使很多只有操作系统能做的工作,普通 ...

  2. css表格文字超数量就竖排_绝了,超轻量级中文 OCR,你值得拥有

    大家好,我是章鱼猫.今天给大家分享的开源项目是一个今后大数据时代以及图像识别时代非常常用的一个技术. 随着人工智能的发展,图像识别越来越常用,所以,今天推荐的开源项目就是:OCR 相关的. 这个开源项 ...

  3. stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享

    原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...

  4. STM32实现按键有限状态机(超详细,易移植)

    STM32实现按键有限状态机(超详细,易移植) 一.状态机 简而言之,状态机是使不同状态之间的改变以及状态时产生的相应动作的一种机制. 1.1状态机的四要素 现态:状态机当前状态. 触发条件:改变当前 ...

  5. AI周报丨《2021年人工智能专利综合指数报告》近日发布;北大团队提出基于卷积神经网络的全光计算,超快、超低能耗

    行业动态 <2021年人工智能专利综合指数报告> 近日发布 人工智能(Artificial Intelligence,简称AI),是研究人类智能活动规律,构造具有一定智能的人工系统,国际数 ...

  6. TX2超详细,超有用的刷机教程

    TX2超详细,超有用的刷机教程 TX2被Nvidia官方称作是最快,最节能的嵌入式AI计算设备.它的功耗小,只有7.5W,体型也小,只有一张信用卡那么大,它是真正可以实现AI边缘计算的利器.在刷机前, ...

  7. 超详细、超完整的C++教程(算是吧)

    C++是一种高级编程语言,它被广泛应用于软件开发.游戏制作.嵌入式系统等领域.本文将为读者提供一份超详细.超完整的C++教程,帮助初学者掌握C++的基础知识,同时给出十个实例,并一一解释分析.最后,我 ...

  8. 史上最全的Linux常用——目录和文件管理命令——收藏这一篇就够了!(超全,超详细)

    史上最全的Linux常用--目录和文件管理命令--收藏这一篇就够了!(超全,超详细) Linux目录结构 命令 查看文件内容:-cat 查看文件内容:-more 查看文件内容:-less 查看文件内容 ...

  9. 史上最全的Linux常用命令汇总①收藏这一篇就够了!(超全,超详细)

    史上最全的Linux常用命令汇总①(超全面!超详细!)收藏这一篇就够了! Linux命令基础 Shell Linux命令分类 Linux命令行的格式 编辑Linux命令行的辅助操作 获取命令帮助的方法 ...

最新文章

  1. Kotlin成为正式的Android编程语言
  2. can't find a register in class `GENERAL_REGS' while reloading `asm'
  3. [Elasticsearch] 全文搜索 (一) - 基础概念和match查询
  4. kimsoft-jscalendar 简介
  5. circRNA相互作用预测数据库CSCD2
  6. XSSFORK:新一代XSS自动扫描测试工具(精)
  7. 京东java社招面试6_2020最新京东java面试题分享,京东社招
  8. vfp程序转换为c语言程序软件,c语言程序设计及vfp程序设计试题.doc
  9. 软件开发中的资源控制问题学习
  10. 七年级计算机工作计划,七年级下学期信息技术教学计划(最新整理)
  11. 以动词开头的习惯搭配:转
  12. 开源中国开源世界高峰论坛
  13. STC12C5A60S2最小系统
  14. python fork()创建新的进程,daemon进程
  15. 致爱丽丝 之MY收藏
  16. 联想拯救者y9000k和y9000p的区别
  17. return function和return function()的区别
  18. Android 不分区使用link2sd(app2ext APP2SD)
  19. php qqwry扩展
  20. 组合类和友员类的差异有哪些(C++)

热门文章

  1. DICOM:基于JMeter+dcm4che2测试PACS服务器性能的解决方案(前篇)
  2. 清华计算机考研复试机试,清华大学历年考研复试机试真题 - 论文
  3. JAVA静态代理与动态代理(JDK和CGLIB)
  4. 联想笔记本ideapad 320C 15IKB笔记本电脑改装总结
  5. tf.nn.moments( )函数的使用
  6. MyBatis从入门到精通(九):MyBatis高级结果映射之一对一映射
  7. Linux pwn入门教程——格式化字符串漏洞
  8. 机器学习中的数学——点估计(二):矩估计
  9. python中算法定义_Python入门进阶笔记--04Python中表示“组”的概念与定义
  10. kotlin中mainactivity无法直接调用xml中的控件_个推TechDay广州站:使用Kotlin演进安卓开发生态...