# CUI_RTOS **Repository Path**: catleeee/CUI_RTOS ## Basic Information - **Project Name**: CUI_RTOS - **Description**: 一个适用于运动流程控制的任务调度器,代码只有200多行。可以实现多任务管理,流程控制。 - **Primary Language**: C - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2023-08-30 - **Last Updated**: 2023-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 2022年1月15日14:32:10 https://www.toutiao.com/a7052642755457122848/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=1698118442418574&utm_medium=toutiao_android&share_token=3beec280-54f0-4acf-a643-f7aa356f6c6f&wxshare_count=1&wid=1642228118965 有感于上面的文章,只开源3个项目。这三个项目都有缺点,需要改正,直接移植都有不同的问题。 谢绝白嫖,拒绝内卷,从我做起。 # CUI_RTOS #### 介绍 一个适用于运动流程控制的任务调度器,代码只有200多行。可以实现多任务管理,流程控制。 这并不是一个实时操作系统,名字取的不对,但暂时先这样吧。 它能使编写流程类的程序,显得特别简单。 #### 软件架构 软件架构说明 在主程序的 While 循环中运行一个任务循环链表 tasklink ,这个任务链表执行被挂载到下面的任务。被执行的任务执行完,都会运行 CUI_RTOS_Delayms ,这个函数作用是将该任务从 tasklink 中释放出来,同时加入到定时器链表中进行计时。在定时器中的函数 OS_TimerFunc 会对每一个挂载到他下面的任务进行计时,计时时间到,将该任务重新挂载到tasklink 下面。 如果定时时间到,任务重新挂载到 tasklink 下面,当运行该任务时,会取该任务的下一个节点函数运行,如果没有节点函数,则任务从头开始运行,直到满足删除条件 #### 概念 任务链表 :系统时刻运行的任务链表,是循环链表。 任务 : 挂在任务链表下的链表,是单链表。 函数 : 挂载在任务下的具体执行函数。 任务状态: 在状态是STOP时,才能对任务下的函数进行增减。 #### 使用说明 1. 创建一个任务: TaskStr* ptask = os_creatTask(); 2. 将该任务添加到任务链表下: os_addTask(ptask); 3. 主循环中放入函数: os_runTask(); 4 主函数中间隔调用函数: os_Interval(); 5. ① 将一个函数添加到任务中,并指定计时周期: OS_AddFunction(task,fun,40); 该任务会以40ms的周期运行。 ② 如果想达到一个条件让该任务中断执行则要使用条件判断函数添加: OS_AddJudegeFunction(taskYS,FunYS,40,Jugefun); 当布尔函数Jugefun返回值为真时,中断函数执行,并删除taskYS链表下,该任务之前的所有挂载在该链表下的函数。 ③ 如果要重复执行任务链表tasklink下的某一段函数,则可以使用函数: OS_AddCycleFunction(TaskStr* task,TYPE_NUMBER num); num是重复执行的次数。任务会重复执行这个函数添加位置之前的所有链表下的函数,直到达到次数,并删除这些函数。 ④ 如果想删除任务链表下所有函数,则 os_deleTask(ptask); 该函数会运行一次。在这之前,该任务链表下所有函数都会被删除。 ⑤ 要在任务停止状态下添加函数,不然会出问题。添加之后,需要再次使用 os_addTask(ptask) 将任务添加到任务链表下: if(task->state == Stop) { OS_AddJudegeFunction(task,fun,1000,&flag_out); os_addTask(task); } #### 移植说明 1. 该软件使用了内存管理和单链表和循环链表。链表最好使用提供的文件。内存管理可以使用其他的进行移植。 2. 修改获取系统时间函数: u32 GetSysTime(TimerLinkStr* timerlink) { return HAL_GetTick(); } #### 注意问题 代码优化等级要调整为0,测试发现,优化等级为3会执行错误。 #### 一些使用笔记 https://blog.csdn.net/laocui1?spm=1000.2115.3001.5343