存储块的删除与状态查询

目录

存储块的删除

设计实现


存储块的删除

仅需删除任务列表所有任务无需在意空闲存储块

设计实现

  • 存储块的删除(清空过程中可能有任务就绪,需执行一次调度)
  • 存储块的状态查询(当前存储块的计数、允许的最大计数、每个存储块的大小、当前等待的任务计数)

tMemBlock.c

#include "tinyOS.h"/* 存储块初始化函数 */
//参数:存储块,存储块分配空间的起始地址,存储块的大小,存储块的数量
void tMemBlockInit(tMemBlock *memBlock, uint8_t *memStart, uint32_t blockSize, uint32_t blockCnt)
{uint8_t *memBlockStart = (uint8_t *)memStart;									//存储空间的起始地址uint8_t *memBlockEnd = memBlockStart + blockSize * blockCnt;	//存储空间的结束地址//对存储空间进行划分时,划分的每一个存储块的大小会作为链表的结点插入链表中,这个链表结点会占用存储块开始的一部分空间,所以要求blockSize不能小于结点大小if(blockSize < sizeof(tNode)){return;}tEventInit(&memBlock->event, tEventTypeMemBlock);memBlock->memStart = memStart;memBlock->blockSize = blockSize;memBlock->maxCount = blockCnt;tListInit(&memBlock->blockList);//初始化存放存储块的链表//从存储区的起始地址,依次划分各个存储块while(memBlockStart < memBlockEnd)//从开始去找到尾部{tNodeInit((tNode *)memBlockStart);//对每一个存储块是要它最开始的存储区作为一个结点,进行初始化tListAddLast(&memBlock->blockList, (tNode *)memBlockStart);//将存储块加到存储块链表中memBlockStart += blockSize;//指针前移}
}/* 存储块获取函数 */
//参数:存储块,用于获取存储块时将存储块存入其中的指针,最大的等待计数
uint32_t tMemBlockWait(tMemBlock *memBlock, uint8_t **mem, uint32_t waitTicks)
{uint32_t status = tTaskEnterCritical();if(tListCount(&memBlock->blockList) > 0)//是否有空闲存储块{*mem = (uint8_t *)tListRemoveFirst(&memBlock->blockList);//从列表头部移出一个存储块tTaskExitCritical(status);return tErrorNoError;//返回没有错误}else{tEventWait(&memBlock->event, currentTask, (void *)0, tEventTypeMemBlock, waitTicks);//任务在事件控制块上等待tTaskExitCritical(status);tTaskSched();//切换到其他任务运行*mem = currentTask->eventMsg;//取出分配到的存储块return currentTask->waitEventResult;//返回等待结果}
}/* 存储块无等待获取函数 */
uint32_t tMemBlockWaitGet(tMemBlock *memBlock, void **mem)
{uint32_t status = tTaskEnterCritical();if(tListCount(&memBlock->blockList) > 0){*mem = (uint8_t *)tListRemoveFirst(&memBlock->blockList);tTaskExitCritical(status);return tErrorNoError;}else{tTaskExitCritical(status);return tErrorResourceUnavailable;//返回资源不可用}
}/* 存储块释放函数 */
void tMemBlockNotify(tMemBlock *memBlock, uint8_t *mem)
{uint32_t status = tTaskEnterCritical();if(tEventWaitCount(&memBlock->event) > 0)//是否有任务在事件控制块上等待{tTask *task = tEventWakeUp(&memBlock->event, (void *)mem, tErrorNoError);//移出一个任务if(task->prio < currentTask->prio)//判断优先级{tTaskSched();}}else{tListAddLast(&memBlock->blockList, (tNode *)mem);//将存储块插入空闲存储块列表}tTaskExitCritical(status);
}/* 存储块状态查询函数 */
void tMemBlockGetInfo(tMemBlock *memBlock, tMemBlockInfo *info)
{uint32_t status = tTaskEnterCritical();info->count = tListCount(&memBlock->blockList);info->maxCount = memBlock->maxCount;info->blockSize = memBlock->blockSize;info->taskCount = tEventWaitCount(&memBlock->event);tTaskExitCritical(status);
}/* 存储块删除函数 */
uint32_t tMemBlockDestroy(tMemBlock *memBlock)
{uint32_t status = tTaskEnterCritical();uint32_t count = tEventRemoveAll(&memBlock->event, (void *)0, tErrorDel);tTaskExitCritical(status);if(count > 0)//判断是否有任务就绪{tTaskSched();}return count;
}

tMemBlock.h

#ifndef __TMEMBOLCK_H
#define __TMEMBOLCK_H#include "tEvent.h"/* 存储块结构 */
typedef struct _tMemBlock
{tEvent event;				//事件控制块void *memStart;			//存储区的起始地址uint32_t blockSize;	//每个存储块的大小uint32_t maxCount;	//最大存储块数量tList blockList;		//存储块列表
}tMemBlock;/* 存储块状态查询结构 */
typedef struct _tMemBlockInfo
{uint32_t count;			//当前存储块的计数uint32_t maxCount;	//允许的最大计数uint32_t blockSize;	//每个存储块的大小uint32_t taskCount;	//当前等待的任务计数
}tMemBlockInfo;void tMemBlockInit(tMemBlock *memBlock, uint8_t *memStart, uint32_t blockSize, uint32_t blockCnt);
uint32_t tMemBlockWait(tMemBlock *memBlock, uint8_t **mem, uint32_t waitTicks);
uint32_t tMemBlockWaitGet(tMemBlock *memBlock, void **mem);
void tMemBlockNotify(tMemBlock *memBlock, uint8_t *mem);
void tMemBlockGetInfo(tMemBlock *memBlock, tMemBlockInfo *info);
uint32_t tMemBlockDestroy(tMemBlock *memBlock);#endif

app.c

#include "tinyOS.h"
#include "string.h"//定义任务,分别为它们配备独立的堆栈空间
tTask tTask1;
tTask tTask2;
tTask tTask3;
tTask tTask4;
tTaskStack task1Env[1024];
tTaskStack task2Env[1024];
tTaskStack task3Env[1024];
tTaskStack task4Env[1024];uint8_t mem1[20][100];//20个存储块,每个块是100字节
tMemBlock memBlock1;//定义任务要执行的功能
int task1Flag;
void task1Entry(void *param)
{uint8_t *mem;tMemBlockInfo info;tSetSysTickPeriod(10);//初始化tMemBlockInit(&memBlock1, (uint8_t *)mem1, 100, 20);tMemBlockGetInfo(&memBlock1, &info);for(int i = 0; i <20; i++){tMemBlockWait(&memBlock1, (uint8_t **)&mem, 0);}tMemBlockWait(&memBlock1, (uint8_t **)&mem, 0);for(;;)//任务里是for的死循环{task1Flag = 0; tTaskDelay(1);task1Flag = 1;tTaskDelay(1);}
}int task2Flag;
void task2Entry(void *param)
{int destroy = 0;for(;;){task2Flag = 0;tTaskDelay(1);task2Flag = 1;tTaskDelay(1);if(!destroy){tMemBlockDestroy(&memBlock1);destroy = 1;}}
}
int task3Flag;
void task3Entry(void *param)
{for(;;){task3Flag = 0;tTaskDelay(1);task3Flag = 1;tTaskDelay(1);}
}
int task4Flag;
void task4Entry(void *param)
{for(;;){task4Flag = 0;tTaskDelay(1);task4Flag = 1;tTaskDelay(1);}
}/* 应用任务初始化函数 */
void tInitApp(void)
{//最后一个参数:传堆栈末端地址,因为堆栈是向下生长的,初始堆栈地址是堆栈空间最后一个单元地址的末端tTaskInit(&tTask1, task1Entry, (void *)0x11111111, 0, &task1Env[1024]);tTaskInit(&tTask2, task2Entry, (void *)0x22222222, 1, &task2Env[1024]);tTaskInit(&tTask3, task3Entry, (void *)0x22222222, 1, &task3Env[1024]);tTaskInit(&tTask4, task4Entry, (void *)0x22222222, 1, &task4Env[1024]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在IDEA一个窗口中导入多个项目

一般在IDEA窗口中想导入一个新项目&#xff0c;会提示我们在当前窗口还是新窗口。如果选新窗口&#xff0c;就会新打开一个窗口&#xff0c;此时新窗口里面只有新导入的项目。 而为了浏览起来更方便&#xff0c;需要实现在IDEA一个窗口中导入多个项目。具体步骤如下&#xff1…

SQL 实战:基于经纬度的距离计算与位置查询

在位置服务&#xff08;LBS&#xff09;系统中&#xff0c;基于地理位置查询和距离计算是核心功能之一。例如&#xff1a; 查找附近的商铺、加油站或医院。计算两点之间的实际直线距离。筛选出指定范围内的用户或设备位置。 MySQL 提供了多种方式实现地理位置查询&#xff0c…

SpringCloudAlibaba技术栈-Higress

1、什么是Higress? 云原生网关&#xff0c;干啥的&#xff1f;用通俗易懂的话来说&#xff0c;微服务架构下Higress 就像是一个智能的“交通警察”&#xff0c;它站在你的网络世界里&#xff0c;负责指挥和调度所有进出的“车辆”&#xff08;也就是数据流量&#xff09;。它的…

现代图形API综合比较:Vulkan DirectX Metal WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

工业大数据分析算法实战-day19

文章目录 day19讨论范畴介绍知识工程 知识沉淀方法的维度模型模型要素维度传感器异常报警异常预警的范式&#xff1a;特征量-征兆量-研判规则健康评估的范式&#xff1a;劣化度-健康度-综合评价故障类型研判范式&#xff1a;特征量-证据/现象-推理逻辑故障处理效果监控范式&…

轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片

轮胎识别数据集&#xff0c;可对生产流水线里的轮胎图片标注&#xff0c;支持yolo&#xff0c;coco json&#xff0c;voc xml格式的标注&#xff0c;一共785张采集图片 数据集分割 训练组90&#xff05; 706图片 有效集6% 46图片 测试集4% 33图片 预处理…

【RabbitMQ的死信队列】

死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false)&#xff0c;并且在消费后&#xff0c;向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…

YOLOv10目标检测-训练自己的数据

yolov10 https://github.com/THU-MIG/yolov10?tabreadme-ov-file 1. 数据集 模型的建立需要收集图片并且进行标注。YOLOv10标注的文件格式如下&#xff08;每张图片对应一个标签文件&#xff09;&#xff1a; 0 0.441753 0.815461 0.061021 0.042763 1 0.395895 0.759868 …

《机器学习》——KNN算法

文章目录 KNN算法简介KNN算法——sklearnsklearn是什么&#xff1f;sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors&#xff0c;通过寻找k个距…

如何在 Ubuntu 22.04 上安装和使用 Composer

简介 如果你是一名 PHP 开发者&#xff0c;想要简化你的项目依赖管理&#xff0c;那么 Composer 是一个必不可少的工具。Composer 可以简化包管理&#xff0c;并允许你轻松地将外部库集成到你的项目中。 本教程将向你展示如何在 Ubuntu 22.04 操作系统上安装 Composer&#x…

139.《python中的正则详解》

文章目录 什么是正则正则表达式语法正则demo1.匹配模式2.finditer3.正则分组4.非捕获组5.分组的引用6. 正则替换7.正则切割7.正则「或」7.枚举取反 面试题 前言: 拉开差距的不是上班的8小时,而是下班后的16小时,同志们,加油,卷起!!! 什么是正则 1.正则表达式是一种高级文本处理…

大语言模型(LLM)中大数据的压缩存储及其重要性

在大型语言模型&#xff08;LLM&#xff09;中&#xff0c;KV Cache&#xff08;键值缓存&#xff09;的压缩方法及其重要性。 为什么要压缩KV Cache&#xff1f; 计算效率&#xff1a;在生成文本的过程中&#xff0c;每个生成的token都需要与之前所有的token的键值&#xff…

『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释

评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释 文章目录 一. ELO Rating大模型的elo得分如何理解1. Elo评分的基本原理2. 示例说明3. 大模型中的Elo得分总结3个模型之间如何比较计算,给出示例进行解释1. 基本原理扩展到三方2. 示例计算第一场: A A…

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及&#xff0c;即便是零编程基础或基础薄弱的用户&#xff0c;也可以借助AI完成许多技术任务。然而&#xff0c;要高效地使用AI完成编程任务&#xff0c;关键在于如何清晰表达需求&#xff0c;并逐步引导AI实现目标。 在本文中&#xff0c;我们将通过开发…

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容&#xff0c;它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型&#xff0c;以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源&#xff0c;请执行以下操作&#xff1a; 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录&#xff08;例如&#xff0c;深色 UI 主题或本地化字符串的不同图像&#xff09;。 依赖项和目录设置 要访问多平台项目中的资源…

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式&#xff08;工作队列&#xff09;10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 10.5 订阅模式广播模式路由模式主题模式&#xff08;通配符模式&#xff09; 10.6 消息确认机制1…

Excel for Finance 07 `FV PV` 函数

Excel 的 FV 函数用于计算一笔投资在未来的价值&#xff0c;基于固定的利率和定期付款。这是一个金融函数&#xff0c;常用来分析储蓄计划、贷款、或投资的增长。 语法&#xff1a; FV(rate, nper, pmt, [pv], [type])参数说明&#xff1a; rate&#xff08;必需&#xff09;&…

React(二)——注册页/登录页/Reducer/

文章目录 项目地址一、使用Yarn安装所有环境二、文件结构以及路由配置三、登录和注册3.1 注册页面3.1.1 静态页面3.1.2 表单提交useSate3.2 登录页面3.3 admin 的登录页面四、关于auth登录和注册的Reducer4.1 authReducer创建4.2 根rootReducer的创建4.3 创建和配置Redux的stor…

每天五分钟深度学习框架pytorch:越来越深的卷积神经网络模型VGG

本文重点 前面我们使用pytorch搭建了卷积神经网络LeNet-5,AlexNet,本文我们学习卷积神经网络VGG,VGG相比于前面的两个神经网络而言比较深,我们知道网络模型越深那么就难以训练,但是VGG效果比较好。 Vgg使用了更小的滤波器,同时使用了更深的网络结构,AlexNet只有8层网络结…