首页 > 其他分享 >协作多任务库

协作多任务库

时间:2024-06-07 23:22:44浏览次数:29  
标签:oldtick fork pause void 协作 cmt 多任务 asm

协作多任务库

描述

CMT 是一个轻量级的协作多任务“内核”,具有多任务 C 功能。 该库还提供了其他几个有用的工具:

任务之间的简单消息传递
消息队列
信号灯
定时器
提供用户钩子以通知任务状态更改。

源代码 

这包括完整的源代码、文档和编译库。由于 所有这些代码的性质,这完全是特定于 Borland 的(我使用的是 BC++ 3.1, 2.x 版本也应该可以工作)。如果你想将它与其他编译器一起使用, 您可能需要更改任务管理功能以保存足够的上下文 让它工作。

使用库
库函数和数据结构在“cmtlib.h”中描述, 您必须将其包含在代码中。之后,您通常会创建 您的主要功能中的一些任务是这样的。


#include "cmtlib.h"

void task(void)
{
while (1) {
cmt_pause();
}
}

void main(void)
{
cmt_fork(task,2048);
while (1) {
cmt_pause();
}
}
你刚刚创建的是一个程序,它无休止地运行两个任务,切换 从一个到另一个。cmt_fork() 的第二个参数 (2048) 表示需要 新任务的堆栈大小。一切的关键是 cmt_pause() 函数 切换离开调用方,运行所有其他任务,然后返回到调用方 好像什么都没发生一样。虽然上面的示例是完全有效的代码,但它 没有做那么多。让我们看一个更有趣的例子:


#include "cmtlib.h"
#include <stdio.h>
#include <conio.h>

void task(void)
{
char *s;
s=cmt_receive();
while (1) {
printf("%s\n",s);
cmt_sleep(1);
}
}

void main(void)
{
cmt_send("one",cmt_fork(task,2048));
cmt_send("two",cmt_fork(task,2048));
cmt_send("three",cmt_fork(task,2048));
while (!kbhit()) {
cmt_pause();
}
getch();
}
那么这是怎么回事呢?我们正在创建同一任务的三个实例, 并通过发送消息给他们每个人不同的“工作”。cmt_fork() 返回 指向新任务的指针(为清楚起见,不进行错误检查)和 cmt_send() 将字符串作为消息发送到该任务。此时,消息只是存储 转换为任务数据。在第一次调用 cmt_pause() 时,每个实例都以循环方式获得控制权 时尚,第一件事就是收到发送给它的消息。然后 它们都进入无限循环,打印接收到的字符串,然后调用 cmt_sleep() - 一个睡眠函数,它连续调用 cmt_pause() 来表示给定数量的 秒。同时,主程序正忙着看键盘。

您可以从源代码中找出信号量、计时器和消息队列 和你自己的文档,我再举一个例子,这次来自 现实生活中的代码:

#include "cmtlib.h"
#include <dos.h>

static void interrupt far (*oldtick)(void);
static long watchdog,wdticks;

static void interrupt far newtick(void)
{
(*oldtick)();
watchdog++;
if (watchdog>wdticks) {
_asm cli
_asm pushf
_asm mov ax,0ffffh
_asm push ax
_asm xor ax,ax
_asm push ax
_asm iret
}
}

void startwatchdog(int sectimeout)
{
watchdog=0l;
wdticks=(long)sectimeout*18l+(long)(sectimeout/5);
if (!oldtick) {
oldtick=getvect(0x1c);
setvect(0x1c,newtick);
}
}

void stopwatchdog(void)
{
if (oldtick) {
setvect(0x1c,oldtick);
oldtick=NULL;
}
}

void clearwatchdog(void)
{
watchdog=0l;
}

/*--------------------------------*/
void idletask(void)
{
while (1) {
clearwatchdog();
sleep(1);
}
}

void main(void)
{
startwatchdog(60);
cmt_fork(idletask,512);
while (!kbit()) {
cmt_pause();
}
stopwatchdog();
getch();
}
当然,在现实生活中,您可能会有其他任务。此代码实现 一个可以检测代码是否已死的看门狗 - 前提是定时器中断 还活着。startwatchdog() 会将新的中断处理程序附加到用户计时器 处理程序,用于计算即时报价,并在达到预定义量时重新启动计算机。 idletask() 每秒清除一次计数器,从不允许计数器 只要多任务处理程序正常运行,就会溢出。Startwatchdog() 实现 以便可以多次调用 in 来设置新的超时值 - 我正在设置 它大约需要 10 分钟,如果我需要执行外部,有时甚至更长 我的代码中的程序。这个简单的看门狗在实践中效果很好,可以恢复 自动从大多数错误(包括麻烦的网络问题,共享 冲突和间歇性设备 I/O 错误)。

希望这段代码对你们所有人都有用。我很高兴收到任何 如果有的话,你会捐款,但你没有义务给我寄任何东西。 这段代码只是想免费:)。

版权所有 © Madis Kaal 2000-2024

标签:oldtick,fork,pause,void,协作,cmt,多任务,asm
From: https://www.cnblogs.com/firespeed/p/18238033

相关文章

  • UML交互图-协作图
    概述协作图和序列图都表示出了对象间的交互作用,但是它们侧重点不同。序列图清楚地表示了交互作用中的时间顺序,但没有明确表示对象间的关系。协作图则清楚地表示了对象间的关系,但时间顺序必须从顺序号获得。序列图常常用于表示方案,而协作图用于过程的详细设计。一、协作图......
  • FlowUs息流:新媒体运营者的智能协作解决方案
    新媒体和自媒体运营者在日常工作中经常面临信息管理复杂、创意记录不便、团队协作效率低等痛点。FlowUs作为一款多功能的协作工具,能够针对性地解决这些问题。FlowUs息流是一款专为新媒体从业者设计的协作文档工具,它具备以下功能特色:中文界面优化:FlowUs息流提供中文界面,针......
  • Git操作指南:多人协作提交代码的规范
    操作指南以TortoiseGit以例,多人或多台电脑之间同步协作少用gitpull,而是要通过以下方法右键点击gitsync,选择Fetch&Rebase等待Fetch完之后,在弹出来的选项中选择Rebase在Rebase窗口,点击StartRebaseFetch这步可以换成pull吗?因为rebase的时候,也是要merge的,不如提前me......
  • 美团多场景多任务学习论文《HiNet: Novel Multi-Scenario & Multi-Task Learning with
    模型结构模型主要包含场景抽取层和任务抽取层(上图A):场景抽取层场景抽取层主要包括了场景共享专家(Scenario-sharedexpert)模块、当前场景特有专家(Scenario-specificexpert)模块以及场景感知注意力网络,通过这三部分的信息抽取,最终形成了场景层次的信息表征场景共享专家就是一......
  • WCP知识协作系统v5.1.6版本-更新介绍
    下载地址腾讯微云https://share.weiyun.com/wTfASY76新版本功能随着WCP知识管理系统v5.1.6版本的发布,我们为您带来了一系列旨在提升用户体验、增强智能对话能力以及优化系统性能的更新。此版本不仅修复了多项已知问题,还引入了多项新功能,确保您的知识管理之旅更加高效、流畅。......
  • 有没有好用的供应商协同软件,能实现文件的便捷协作?
    制造业供应商间文件协作非常频繁,而频繁的文件协作也是保证业务有效开展的基础,对于确保生产流程的顺畅和高效至关重要。以下是一些常见的制造业供应商文件协作的例子:采购订单和合同:采购订单是供应商和制造商之间最基本的文件协作之一。它明确了采购的物料、数量、价格、交货日期......
  • Windows系统使用Docker部署Focalboard团队协作工具详细流程
    文章目录前言1.使用Docker本地部署Focalboard1.1在Windows中安装Docker1.2使用Docker部署Focalboard2.安装Cpolar内网穿透工具3.实现公网访问Focalboard4.固定Focalboard公网地址前言本篇文章将介绍如何使用Docker本地部署Focalboard项目管理工具,并且结合cp......
  • HR招聘测评,如何判断候选人的团队协作能力?
    什么是团队协作能力?团队协作能力,说的是在集体环境中,能同他人协同工作,为追求共同的目标而努力,其中包括沟通,表达,协调,尊重,信任,责任共担等一系列综合素质要求。良好的团队协作能力,可以促进效率提升,激发团队成员的热情,创造力,能确保任务质量和效率。对于企业和团队来说,都希望招聘进......
  • CAMEL AI agent——多角色互动协作完成任务
    这段代码是一个模拟对话系统,使用了OpenAI的模型进行对话。它包括定义了一个CAMELAgent类,用来管理对话消息的存储和更新,以及模拟用户和助手的交互过程。该代码通过系统消息模板和预设任务来创建角色和任务提示,然后根据这些提示生成系统消息。接着创建助手和用户的CAMELAgent实例,并......
  • Django与前端框架协作开发实战:高效构建现代Web应用
    title:Django与前端框架协作开发实战:高效构建现代Web应用date:2024/5/2220:07:47updated:2024/5/2220:07:47categories:后端开发tags:DjangoREST前端框架SSR渲染SPA路由SEO优化组件库集成状态管理第1章:简介1.1Django简介Django是一个高级的PythonWeb......